1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
855 名前:854 [2007/10/02(火) 19:31:26 ] すいません、解決しました。 数値を入力すれば良かったんですね。 ありがとうございます。 でも >>848-849 のように>>839 のコンパイラでうまくいかないのはなぜなのでしょうか? 実際に使用するのはFortran77なので 77に準拠したコンパイラを使いたいのですが。
856 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:53:39 ] >>855 何をやったのか どんな結果になってうまくいかなかったのか エラーメッセージが出たらその内容 くらい書かないと「しらねーよ」としか答えられない。
857 名前:デフォルトの名無しさん [2007/10/02(火) 22:06:47 ] >何をやったのか >どんな結果になってうまくいかなかったのか >エラーメッセージが出たらその内容 全部>>839 に書いてあるのですが・・・
858 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:04:32 ] >>857 「コンパイルに失敗しました」と表示されたときに CPadの下の方のメッセージウィンドウに何か表示されてない?
859 名前:デフォルトの名無しさん [2007/10/03(水) 11:42:56 ] >>858 ■C:\Documents and Settings\....\Fortran> ftn77 /link ttt.for [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998] Licensed to: FTN77 Personal Edition Department: Non-commercial use only 0001) !----- Ex1_1: 3種類の平均値 ----- 0002) PROGRAM Example_1_1 *** Unexpected continuation line (have you got more than 19?) 0007) PRINT*, av1, av2, av3 0008) END *** Non-blank label field in continuation line 0008) END 0009) *** Unexpected end of file (END statement assumed) 3 ERRORS [<MAIN@>FTN77 Ver 4.03] *** Compilation failed ^C というエラーが出ています。 どうすればいいんでしょうか?
860 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:51:10 ] >>859 1から6カラムまで開けろや!
861 名前:デフォルトの名無しさん [2007/10/03(水) 12:34:36 ] >>860 すいません、どういう意味ですか? 開けるというのは何を開けるのですか?
862 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 18:12:30 ] 言っちゃ何だが、FORTRANの文法をよく勉強したほうが いいんじゃないか? 自分のしたいことをコード化できないようじゃ理論ギャップ があるのかバグがあるのか判断できないじゃまいか。
863 名前:デフォルトの名無しさん [2007/10/03(水) 18:14:39 ] 勉強はするつもりです。 だからとりあえずコンパイラがちゃんと動くしたいのです。
864 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 18:42:19 ] じゃあ、エラーメッセージ読んで考えろよw
865 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 03:45:16 ] >>861 >>843 どんな入門書でも最初の数ページ以内に書いてあるような基本的なことだぞ。 ちゃんとしたプログラムが書けなきゃコンパイラがちゃんと動くかどうかも確認できないぞ。
866 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:29:36 ] >>865 Fortran90と混同しているから、教えるのはかなり大変だぞwwww 教育者としての真価が問われる。 神化しないと切れるだろうwwwwwwwwwww
867 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 03:23:05 ] もやすみちゃん
868 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 01:50:10 ] 関数をサブルーチンの引数とすることはできるのでしょうか? サブルーチンの引数として被積分関数や積分範囲等を設定できればと思っています。 どなたかわかる方がいらっしゃいましたら、ご教授いただければと思います。
869 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 09:45:37 ] >>868 制限付きでできる。 external 指定をすればよろし。マニュアル味噌。
870 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 13:13:54 ] >>869 868です。ご返信ありがとうございます。 EXTERNALの指定で無事うまくいきました。 途中コンパイルがなかなか通らずどうしたものかと頭を抱えましたが、 「EXTERNALの指定でうまくいく!」という道筋を示していただけたおかげで、エラーの原因を他のところに絞り込むことができました。
871 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 11:56:52 ] 転置行列を書くために program ex2_19 implicit none integer n, i, j real(8) , allocatable :: c(:,:),ct(:,:) read(*, *) n allocate(c(n, n)) call random_seed call random_number(c(:,:)) write(*, *) c allocate(ct(n,n)) do i = 1, n do j = 1, n c(i, j) = ct(j, i) enddo enddo write(*, *) ct(:, :) end program ex2_19 というプログラムを書いたのですがどうしても出力結果が転置行列になりません。 どうしてでしょうか?誰か親切な方お願いします。
872 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 12:58:33 ] >>871 代入文をよく見直せ。
873 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 16:23:34 ] >>871 ct = transpose( c ) でもできる。
874 名前:871 mailto:sage [2007/10/08(月) 18:01:42 ] >>872 c(i, j) = ct(j, i) のところでしょうか?
875 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 19:11:47 ] c が元の行列 ct が転置行列 だよな?
876 名前:871 mailto:sage [2007/10/08(月) 20:18:58 ] >>875 そうです。 cは適当に乱数で決定されるようにしました。
877 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 22:50:50 ] > c(i, j) = ct(j, i) c(i, j) に ct(j, i) の内容を代入
878 名前:871 mailto:sage [2007/10/09(火) 00:23:13 ] >>877 わかりました! なんたる初歩的ミス…、頭の悪い質問ですみません。 ありがとうございました。
879 名前:デフォルトの名無しさん [2007/10/15(月) 17:14:30 ] K=0 ← こっちが前? DO 100 I=1,10 K=K+I 10 CONTINUE WRITE (6,100) K 100 FORMAT(1H ,i5) ← こっちが前?
880 名前:デフォルトの名無しさん [2007/10/15(月) 17:16:09 ] プログラムの「前」ってどっちですか? K=0 ← こっちが前? DO 100 I=1,10 K=K+I 10 CONTINUE WRITE (6,100) K 100 FORMAT(1H ,i5) ← こっちが前?
881 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 17:23:19 ] マルチすんなハゲ
882 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 18:36:36 ] >>879 前とは先頭のほうだw
883 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:11:01 ] googleg G| o o |g | L | \_e__/ <ぐぐれかす
884 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 02:22:47 ] 誘導され >>57 あたりを読みました FTN95をインストールしました。 plato3(日本語不使用)でコンパイル実行可能でした ↓ fcpadを利用しては出来ないですか? コンパイラパス C:\Program Files\Silverfrost\FTN95\ftn95.exe と入力 コンパイルは通るもののexeファイルが生成されず おそらく設定の実行付近をいじると出来るのか?と思っていますが 誰か、ご指導願います・・・。
885 名前:884 mailto:sage [2007/10/16(火) 02:40:35 ] 原因は分かりました。 が、解決方法が分からないので教えていただきたいのですが /LINKがプログラム名の前に入っているため生成が出来ないようです。 【現在】ftn95 /LINK file.f となってしまう 【解決】ftn95 file.f /LINK としたい 解決方法分かる方よろしくお願いします。
886 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 02:44:09 ] >>884 >>355 fcpadは自由形式のプログラム編集には使えない(向かない)けどな
887 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:47:42 ] 割り算の結果がうまく表示されない現象に悩まされています。 integer a,b character c write(*,*)'計算式間にスペースを入れて入力' read(*,*)a,c,b select case(c) case('+') write(*,*)'=',a+b 省略 case('/') write(*,*)'=',a/b endselect stop end
888 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:33:51 ] >>887 a,bをINTEGERで宣言しているので、その割り算は切り捨てになる。
889 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:04:30 ] 結果自体が表示されないんですが…。 realで宣言しても同じです 割り算以外の演算は問題なしです
890 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 17:37:05 ] >>889 どのようにおかしいか、出力例も交えて、もっと情報を提供しなさい。 >>887 の内容では誰も答えられない。
891 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 17:51:28 ] >>887 やってみた。 例えば、 4 / 2 と入力しても、case('/')に入らない。 もし case default を用意したら、そこに入る。 代わりに 4 "/" 2 あるいは 4 '/' 2 と入力したら = 2 を返した。
892 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:00:27 ] ゲイツにきけwwwwwww
893 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:08:28 ] 並び順番 READ 文の規則 ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/lr/lr10_03_01_02.htm >実行中に斜線 (/) が現れると,READ 文は終了し,残りの入力並び項目は変更されないままになります。
894 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:46:18 ] 誰か、Fortranで(いろんな意味で)生産性の高いコードを書くコツみたいの、挙げてくれ Fortranユーザって他の言語に比べてそういうのあんまり意識しなさそうだけど
895 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:59:39 ] >>894 つ www.mri-jma.go.jp/Project/mrinpd/coderule.html
896 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:43:34 ] 速度を犠牲にせずに生産性を上げるってのはなかなか難しいね
897 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 23:12:52 ] >>891 >>893 ありがとうございました。 FORTRAN学びはじめなので細かいところが分からず
898 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 14:31:50 ] FortranのIDEみたいな開発環境あるんでしょうか?
899 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:35:15 ] >>898 色々あることはある。 どういうのが望みだ?
900 名前:898 mailto:sage [2007/10/22(月) 22:47:23 ] あるんですね。やっぱりFortranコードといえど規模が大きくなるとそういうのは必要ですよね。 Visual Studioみたいなデファクトスタンダートのようなものはあるんでしょうか? >どういうのが望みだ? 今のとこviでカリカリやってるんですが、とりあえず制御文などのチェック機能(自動ハイライトとか)や行番号の管理とかあると助かります。 (でもこの程度だとIDEなんて大げさなものでなくとも、気の利いたエディタならできるのかも・・・) 規模が大きくなるとサブルーチンの管理とか大変ですよね 皆さんどうやってるんでしょうか?
901 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:10:55 ] >>900 Intel Visual Fortran は visual studio に対応している。 昔はVisualStudioを別売りで買う必要があったが、今は制限版がIntelVisualFortranに付属している。 LaheyのFortranやSilverFrostのFTN95、PGIのVisuialFortranもVisualStudioに対応している。 ttp://www.lahey.com/ ttp://www.silverfrost.com/ ttp://www.pgroup.com/ 他の商用コンパイラメーカーも大抵自作の統合環境をつけている。 EmacsもFortranModeがあってシンタックス・カラーリングとかしてくれる。 EclispのFortran環境にはphotranというのがある。 www.eclipse.org/photran/ 他にもフリーの環境はある。 昔ロシア人が貧乏人向けにg77とフリー統合環境と廃版英語Textbookを束ねて配っていたのだが、 最近はもう時代遅れか・・・
902 名前:898 mailto:sage [2007/10/23(火) 02:45:05 ] >>901 ありがとうございます。 Visual Studioに対応してるとは知りませんでした。ちょっとやってみます。 そういえばこれ、当然ながらWindowsでの開発だと思いますが、 Visual C++みたいな独自拡張とかはあるんでしょうか? せっかく作ったのにLinuxで動かないとなったら困りますよね・・
903 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 02:51:27 ] 色分けやdo-enddoの自動インデントならvimでもやってくれますね。
904 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:46:22 ] >>902 .NET対応版とか、Windows API 呼び出しとかしなければ、常識的な範囲でOK。
905 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 15:25:50 ] vimのfotranの色づけはデフォルトだとイマイチなんすけど ドキュメント読むの面倒なんで、お勧め設定晒してもらいませんか?
906 名前:905 mailto:sage [2007/10/23(火) 15:26:50 ] ×もらいませんか ○もらえませんか
907 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:11:51 ] Fortran90ではコメント「c」やCOMMONは使えないんですか? 77の(ほぼ)スーパーセットと聞いたんですが、やってみたら駄目でした。 てことは、77のコードをポートするには一般に結構な書き換えを要する、ってことですかやっぱ
908 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:17:28 ] >>907 先頭cコメントを使うためには、固定形式で記述する必要がある。 中途半端に自由形式を導入していないか? 回答者のために、コンパイラー名を書こう。
909 名前:907 mailto:sage [2007/10/23(火) 18:36:30 ] >>908 レスありがとうございます。 >先頭cコメントを使うためには、固定形式で記述する必要がある。 そうなんですか。Intel Fortran 9.0なのですが、 固定形式か自由形式かはどうやって決まるんですか? 拡張子(というかsuffix)? COMMONが使えないというのは勘違いでした。 複数行に渡るときの6列目の文字があるせいでした。90だと行末に&なんですね。 結局のところ、「77の(ほぼ)スーパーセット」といのは、77形式できっちり書いた場合の話であって、 90の機能と何でも混ぜていいわけではないんですね。。
910 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 20:44:40 ] >>909 通常は拡張子が .f .for .ftn の場合は固定形式、 .f90 の場合は自由形式と解釈される。 # ifort は .f95 をソースとして認識しない。 コンパイル時のオプションに -fixed / -free を指定することによって強制的にそれぞれ 固定形式/自由形式の指定をすることも出来る。 また、拡張子を大文字(.F .FOR .FTN .F90)にするとコンパイル前にプリプロセッサで前処理される。 > 90の機能と何でも混ぜていいわけではないんですね。 1つのソースに固定形式/自由形式を混ぜてはいけない。 ただし、別々のファイルにすれば混在させることも出来る。
911 名前:907 mailto:sage [2007/10/23(火) 23:48:50 ] >>910 ありがとうございます。非常に勉強になりました。
912 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:21:45 ] High Performance Fortranていう仕様があるようですが、どういうところで使われているんですか? 普通のユーザには縁のないものですか
913 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:04:39 ] >>912 90年代に並列プログラミングを考慮した規格として提案された。 日本のスーパーコンピュータメーカはコンパイラをちゃんと作ったが、 アメリカがやる気を見せず崩壊した。 地球シミュレータでもHPFは動いている。というかHPFはESに要求された仕様の一つだったような。
914 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:13:06 ] >>913 崩壊、ですか・・・ 推進評議会のサイトを見ると、「ユーザが最小限の指示文によってデータの分割配置の方法を 指定すれば、残る作業(計算の分割と通信の生成)をコンパイラが自動的に行う」とありますが、 分散メモリシステムで必要となる領域分割と通信を自動でやってくれる、ということですか? 今はFortran90+MPIという組み合わせが一般的だと思いますが、これよりも良い性能が出るんですか?
915 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 13:22:45 ] >>914 MPIはどちらかというと消極的な理由でデファクトスタンダードになった。 ソフトウェア中心主義の視点からは、MPIはハードウェアの抽象度が低いので、 HPFのほうが上位に立つのだが、現実的にはハードウェアへの依存性が高くて逆転する。 ここに過渡期に実務で使った人の比較意見が載ってる。 ttp://grape.mtk.nao.ac.jp/~makino/articles/future_sc/note031.html#rdocsect36
916 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:03:35 ] >>915 消極的ですか。確かにそんな気もしますね OOPの可能性にwktkするも、性能とのトレードオフに嘆き、手続き型も含めた現実的な方法に帰着する、という話と似てるかも ところでそのサイト見ていつも思うんですが、マ○ノさんてすごい人ですよね ここまでコアな人はなかなかいないと思う
917 名前:912=914=916 mailto:sage [2007/10/24(水) 16:04:56 ] >>915 スイマセン、お礼言うの忘れてました。 どうも有難うございました。
918 名前:デフォルトの名無しさん mailto:age [2007/10/28(日) 19:52:11 ] WRITE文で改行しない標準FORMATを使いたいのですがどうすればよいでしょうか? 具体的には、 WRITE(*,*) 'x = ', x という文を改行なしで表示したいのです。ここで、xはDOUBLEで、 xの大きさによって浮動小数点表示と固定小数点表示をコンパイラが判断して欲しいです。 よろしくお願いします。
919 名前:デフォルトの名無しさん [2007/10/28(日) 22:10:09 ] >>918 改行しないのはFAQ このスレでも何度も出ている。 Fortran90 では、ADVANCE='NO' 数値の大きさでフォーマットを変えるのは G Format これが77時代からある。 サンプル PROGRAM unko IMPLICIT NONE REAL :: x, y x = 0.1 y = 1.234567e11 WRITE(*, '(A, G15.5)', ADVANCE = 'NO') 'x=', x PAUSE WRITE(*, '(A, G15.5)', ADVANCE = 'NO') 'y=', y STOP END PROGRAM unko
920 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:32:38 ] COMMONブロックをモジュールに書き換える作業をしております。その際わからないことがあったので質問させてください。 jjoo.hp.infoseek.co.jp/tips/f90/common_to_module.html のサイトを参考に進めてきました。現在のプログラムの概略は次のような感じです(巨大なため全文ではありませんがご容赦くださいませ) module sub integer i,j end modeule sub program main use sub implicit none call 1 call 2 end program main subroutine 1 implicit none integer i,j (略) end subroutine 2 implicit none integer i,j (略) end この状態でコンパイル及び動作は出来るのですがサブルーチンにおいて変数部を subroutine 1 use sub implicit none (略) end とするとコンパイル時に symbol 'rmax' ai (1) is defined in multiple modules というエラーが出てしまいます。 これはどのように解決したらよいのでしょうか。よろしくお願いします。
921 名前:918 mailto:sage [2007/10/29(月) 23:48:47 ] >>919 欲しい結果が表示されました。ありがとうございます。
922 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 00:56:45 ] >>920 それはエラーメッセージに書いてあるがごとく、複数のモジュールの中で同じシンボル名を 重複して使っているという事だろう。 コモンブロックに当たるモジュールは1個だけ作って、それをUSEで呼び出せばいい。 コモンのときは全副プログラムにコモンを置かねばならなかったが、もジュールは違う。
923 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 14:05:25 ] CHARACTER*(*) HOGE のように、配列数が(*)となっているのはどういう意味なんでしょうか 動的に確保するということでしょうか?
924 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:18:34 ] >>923 HOGEの長さは HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。 HOGEが副プログラムの仮引数の場合、対応する実引数と同じ長さ。 HOGEが関数副プログラムの場合、その関数を使用する側で予め決められた長さ。
925 名前:920 mailto:sage [2007/10/31(水) 05:54:42 ] >>922 遅くなって申し訳ありません。レス有り難うございました。 なるほど、モジュールは一度読み込めばよいと言うことだったんですか。 そこで、サブルーチン中のuse文を消してみたところ そのエラーは吐かなくなりました。 その代わり x0(n)=2.d0*rn 1 Unexpected array Reference at (1) と言ったようなエラーが出るようになってしまいました。エラー文では配列の参照がおかしいみたいなことを書いてますがどのようなことなのでしょう。 内容が同じ物をcommon文としてかいた時は問題なく動作したので 配列の宣言がおかしいってこともないと思うのですが・・・
926 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 10:58:31 ] >>923 FORTRAN90以前では、基本的に変数は参照渡しで、実際には先頭番地しか渡していない。 また呼び出し側と呼び出される側での引数の整合性もチェックしていない。 さらに実行時にも、デバッグオプションをつけない限り、はみだしチェックのようなことはやってない。 したがって、副プログラム側では、引数の大きさはどうでもいいことになる。 このためFORTRAN66あたりまでのプログラムでは、配列にも適当な長さを指定するのが伝統だった。 (文字列は、まだ存在しなかったので・・・というか整数型に突っ込んでいた・・・・質問から外れるが) というわけで、FORTRAN77規格で、それを明示的に指定した書式が(*)だ。(とおもうw) 長さ『*』は、『適当』という意味だ。文字列のみならず数値型配列の最後の要素にも使える。 Fortran90以後は、色々コンパイル時のチェックが入るようになって、PASCALみたいでうぜぇという人達もいる。 最近のスクリプト言語は、型にゆるいのが多いが、昔のFORTRANに先祖がえりしているのである(嘘w
927 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:01:20 ] >>925 モジュールの宣言は1個で、USEは使うルーチンごと毎回だ。 カスケード的にUSEしているなら、深いほうで1回読んでおけばいい。
928 名前:923 mailto:sage [2007/10/31(水) 18:13:56 ] どうもありがとうございます。 >>924 >HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。 HOGEをHOGE="hoge"と変数にしたら駄目でした。定数しか駄目なんですね。 >>926 ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね? 例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・
929 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:21:08 ] >>928 >ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね? >例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・ いや、別に10のままでも、本質的には何も変わらない。 どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。 あと、多次元配列の場合、最後の次元以外は一応意味があるので、ちゃんと指定しないといけない。 ただ、FORTRAN77では整合寸法を別に引数で送るのが適切とされている。
930 名前:デフォルトの名無しさん [2007/11/01(木) 01:12:57 ] 何が原因かわからないのですいませんがどこが間違ってるのかご指摘お願いします. 縦300横10の配列を読み込んで,ただの列にしたいだけなんです. エクセルを使えば,FORTRAN使うほどのことでもないのでしょうか? それも含めて教えてください. program hairetu open(30,file='a.dat',status='old') do 10 j=1,10 read(30,*)(b(i,j),i=1,300) 10 continue close(30) open(20,file='b.dat',status='new') do 50 i=1,300 do 40 j=1,10 write(20,*)b(i,j) 40 continue 50 continue close(20) stop end
931 名前:930 [2007/11/01(木) 01:19:49 ] 付け足しです.このようなエラーメッセージが出ています. 0004) read(30,*)(b(i,j),i=1,300) *** B is a function name - a function reference is not allowed in a READ statement list *** Invalid input/output list 2 ERRORS
932 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:20:00 ] >>930 > どこが間違ってるのかご指摘お願いします. ・配列 b の宣言がない。 ・「縦300横10」のデータなら読み込み時の i, j の終値が逆。 > エクセルを使えば,FORTRAN使うほどのことでもないのでしょうか? これくらいの処理ならExcelでもなんでも結果が出せればおk ということで。 gawk "{ for (i=1; i<=10; i++) print $i }" a.dat > b.dat
933 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:36:36 ] ちなみにスレ違いだがWindows 2000以降なら以下のようなバッチファイルでも処理できる。 @echo off if exist b.dat del b.dat for /F "delims=" %%r in (a.dat) do ( for %%f in (%%r) do echo %%f >> b.dat )
934 名前:923 mailto:sage [2007/11/01(木) 13:21:29 ] >>929 >どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。 そうなんですか。ちょっと混乱してきたのですが ということは、仮引数の配列数は結局は関係ないということですか? >いや、別に10のままでも、本質的には何も変わらない。 では仮引数の配列数を明示指定するのは、単なる慣習みたいなもの、ってことですか?
935 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:14:19 ] >>934 そういえなくも無い。1960年代のプログラムを見ると、任意長の配列がよく大きさ10で宣言されている。 ただテキストの場合は、本当に10個の要素だと思うがw SUBROUTINE ZERO(n, a) DIMENSION a(10) DO 10 i = 1, n a(i) = 0.0 10 CONTINUE END 見たいなのがよく使われていた。 これとまぁ等価なのが DIMENSION a(*) で、もっと上品な書き方は整合配列を用いて DIMENSION a(n) とやる方法。後者をお奨めする。だがFortran90で書くことをもっとお奨めするw 先頭番地しか渡していなので、呼ぶ側では、配列の途中から渡したりできる。 REAL a(100) CALL zero(100, a) CALL zero(50, a(51)) --->Fortran90での a(51:100) = 0.0 普通のテキストには書いてないが、77までのプログラムでは、こういうのを知らないとまともに プログラムが読み書きできない。昔は誰も教えてくれないので徒弟制度で叱られながら学ぶか、 他人のコードを読んで泣きながら覚えるしかなかった。 漏れの読んだテキストで、そういう事が書いてあったのは、この本くらいか。 ttp://www.star.le.ac.uk/~cgp/prof77.html (他の本にも書いてあったが、単に読んだ時のスキルが足りなくて理解できなかったのかもしれないがw)
936 名前:923 mailto:sage [2007/11/02(金) 14:17:22 ] >>935 なるほど・・・よくわかりました。そういうコアな話を聞ける人が周りにいないもので、とても勉強になります。 丁寧な解説ありがとうございました
937 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:04:31 ] >ただテキストの場合は、本当に10個の要素だと思うがw これどういう意味ですか? 文字列配列も普通の配列に変わりはないと思うんですが
938 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 18:15:19 ] >>937 テキストは本当に10個に固定の要素を扱っているのではないかという事。 深い意味は無い。
939 名前:937 mailto:sage [2007/11/05(月) 01:33:05 ] 気になったので簡単にテストしてみました。 サブルーチン内で普通に文字列代入する(sub1)のと直接要素に代入する(sub2)のとでは違うようですね。 後者は通常の配列と同様な参照渡しなのに対し、前者は少し違った処理をする、ということでしょうか? implicit integer(i-n) character*3 text1 /'aaa'/ character*3 text2 /'aaa'/ call sub1(text1) write(*,*) text1 call sub2(text2) write(*,*) text2 end subroutine sub1(text) character*2 text text = 'b' end subroutine sub2(text) character*2 text text(1:1) = 'b' end <結果> b a baa
940 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 03:17:08 ] >>939 たぶんサブルーチン側ではtext*2で宣言しているので、 sub1 では text(1:2) = 'b ' の扱いになったんだと思う。 参照渡しなのは変わんないと思う。 text = 'b' は、一文字目は'b'として2文字目以降宣言長まではスペースを補填するのだと思う。
941 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 13:28:20 ] fortranの仕様ってどこが決めてるの? 少なくとも数値計算屋だよね?
942 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:39:48 ] >>941 ttp://www.j3-fortran.org/ いちおう、(コンパイラ、ハードウェア)ベンダー、ユーザー、大学人なんかが入っているはず。 なんだかイギリスが生意気にデカイ面している。 Fortran2008で、Crayのハードウェアに最適化されているCoArrayが規格に入ったのが気に食わない。
943 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:06:31 ] コーエンちゃん早く2003の処理系つくって
944 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 14:40:25 ] >>942 やっぱ向こうじゃNECよりCrayが優先されるんだろうね
945 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:02:52 ] >>944 『向こう』ってなんだよw 欧米コンプレックスの40代の爺さんかよwwww Fortran2008は、本来はFortran95のようにマイナーアップデートのはずなのに、 こういう妙な機能を入れ込ませようとする政治臭の漂うことをやると、信頼性をなくすと思うのだがな。
946 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:42:08 ] HP Fortran で以下の二つを実現することは可能ですか? 1) リトルエンディアン形式のバイナリ出力 2) Intel Fortranのopen(10, 中略, form='binary')に相当するやり方
947 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:14:02 ] >>946 マニュアル嫁 1) リトルエンディアン形式のバイナリ出力 Itanium機では出来る? ttp://docs.hp.com/ja/B3908-90009/ch08s08.html 2) Intel Fortranのopen(10, 中略, form='binary')に相当するやり方 DIRECT ACCESSで1バイトづつ読むというテクニックで切り抜けられる。
948 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:44:30 ] そういやIntel Fortran もようやく ACCESS='STREAM' が使えるようになったな。 これで処理系毎に書き直さなくて済むようになる。
949 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:58:25 ] >>947 ありがとうございます。 1) そういえば、CPUの種類は確認してなかった・・。 たぶんItaniumだと思うんですが、、。 職場行ったら確認して試してみます。 2) これはちょっと大変そうですね。 ヘッダー部、データ部、それぞれで型の違う変数を扱わなければならず、 変換が大変そうです。 4byteの変数を出力する際、1byteずつ逆から出力する必要があるってことですよね・・
950 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:12:25 ] >>949 文字列で読み出して、それをINTEGERやREALやREAL*8とEquivalenceをかけて置けばOK 処理系によって、RECL=1 にしたときに1byteになるものと、1語になるものがある。 たとえばIntelFortranではデフォールトは1語=4バイトだが、オプションで切り替えできる。
951 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:14:51 ] Fortran2003でOPEN( ... ACCESS='STREAM') が規格に入ったので、新しいコンパイラなら先取り導入 されている可能性大。
952 名前:949 mailto:sage [2007/11/11(日) 12:31:09 ] >>950 Equivalence使ったことありませんでした。 マニュアルみたら違う変数で同じメモリ領域を使えるようにする、、ってやつなんですね。 つまり整数1byte型x1,x2,x3,x4がy4,y3,y2,y1と同じメモリ領域になるようにし、 逆から順に1byteずつ出力すればいいってことですね。 RECLに関してはマニュアルを読んでみます。 >>951 'DIRECT'、'SEQUENTIAL'、' POSITION=APPEND' マニュアル見たらACCESS指定子に選択できるのは上記3つだけみたいでした。
953 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:45:48 ] >>949 ,950 fortran90以降でequivalence文を使うのは非推奨。 subroutine trans_endian(str,inte) character(len=1),dimension(4),intent(in) :: str integer,intent(out) :: inte inte=transfer(str(4:1:-1),0) end subroutine trans_endian
954 名前:1/2 mailto:sage [2007/11/11(日) 15:26:51 ] >>953 とこんな感じで整数をエンディアンの自動判別しながら読める。 正直TRANSFERを使うより、EQUIVALENCEの方がすっきりするよな。 F90はソースコードの見かけに流れされすぎ。 SUBROUTINE check_endian() IMPLICIT NONE CHARACTER(LEN = 4) :: ctmp INTEGER :: itmp ctmp = 'ABCD' itmp = TRANSFER(ctmp, itmp) IF ( CHAR( MOD(itmp, 256) ) == 'A' ) THEN qlittle_endian = .TRUE. ELSE IF ( CHAR( MOD(itmp, 256) ) == 'D' ) THEN qlittle_endian = .FALSE. ELSE CALL abort('endian indeterminable') END IF RETURN END SUBROUTINE check_endian !---------------------------------------------------------------------
955 名前:2/2 mailto:sage [2007/11/11(日) 15:27:24 ] !--------------------------------------------------------------------- FUNCTION rd_int32() RESULT(ires) IMPLICIT NONE CHARACTER (LEN = 4) :: tmp INTEGER :: i, io, ires IF (qlittle_endian) THEN DO i = 1, 4 ir_record = ir_record + 1 READ(ir, REC = ir_record, IOSTAT = io) tmp(i:i) END DO ELSE DO i = 4, 1, -1 ir_record = ir_record + 1 READ(ir, REC = ir_record, IOSTAT = io) tmp(i:i) END DO END IF ires = TRANSFER(tmp, ires) RETURN END FUNCTION rd_int32