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/
673 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:56:22 ] >>672 それは 「csv(テキスト)で保存するとExcelの計算式やセルの装飾などの情報が失われるよ」 という警告だがら、関係ない。
674 名前:667 [2007/06/28(木) 12:04:28 ] コピペするとタブ区切りで持っていくはずだけどね
675 名前:657 [2007/06/28(木) 12:33:54 ] メッセージのxx.f:342は、342行目ということだったんですね。 342,343行目は、 STOP END なんですが。。
676 名前:661 [2007/06/28(木) 14:39:50 ] だから前後て書いてるでしょ サブルーチンあるのか?配列の引渡しは、うまくやってるか?
677 名前:672 [2007/06/28(木) 14:56:13 ] >>671 やはり、 was detected (unit=10).id decimal character (the relative position causing an error in a record = 13 ) 3,1.427,0.747 ? error occurs at MAIN__ line 15 loc 000106ec offset 00000044 MAIN__ at loc 000106a8 called from o.s. taken to (standard) corrective action, execution continuing. というエラーになります。 プログラムは implicit none integer,parameter :: imax=24,jmax=4,iimax=3,ijmax=40 real(8),dimension(imax,jmax) :: N,L,M real,dimension(24,4) :: X integer,dimension(24,4) :: K real,dimension(iimax,ijmax) :: A real(8),dimension(3,40) :: B real :: f real(8) :: lambda,omega integer :: i,j,ii,ij open(10,file='danmenseki.csv',status='old') !表1.1を読み込む do ii=1,iimax read(10,*) (A(ii,ij),ij=1,ijmax) end do close(10) です。 >>673 ソフトの問題ではないわけですね。ありがとうございます。
678 名前:657 [2007/06/28(木) 19:45:34 ] >676 ありがとうございます。 全部で546行のソースで、342行目にSTOP、343行目にENDがあります。 その後ろに4つのSUBROUTINEがあります。 配列の引渡しについては、引数を確認しましたが、型・サイズは同じでした。
679 名前:661 [2007/06/28(木) 20:25:40 ] >>678 デバッグモードで確認するかだね。gfortranはできるのかな? gnuだからできると思うけど
680 名前:657 [2007/06/28(木) 21:24:58 ] >>679 ありがとうございます。 コンパイラのデバッグモードって、このオプションのことですか? わけのわからないメッセージが出まくったのですが。困りました。 -fdump-parse-tree Output the internal parse tree before starting code generation. Only really useful for debugging the GNU Fortran compiler itself. これ以外の Options for Debugging Your Program or GNU Fortranは、 runtime用のもののようです。
681 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:29:04 ] >>677 どうもこちらで再現できないから、 うまくいった友達とやらに見てもらった方がいいかもしれん。
682 名前:661 mailto:sage [2007/06/28(木) 21:37:17 ] デバッグは「-g」のはず。 gdb使ってね。 一通りミリ ttp://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html "-fbounds-check"でこけたりして
683 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:21:15 ] まだCVSファイルの問題が解決してないのかw たしか富士通のコンパイラはレコード長の絡みでうるさいので、それかも試練。 入力データの1行の長さはどれくらいだ? すごく長いなら、OPEN文でレコード長を大きくしておけ。 富士通のコンパイラは10年くらい使ってないから、保障しないがw
684 名前:677 [2007/06/30(土) 00:30:41 ] 結局.datファイルで入力することにしました… 出力の方は24×4のはずが96×1で出てしまいますが手作業で直しました。 月曜にまた学校でいろいろ試してみますね。
685 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:21:05 ] >>684 >出力の方は24×4のはずが96×1で出てしまいますが つ 改行コード Windows側で LFのみの改行に対応したエディタか変換ツールを使うヨロシ。
686 名前:デフォルトの名無しさん [2007/06/30(土) 16:58:07 ] >>685 ftpソフトでwin-unix lf-cr+lf対応を使った方が早いと思う。
687 名前:デフォルトの名無しさん [2007/07/01(日) 22:28:27 ] フォートラン初心者です. BLASを使っていろいろ計算しようとしたんですが,内積で何故か良く分からない数値がでます. PARAMETER ( N = 4) REAL*8 e(N)/N*1.0/ inc = 1 WRITE(6,*) DDOT(N,e,inc,e,inc) END 実行結果が 2.25000000 1,1,1,1と1,1,1,1の内積だから4になってほしいんですが・・・ C言語なら少しは分かります. だれかぼすけて
688 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:09:45 ] >>687 適当なので気休めまでに。 REAL*8 e(N)/N*1.0/ これを REAL*8 e(N)/N*1.0d0/ にしてみそ。 コンパイラによっては、単精度4バイト4つ分を頭から詰めているのかもしれない。 別に考えられるのは、関数を直接WRITE文で書き出しているが、一旦変数に入れるのもよろし。 Cと違ってValueでは返さないので、関数をサブルーチンの引数にしたりすると コンパイラによって受け付けたり、受け付けなかったり、暴走したりすることがある。 ただ、Write文だから大丈夫だと思うが。あとf90になってからは、おkのことが多い気が駿河。
689 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:55:33 ] >>687 Intel Fortran Ver.10.026 + MKL 9,1 では、ちゃんと4が出たwww おぬしのコンパイラ環境等は何ぞや。
690 名前:687 [2007/07/02(月) 06:56:16 ] >>688 >REAL*8 e(N)/N*1.0d0/ 変化無しOrz 初期化は上手く行ってるみたいです. それといったん変数に入れても同じ. ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・ >>689 よくわからないんですが適当にHPを漁ってみると 本体:FUJITSU PRIMEPOWER HPC2500 OS:Solaris 8 コンパイラFortran JIS X3001-1:1998 (Fortran95) マニュアルとかのリンクが富士通なので,コンパイラも富士通だと思います コンパイル時は, %frt test.f90 -SSL2 -O0 でやってます スパコンでベクトルの内積一本とか,なにやってんだ俺\(^o^)/
691 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 11:29:11 ] >>690 %frt -SSL2 -O0 test.f90 こうとかwwwww >ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・ これが気になるな。症状的にはサブルーチンの単精度倍精度の割り当て違いっぽいので。 DDOTにもDOUBLE指定が必要な仕様かw IMPLICIT REAL*8 (a-h,o-z) もつけてみるかw
692 名前:デフォルトの名無しさん [2007/07/02(月) 14:26:52 ] pgf90のコンパイルで困っています。 makeを実行すると PGF90-W-0119-Redundant specification for name_size (Size_Class.f90: 101) のようなエラーがでてきます。 これはコンパイルオプションでなんとかできるものなのでしょうか? 教えてください。
693 名前:デフォルトの名無しさん [2007/07/02(月) 16:34:13 ] >IMPLICIT REAL*8 (a-h,o-z) かもね。 ただ、最適化するな。それで答えはどうなる? 最適化の問題か
694 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:12:58 ] >>693 オプション -O0 使ってるから、最適化はして無いだろう。 多分DDOTもdble宣言しておかないと駄目なんだろ。EXTERNALと合わせて。 前にも似たような症状がスレに出ていた希ガス。 この辺は、NEC<<<Fujitsu<Hitachi の順でコンパイラのケツの穴が狭いという 昔の言い伝えにあるように、Fujitsuはコンパイラが宣言にうるさいんだろ。 NECはゆるすぎて、ホモの尻穴のごとく何でもホイホイ容れてしまうのだがwww ところで、おまいら 京速コンピュータがNEC、日立、富士通の三社合同になったことをどう思う? 完全に破滅コースに入ったと思うんだがwwwwwwww
695 名前:デフォルトの名無しさん [2007/07/03(火) 00:16:01 ] >>694 最適化しないというオプションは効いてない場合もある。-Oは書かない。 京速?北海、九州コンピュータに頑張ってもらおう。
696 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:44:22 ] >>695 >北海、九州コンピュータに頑張ってもらおう。 意味分からん。解説よろ。
697 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 04:54:07 ] linpackのMPI版はありませんか?
698 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:07:37 ] >>697 あるべ。
699 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 02:02:05 ] 最近WINDOWS版g95をインストールし問題なく動いていたのですが、 突然エラーが出るようになってしまいました。 g95: installation problem, cannot exec 'as': No such file or directry とでて、コンパイルができなくなっている状態です。 pathは通っていますし、インストールもうまくいったはずなのですが・・・ なにより最近まできちんど動いていたので、全く原因がつかめません。
700 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:03:12 ] >>699 動いていたときと動かなくなった間に、何をしたのかを書かなければ誰にも分からん。 何もしていないというのは無し。 XPだったら復帰ポイントで戻れw
701 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 16:24:12 ] 自宅でfortran77を使うために、CPad for FTN77をダウンロードしたんですが コンパイルして実行すると コンパイルに失敗しました。 ファイル"〜〜test.exe”は存在しません。 と言われるのですがどうすれば解決できますか?
702 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:25:56 ] >>701 バグ取りすれば解決できます。
703 名前:701 mailto:sage [2007/07/06(金) 21:35:33 ] >>702 度々すみません 具体的にどういうことをすればいいんでしょうか?
704 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:38:10 ] >>703 自分の入力したプログラムをじっくり眺めて間違ってるところを直せばいいだけだよ。
705 名前:701 mailto:sage [2007/07/06(金) 23:49:35 ] >>704 学校ではコンパイルも実行もできたやつなんですが… といっても間違いがないとは限らないということでしょうか 簡単なもので試したんですが write(*,*)'test' end でもできませんでした。 下のメッセージに ■C:\〜〜〜〜〜〜〜〜〜\data> ftn77 /link test.f Cannot open authorisation file c:\〜〜〜\ftn77.ser: (文字化けしてる) System error (3): 指定されたパスが見つかりません。 と出てました。 ftn77.exeにつなげてるんですが…。
706 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:03:08 ] >>705 FTN77は日本語の入っていないパスにインストールしろ。
707 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 03:10:21 ] >>701 同じ質問がこのスレだけですでに2,3回出ているw >>65 あたりみろ
708 名前:701 mailto:sage [2007/07/07(土) 12:56:23 ] できましたー! 一番の原因は>>706 さんが言ってることでした 答えてくれた方々、本当にありがとうございました
709 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:45:18 ] 今度質問することがあったら、最初からエラーメッセージをコピペしような。
710 名前:デフォルトの名無しさん [2007/07/08(日) 13:09:06 ] 粘IN/1-T の式をTを0から3まで0.5刻みでとって さらにN=1、2、3、4、5について別々に求めたいのですが、わかりませんどなたかよろしくお願いします
711 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:16:07 ] すいません↑の式は 粘IN30/1-T-n 狽ヘn=1からNまでです
712 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:33:21 ] DO 10 T=0,3,0.5 S=0 WRITE(*,100) T DO 10 N=1,5 S=S+SIN(30*3.14159/180)/1-T-N 10 WRITE(*,101) N, S STOP 100 FORMAT(1H , 'T=', F6.2) 101 FORMAT(1H ,'N=',I2,F12.3) END
713 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:34:10 ] 神です!ありがとう
714 名前:デフォルトの名無しさん [2007/07/09(月) 08:16:24 ] まー>>711 の式が悪いので、本当に計算したいモノと違うだろうな と思うが、ある程度書いて貰ってるから後は自分で変えろ。 おれは712では、ないけど。>>711 を指摘しようと思ったけどヤメタ
715 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:30:43 ] 何時も気になるんだけど、このスレの住人はFORTRAN77とかFORTRAN95とか 明示せずに質問したり、解答したりしてるけど問題に成らないのか?
716 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 02:28:56 ] 回答する分には答えやすい方(主にF95)に勝手に脳内補完するから無問題。 問題になるなら>>1 をよく読んでから質問しろと言いたい。
717 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:49:19 ] >>715 宿題はを聞く奴は違いが分からないw 結局は77になるようだが。 そうでない場合は90で答えて大丈夫だろう。さすがに90処理系はたいがいどこにでもある。
718 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:52:16 ] 77で答えておけばそれより上位でもだいたい問題ない。
719 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:08:26 ] >>694 すごく・・・買vロジェクトです。
720 名前:デフォルトの名無しさん [2007/07/12(木) 01:20:37 ] GNUのfortranって何であんなに遅いの?
721 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 09:40:57 ] >>720 素人が作ってるからでないの? GNU-Cだって倒産した商用コンパイラを引き継ぐまではf2c+gccで、小さなサンプル以外は まともに走ったことが無かったような記憶が。
722 名前:デフォルトの名無しさん [2007/07/13(金) 18:39:06 ] ↓この問題が全くわかりません。 教えてください。 よろしくお願いします。 ...... call rndm0 ( ) ...... a = rndm ( ) ...... b = rndm ( ) このルーチンを使って、乱数を 100 回発生させて それをファイルに書き込む プログラムを作成せよ。それを実行し、ファイルに正しく書き込まれたことを 確認せよ。なお、メインプログラムと独立したファイルにサブプログラムが 書かれている場合は、メインプログラムを違う名前のファイルで作成した後に、 コンパイルすればよい。
723 名前:デフォルトの名無しさん [2007/07/14(土) 10:48:45 ] 自分で調べるのを前提に書く サブルーチンを使ったプログラム書けってことじゃ? PROGRAM HOGE ファイルを開く(OPEN文) ループスタート 100回 CALL RNDM() Aを書く エンドループ ファイルを閉じる(CLOSE文) STOP END SUBROUTINE RNDM 乱数発生するぞするぞ! RETURN END 「メインプログラムと独立したファイルにサブプログラムが書かれている場合」 てのは、ライブラリが有るって事 調べて分からない場合は又書き名。調べた痕跡が分かれば俺は答える。
724 名前:722 [2007/07/14(土) 14:32:45 ] >>723 ありがとうございます。 調べてみます!
725 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 03:39:15 ] ボコボコにしてやんお .∧_∧ ( ^ω^)=つ≡つ (っ ≡つ=つ / ) ババババ ( ノ ̄∪
726 名前:デフォルトの名無しさん [2007/07/19(木) 11:52:59 ] たとえば、 WRITE(*,'(E10.4)') 0.0001234 とすると、出力結果は0.1234E-03となります。 この出力結果を、1.234E-04とするにはどうしたらいいのでしょうか?
727 名前:デフォルトの名無しさん [2007/07/19(木) 14:40:44 ] そうするメリットは何? 文字として扱うかですね。
728 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 17:24:04 ] E形編集を使ったこと無いから、気付かなかったけど E形編集ってメイドコスプレしたオッサン並に気持ち悪い。
729 名前:デフォルトの名無しさん [2007/07/20(金) 00:09:39 ] >>727 おい! クソ豚! わかりもしないことに口出しするな! しょんべん飲んで、とっとと死にやがれ! >>726 その要望は多くの人が持っていたので、Fortran90で対応がなされた。 ただしFORTRAN77でも出来ることは出来る。 Fortran90なら、ESフォーマットを使えばよい。SはScientificのSだ。 工学と科学では表記の伝統が違うようだ。詳しくはマニュアル嫁。 Fortran77の場合は、1P, E10.4, 0P を使えばよい。Pフォーマットは思わぬ副作用があるので、 使用後はすぐに 0P で元に戻しておいたほうが間違いが無い。 詳しくはマニュアル嫁。
730 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:19:02 ] >>727 そりゃ少ない文字数で多くの桁を表現できるからだろ。
731 名前:デフォルトの名無しさん [2007/07/20(金) 14:49:51 ] >>729 0.123...... 1.234...... と小数点以下を同じ桁数でして、桁数も大きくすると 仮数分の限界を越すと思うが
732 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 16:49:58 ] 何が言いたいのか分からない
733 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 21:14:08 ] 無視でおk
734 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:45:57 ] >>731 WRITE(*,'(E10.4)') 0.0001234 〜〜〜 ちゃんと>>726 を読んだらどうだ? 2chなんか見てないで、精神病院でも逝って来い!
735 名前:デフォルトの名無しさん [2007/07/22(日) 03:13:48 ] r(i)をreal(8)の配列として、 sin(r(i))の値を求めたいのですが、出力が0になります。 どなたかどうすればちゃんとした値が帰ってくるのか教えてください。
736 名前:デフォルトの名無しさん [2007/07/22(日) 03:55:29 ] r(i) がゼロなんじゃね?
737 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 03:57:02 ] 整数に代入した後に出力してるとか。
738 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:18:36 ] >>735 ソース見せろ
739 名前:デフォルトの名無しさん [2007/07/25(水) 20:50:00 ] 配列の宣言で、REAL A(10,5)とすべところをA(5,10)と間違って宣言したままコンパイルし、 しかもboundのチェックしないオプションでコンパイルしてエラー等は起きずに動いた場合、 たとえば、A(7,7)にアクセスした結果は、 どちらの宣言でも同じなのでしょうか? C言語の場合は同じというような話をきいたことがあるのですが、FORTRANの場合 いかがでしょうか? 処理系に依存して結果が不定なのでしょうか?
740 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 20:52:54 ] 同じなわけがない。C でも。
741 名前:デフォルトの名無しさん [2007/07/25(水) 21:53:51 ] C言語なら5×10=50のエリアに連続的に並んでいるだけだから、 A(7,7)は49番目というつもりなら境界を越えない限りは アプリの実行結果は同じになるんじゃないか。
742 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 21:55:50 ] A(10,5) で A(7,7) はおもっくそ境界越えとるがな。
743 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:22:18 ] >>742 従来のFORTRANでは、境界はあまり気にしなくていい。 というか、サブルーチンに渡したりするときは次元すら気にしない。 どうせ先頭番地しか渡してないので。自己責任でGo! >>740 >>741 が正しい。 どうせメモリー上では1次元に展開されているので、どう展開されるか分かっていれば 本来不正な添え字でも、目的の配列要素をアクセスすることが可能。 ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。 FORTRANは縦書き。A(1,1),A(2,1),A(3, 1),.....,A(1,2), A(2,2), A(3, 2),.....という風にメモリー上に 並んでいる。 .
744 名前:デフォルトの名無しさん [2007/07/26(木) 07:24:32 ] FORTRANの他に数値解析に向いてる言語って何がありますかね?
745 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 08:43:53 ] >>743 いや、配列のために確保されているメモリ領域を越えちゃってるという意味で・・・
746 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:30:25 ] >>745 今回に限って言えば、50>7*7=49でぎりぎりセーフでね?
747 名前:デフォルトの名無しさん [2007/07/26(木) 12:17:43 ] >>746 Cは0から始まるから A(7,7) は (7+1)*(7+1)=64番目なのよ。 まあ、>>739 のは Cの場合はA(6,6)と読み替えてやるのがよろし。
748 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:23:45 ] >>746 A(10,5) で A(7,7) にアクセスするってのは、 10 * (7 - 1) + 7 = 66 番目のメモリ領域にアクセスするってことで、 50 要素しかない A(10,5) のメモリ領域は余裕で越える。
749 名前:747 mailto:sage [2007/07/26(木) 12:32:02 ] >>748 確かにそうだ。何で1行7要素だと思ったのか。 馬鹿だった。
750 名前:デフォルトの名無しさん [2007/07/26(木) 14:56:16 ] じゃA(5,10)なら良いのか? violationになりそうだけど
751 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:32:06 ] 5 * (7 - 1) + 7 = 37 だから、 確保したメモリ領域を越えないという点に関してのみは問題は無い。
752 名前:739 [2007/07/26(木) 19:38:10 ] >740-751 皆さんありがとうございました。 考え方がよくわかりました。 変な質問になってしまい申し訳有りません。 A(7,7)は例が悪かったと反省しています。
753 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:58:59 ] >>744 お金があったらMATLAB 貧乏人ならOctave
754 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:33:09 ] >>748 んだ。おまいが正しい。わしが間違ってた。すまんこw
755 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:32:54 ] >>743 >どうせメモリー上では1次元に展開されているので、 そうなんすか・・・知らんかった つまり、A(7,7)は単に先頭から7*7=49番目を見るってことですか? >ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。 つまりFORTRANは左から、Cは右から1,2,3,・・・と展開していくってことですか
756 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:37:39 ] >>755 ちょっと前のレスくらい読めよ・・・
757 名前:755 mailto:sage [2007/07/27(金) 12:39:52 ] >>756 すいません新着し忘れてましたすいません
758 名前:747 mailto:sage [2007/07/27(金) 12:51:34 ] まだ混乱しているようだから、整理すると SUBROUTINE A(X) INTEGER X(10,5) WRITE(*,*) X(7,3) END SUBROUTINE PROGRAM INTEGER Y(5,10) Y(2,6)=10 CALL A(Y) STOP END とかやると ちゃんと 10って表示されるってことでしょ。 Y(2,6) は前から27番目。 X(7,3)も27番目だから。 メインルーチンの中で Y(7,7) とかやるとコンパイル時にエラーが出ると思う、さすがに FORTRAN77の頃は結構利用されていたような気がする。 普通は1次元配列で作って2次元で受け取るとかその逆だと思うけど。
759 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:42:25 ] すいません.Fortran90で複数行をまとめてコメントアウトすることはできないのでしょうか?
760 名前:755 mailto:sage [2007/07/27(金) 13:55:30 ] >>758 ありがとうございます。もんすごい良く分かりました。 Y(7,7)でやってみたところ、g77だとやはり out of defined rangeとなりましたが、 ifort9ではコンパイルでき結果も一致しました。 SUBROUTINE A(X) INTEGER X(10,5) WRITE(*,*) X(7,4) END SUBROUTINE PROGRAM INTEGER Y(5,10) Y(7,7)=10 CALL A(Y) STOP END ifortって緩いんですかね?
761 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:18:10 ] >>760 配列の範囲チェックに限らず、ifortは微妙にいろいろ緩いよ。少なくともg77よりは。 オプションで変わるのかも知れないが、デフォではそう。 最初のうちはg77で練習した方がいいかもね。
762 名前:デフォルトの名無しさん [2007/07/27(金) 17:14:05 ] Fortran77で、Do文を利用して配列に値(1or0)を代入して ファイルにはいたら途中から?????とか巨大な数が でてしまうのですが、 何か初期化などが必要なのでしょうか? Do文の前にx(i,j,k)=0とか入れてるのですが、 これでは駄目なのでしょうか?
763 名前:デフォルトの名無しさん [2007/07/27(金) 17:51:26 ] >>762 1か0を代入した配列要素を参照すれば1か0を返すと思います。 予期せぬ値を吐いているのは、配列が宣言されてから、 その要素に一度も値が代入されていないからだと思います。 予期せぬ値が配列のどの要素にあたるのか考えてみれば 大抵あっさり解決すると思いますよ。
764 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:02:58 ] Intel fortranだと初期化してない変数は自動で0になるんよね
765 名前:762 mailto:sage [2007/07/27(金) 20:22:52 ] >>763 ,764 ありがとうございます。 使用しているのはSalfordのftn77peです。 配列要素は代入したものを参照しているはずなのですが。。。 以下の内容ですが間違いありますか? integer h parameter(ilimit=10) parameter(jlimit=20) parameter(klimit=2) real Conc(ilimit+1,jlimit+1,klimit+1) open(10,file='tests1.csv') i=0 j=0 k=0 h=5 Do 300, i=0,ilimit Do 200, j=0,jlimit if(j.lt.h) then Conc(i,j,k)=0.0 else Conc(i,j,k)=1.0 endif write(*,*)i,j,k,Conc(i,j,k) write(10,*)i,j,k,Conc(i,j,0) 200 Continue 300 Continue c close(10) stop end
766 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 22:09:46 ] >>765 FORTRANの配列は特に指定しない場合は 1から。 >使用しているのはSalfordのftn77peです。 >>765 のプログラムを/CHECK オプションを付けてコンパイルすると実行時エラーが出る。 /FULLCHECK オプションを付けるとコンパイル時にエラーになる。 配列を0から始めたいのなら以下のようにする。 real Conc(0:ilimit,0:jlimit,0:klimit)
767 名前:762 [2007/07/28(土) 13:05:47 ] >>766 アドバイスありがとうございます。 教えていただいたオプションつけると 実行時エラーが確かにでますね・・・ どこに間違いがあるのでしょう?
768 名前:762 mailto:sage [2007/07/28(土) 13:09:51 ] >>766 初期化したら大丈夫でした。 何から何までありがとうございました。
769 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 17:13:16 ] gfortran, ifort で NaN を検出したいのですが、 どうすればよいでしょうか。 program test real(8) :: x,y x=1. y=0. write(*,*) x/y,isnan(x/y) end $ gfortran test.f90 /tmp/ccABo1qT.o: In function `MAIN__': test.f90:(.text+0xa3): undefined reference to `isnan_' collect2: ld はステータス 1 で終了しました $ i$ ifort test.f90 $ ./a.out Infinity F 鳥は Linux 2.6.20-gentoo-r8 SMP x86_64 Intel(R) Xeon(TM) CPU 3.80GHz GenuineIntel GNU/Linux $ gfortran --version GNU Fortran 95 (GCC) 4.1.2 (Gentoo 4.1.2) $ ifort --version ifort (IFORT) 9.1 20070215 です。
770 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:48:12 ] >>769 Intel Fortran, g95 なら program test real(8) :: x,y x=0. y=0. write(*,*) x/y,isnan(x/y) end gfortranの場合は知らん。
771 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:18:08 ] >>770 thanks. infinity は NaN ではなかった。小手先の工夫で program test real(8) :: x,y x=0. y=0. x=x/y if(x-x.ne.0.) then write(*,*) x else write(*,*) x-x endif end を考えたのですが gfortran は NaN を返し、ifort は 0.000000000000000E+000 を, ifort -O0 は NaN を返しました。例外をトラップしようと思うと、 c のプログラムをリンクせざるとえないのかな。
772 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:20:20 ] >>771 マニュアル味噌。 Module: USE IFPORT Syntax result = IEEE_FLAGS (action, mode, in, out) gfortranの方は知らんが、F2003対応のIEEEモジュールを誰かが作ったとか書いてあったような。 記憶違いだったら、ごめんw
773 名前:デフォルトの名無しさん [2007/08/02(木) 03:31:02 ] わざわざNanを検出する理由は何か?