1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
623 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:59:45 ] 横からですいませんが、PROCEDUREって何ですか? 90以降の機能ですかね?
624 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 23:51:06 ] >>623 Fortran2003 の機能です。 副プログラムのインターフェースを、一括化できたりします。 インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。 type っぽいかんじで。
625 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 00:28:40 ] >>624 なるほど。ありがとうございます!
626 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 05:28:41 ] >>622 ありがとうございます。 でも、gfortranの4.2じゃできないっぽいですね。 v4.3以降でサポートなので、v4.3入れてやってみます!
627 名前:デフォルトの名無しさん [2009/09/27(日) 07:50:23 ] お礼はいりませんよ。
628 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 07:04:01 ] program orei implicit none do while (.true.) write(*,*) '627 ありがとう' end do end program orei
629 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:46:13 ] Fortranの名著的な入門書ってありますか?
630 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:56:00 ] 森口繁一のFORTRAN入門?
631 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 18:18:32 ] それって77じゃない? あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど
632 名前:デフォルトの名無しさん [2009/10/03(土) 18:18:59 ] 浦昭二編のFORTRAN77入門改訂版だろう やっぱ プログラミングの入門者には迷著かもしれないが
633 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:00:12 ] >>631 そうは言うがな、大佐。 F90以降は入門書どころか日本語の書籍自体少ないし・・・
634 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:35:16 ] 倍精度の説明をキッチリやってる本ってあったっけ?見た 記憶無いんだが。 90 といえば bit の別冊であったけど、あれも絶版だよね。 単行本にしたらいいのに。あとソフトバンクからも90の本 は大昔に出てたそうだな。どっちも持ってないけど。
635 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 02:12:27 ] >>634 Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい? 入門書とはいえない気もするが。
636 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 19:45:15 ] C++は数年使ってるんだが大学で初めてFortran使わされることになった templateとかクラスがなくて心細いよ
637 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:23:56 ] まだFortranを使わせる所もあるんだ。 物理系?
638 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:38:02 ] うん物理
639 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 21:56:45 ] 分野にもよるけど地球物理系もFortranがバリバリ現役 しかもFortran77 過去の資産有りすぎ Fortranのサブルーチンは変数が参照渡しだから 他の言語に移植するときめんどい
640 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 23:59:49 ] 77はダイレクトに変数とかに触っている気がして気持ちいい。 90/95とかだと膜ごしに触っているような感触と言うか。 でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。 2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで 微妙な感じがする。
641 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:07:32 ] >>640 >INTENTとかをガチガチ 計算用の言語としては、この辺で十分な気がする。 十分具体的で十分美しい。かつ十分便利。 もう95位で仕様凍結してくんないかな・・・
642 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 02:24:23 ] >>641 > もう95位で仕様凍結してくんないかな・・・ 同意。色々と弄られるとついて行けなくなりそう。個人的には Fortran90 で十分と思ってしまうのだが、これは少数派かも。
643 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 08:27:30 ] intent の in out で変数値書き換えチェック interface 文で呼び出す側で心つもりも教え pure 属性をつけてインラインしやすくしてあげる だけど固定書式をつらぬくのが漢! うそだけど。 固定書式に目が慣れてるといまさら自由書式にしにくいのよね。 右側7文字が空いてないとそわそわしてしまう。
644 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 10:09:52 ] 左側?
645 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 16:19:47 ] ひとつのモジュールのなかにオーバーロード?用のinterfaceと実装をまとめて記述したいんですがどう書いたらいいんでしょうか?
646 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 19:46:13 ] >>645 こんな感じ? module mod1 interface sub module procedure sub_int, sub_real end interface contains subroutine sub_int(n) integer, intent(in) :: n print *, "INTEGER", n end subroutine sub_int subroutine sub_real(x) real, intent(in) :: x print *, "REAL", x end subroutine sub_real end module mod1 ! --------------- program prog1 use mod1 call sub(1) call sub(2.0) end program prog1
647 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 20:37:51 ] >>646 まさにこれです ようやっと期待通りにコンパイルできました 有難うございました
648 名前:デフォルトの名無しさん [2009/10/15(木) 04:55:19 ] 通りすがりだけど、参考にしよう。 この例のは、引数の型で振舞を変える事ができるから、標準のmaxやmin関数を連想した。 ・・・引数の変数名の数の違いで振舞を変えるもの作れるのかな?
649 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 13:56:19 ] >>648 任意個数引数の副プログラムは作れないと思う。 Array Constructor で、見かけ上引数を沢山並べるが、引数的には配列として受け取るようにすれば 実現できる気もする。 Call sub( [a, b, c, d, e, f, g] ) Subroutine Sub( x ) Real, Intent (in) :: x(:) みたいな。
650 名前:デフォルトの名無しさん [2009/10/15(木) 14:41:54 ] おお、そういうやり方があるんだ。 今コンパイラを使えない状況にいるので・・、 とりいぞぎお礼まで。
651 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 00:37:33 ] >>650 補足するならば、[ ] はfortran2003での導入なので、f90的には(/ /)となる。 確定した有限個まででよければ、optional引数を使うとか、1個からn個までのサブルーチンを用意して、 総称名を与える方法も考えられる。
652 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 20:54:23 ] たった今Fortranをやり始めたものです。コンパイラーはg95を使ってます。 最初の宣言部であるパラメータのベクトル p を宣言しようと思って、 real, parameter, dimension(3) :: p(1)=0.5, p(2)=0.8, p(3)=1.6 のように入力したのですが、 Error: Symbol 'p' at (1) already has basic type of REAL というエラーメッセージが表示されました。ただ、このメッセージの 意味さえ解せない状況です。どなたか正しい方法を教えていただけ ないでしょうか。よろしくお願いします。
653 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 00:53:45 ] >>652 こうすれば、おk。 PROGRAM test IMPLICIT NONE REAL, PARAMETER :: p(3) = (/ 1.0, 2.0, 3.0 /) ! f90/f95 !REAL, PARAMETER :: p(3) = [1.0, 2.0, 3.0] ! f2003 PRINT *, p STOP END PROGRAM test
654 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 01:29:41 ] >>653 ありがとうございます!
655 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 20:19:27 ] common文の代わりにmoduleを変数の共有に使ってるんですが、 そのサブルーチンの中で使ってないmoduleをuseしたりすると (バグの温床になる以外に)何か弊害ってありますか? どの変数を使ってるか確認する手間が大きくなり過ぎた場合に 全てのmoduleをどさっとuseしても構わないもんでしょうか?
656 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 12:57:28 ] >>655 依存関係が無くても、USEされているためにリコンパイルされる可能性があるが、 文法的には問題ないような。
657 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 17:41:02 ] >>655 ローカルの変数とコンフリクトしたらコンパイラが教えてくれるので ぜんぜん問題ないと思うけど・・・ どっさりuseしなきゃならんサブルーチンの構成は、 見直した方が幸せになれるかもね
658 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 07:49:59 ] use 文って便利だけど不便だよねw
659 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 22:49:38 ] Intel の Steve Lionel が鉄腕アトム劇場版を見て面白かったと言ってるw ttp://twitter.com/DoctorFortran じじい受けするのか?
660 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 04:02:09 ] NaNが出てきちゃった時、どうやって原因を突き止めますか?NaNが発生してると思しきところと 発覚するところが離れてる上に乱数使う手法で、しかもたまにしか起こらないので手の付けようがありません。 ズバッと解決はしないかもしれないけど何か助言をもらえればうれしいです。
661 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 05:20:01 ] >>660 乱数を使っているなら、種を特定すれば良いんじゃないか?種を手で与える方法もあるんだし。 現象が起きるときの種が分かっていればバグ取りは出来るはず。それだけでは足りないかもし れないけど、何も情報が無いよりはマシ。 あと、NaNが出る式の実行直前に、式で使う変数の中身を書き出せば何か分かるかもしれん。 何をやっているのか分からんので、それくらいしか言いようが無い。
662 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 05:43:13 ] なるほど…ありがとうございます。ちょっとその方向で試してみます。 Xの値を調べて場合分けするんですが、XがNaNなのでエラーが出て発覚する、って感じです。 その場合分けしてる位置よりかなり以前の複数の場所でXが代入されてる上にXの代入が多すぎて 全部調べるのが厳しいんです。といってもそれしか思いつかずちまちまやってました。
663 名前:デフォルトの名無しさん [2009/10/26(月) 06:44:30 ] 宣言した範囲外の配列値を参照すると subscription out of range のエラーを出さずに NaNや変な値を返して計算をぶっ続けるシステムもあるよね。一応配列もチェックすることをお薦めする。 システムごとにNaNやInf検出して停止させる機能があると思うけどな。 発生した場所をソースの行番号で教えてくれる・・・はず。 富士通Fortranはデバッグ機能が神がかり的に優秀だけどIntelその他にも似た機能はあるだろう。 自分で直接追求するときにはとりあえず if (.NOT. ((x .GT. -1.0) .OR. (x .LT. 1.0))) then ... の判定で場所を特定してるけど・・・みんなはどうやってNaN発生を見つけてるの?
664 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 07:03:59 ] >>663 配列の宣言外領域へのアクセスについては、実行時にチェックするオプションを 付けてコンパイルしている。でも個々の変数の中身がNaNになったら止める方法 は知らない。あれば知りたいくらいだ。 しかし変数にNaNが入った時点でプログラム自体に問題があるように思うのは間 違ってるだろうか?初期化の時にNaNを入れるのも可笑しいしなぁ。
665 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:19:35 ] >>664 Fortran2003ならIEEE754例外を拾う関数がある。 F2003でなくても最近のコンパイラはベンダー拡張サブルーチンでIEEE例外を検知できることが多い。
666 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 02:55:23 ] >>665 有り難うございます。貧乏なので gfortran しか持ってません。並列とかするわけでもないので 特に困る事もないのですが。で、その gfortran のマニュアルを見ていたら、isnan() という関 数がありました。これで検知だけは出来そうです。オプションでも -ffpe-trap というのがあり ましたが、使ってみたら実行時に警告が出ただけで、プログラム自体は正常終了してた。使えな いのかな。それとも PPC なのが悪いのか。取り敢えず気になる変数だけ、isnan() を使ってチ ェックすれば良いかな、と思うことにしました。 C マニュアルに載ってたサンプル: test_nan.F90 とでもする program test_nan implicit none real :: x x = -1.0 x = sqrt(x) if (isnan(x)) stop '"x" is a NaN' end program test_nan % gfortran test_nan.F90 -ffpe-trap=invalid % ./a.out Fortran runtime warning: IEEE 'invalid operation' exception not supported. STOP "x" is a NaN % echo $? 0
667 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:51:44 ] 通りすがりがテストしてみた。 % gfortran test_nan.f90 -ffpe-trap=invalid In file test_nan.f90:6 if (isnan(x)) stop '"x" is a NaN' 1 Error: Function 'isnan' at (1) has no IMPLICIT type コンパイル止まったお! バージョンにも依るのかな? SPARCかな、CPUによってはNaNやInfが出てくるとハード的にフラグをたててくれるみたいだけど 一般的じゃないからなあ。 >>663 の条件式はハードやコンパイラ関係無くNaNは見つけてくれそうだけど、 システムによっては+/-Infは判定できないんじゃないかな。
668 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 09:43:51 ] >>666 です >>667 うちは % gfortran --version GNU Fortran (GCC) 4.4.1 だった。マニュアル(但し 4.4.2 版)によると、isnan は論理型とのこと。オプションの -ffpe-trap=invalid は無くても isnan 自体には問題なかった。 自宅にある唯一の Fortran90 の本「Fortran90/95 explained (2nd ed.)」によると、ieee_arithmetic という モジュール?には ieee_is_nan という関数があるとのことだけど、モジュールってどうやって使うの?ずっと 77でやってきたから知りません。イイカゲン90の勉強をした方が良さそうな気がして来たが、もうFortranを 使う用事ってないんだよなぁ。趣味で数値計算でもしない限り。 あと、名前付き定数?(named constants)というヤツの中に ieee_nan というのがあるらしい。取り敢えず 同書から引用しておきます。 ieee_nan The scoping unit must support NaNs for at least one kind of real. これを何の目的でどう使うのかは分かりません。ゴメンナサイ。
669 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 12:41:45 ] ありがとう。 GNU Fortran (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) ・・・2年前のだった。 こんど再挑戦してみるよ。
670 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 18:07:40 ] そんな難しいことする前に、 ゼロ割とSQRTチェックがまだだったら、 そこ見た方がいいよ。 もうチェック済ならスマン
671 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:09:11 ] 列の数が任意のテキストデータ(列間は空白など)を読む方法を 考えているのですが、上手い方法が思いつきません。 行の場合は、EOFのチェックをすればいいので簡単なのですが・・・
672 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:02:02 ] >>671 EOR end of record のチェックをするという手もある。自由フォーマットだとうまく行かないが。 あとは、一度一行を文字列として読んで、次にその文字列を内部ファイルとして、それから読み出す というやり方も考えられる。 データの幅が一定フォーマットなら比較的楽。 空白で切ってるだけで可変長の場合は、ややめんどいかな?
673 名前:672 mailto:sage [2009/10/28(水) 02:11:12 ] PROGRAM test IMPLICIT NONE ! INTEGER, PARAMETER :: iostat_eor = -2, iostat_end = -1 REAL :: a(20) INTEGER :: io, i, k CHARACTER (LEN = 136) :: text ! prepare data DO i = 1, 10 WRITE(9, '( 10(F10.5, X) )') (REAL(k), k = 1, i) END DO CLOSE(9) ! (2) ! DO READ(9, '(a)', IOSTAT = io) text IF (is_iostat_end(io)) EXIT ! f2003 a = a / 0.0 ! NaN READ(text, *, IOSTAT = io) a IF (is_iostat_eor(io)) EXIT ! f2003 PRINT *, a END DO STOP ! (1) ! DO READ(9, '(10F10.5)', IOSTAT = io) a IF (is_iostat_eor(io)) EXIT ! f2003 IF (is_iostat_end(io)) EXIT ! f2003 PRINT *, a(1:10) END DO STOP END PROGRAM test
674 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:56:59 ] 質問です。 シンプソン法を用いてy=exp(x)の計算プログラムを作っています。 以下のプログラムの15、16行目のfun()の中には、 何を入れればいいのでしょうか?
675 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:58:29 ] program simpson1 implicit none integer::m,i real(8)::a,b,s,s1,s2,h,x,fun external fun 1 continue write(*,*)'INPUT DATA' write(*,*)'A,B,M ?' read(*,*)a,b,m if(m<=0)stop h=(b-a)/m s1=0.D0 s2=0.D0 do i=1,m/2-1 s1=s1+fun(i) s2=s2+fun(i) end do s1=s1+fun((m-1)*h+a) s=h/3*(fun(a)+fun(b)+4*s1+2*s2) write(6,100) s 100 format(2x,'IR=',D16.6) end program simpson1 ! function fun(x) implicit none real(8)::fun,x fun=exp(x) return end function fun
676 名前:671 mailto:sage [2009/10/28(水) 16:19:35 ] >>672 ,673 ありがとうございます。 「一度一行を文字列として読んでから、その文字列を内部ファイルで読み出す」は応用が利いて便利ですね。 区切りを空白とする以外はフォーマットを限定しない仕様にしたかったので、 この方法がベストだと思いました。NaNのチェックはisnan()を使いました。 最後にもう一点お聞きしたいのですが、EORはformattedで読む場合も関係あるのでしょうか? また、どういう使い方をするのでしょうか?
677 名前:デフォルトの名無しさん [2009/10/28(水) 17:00:51 ] サブルーチンについての質問したいことがあるのでソース貼らせていただきます。 お忙しいとは思いますが、よろしくお願いします。まず下のソースを見てください。 このプログラム自体は完成しているのですが、 DO 1040 a=1,M DO 1030 k=1,24 AVE(a)=AVE(a)+(sl(k,a)) 1030 continue WRITE(2,*)AVE(a)/24 1040 continue の部分をサブルーチンで直して来いといわれたので、 サブルーチンについて調べて色々やりくりしてみたのですが サブルーチンについての理解が乏しいため上手くいきません。 もしこの箇所をサブルーチンを利用して書き換えるならどのようになるのか教えていただけませんか? よろしくお願いします。
678 名前:デフォルトの名無しさん [2009/10/28(水) 17:02:47 ] 上の続き(ソース)です。よろしくお願いします。 implicit none integer MM,KK,M,K,a parameter (MM=400,KK=100) integer year(MM),month(MM),day(MM),sl(KK,MM),AVE(MM) character cdummy,CFNAME*110,CFNAME2*80 M=0 CFNAME='/home/maekawa/numeric/kure.txt' open(1,file=CFNAME,status='old') 1010 M=M+1 read(1,10,END=1020)cdummy,year(M),cdummy,month(M), @ cdummy,day(M),(cdummy,sl(k,M),k=1,24) 10 format(A5,I2,A1,I2,A1,I2,24(a1,I3)) write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24) goto 1010 1020 close(1) M=M-1 CFNAME2='/home/maekawa/numeric/aki.txt' open(2,file=CFNAME2,status='old') DO 1040 a=1,M DO 1030 k=1,24 AVE(a)=AVE(a)+(sl(k,a)) 1030 continue WRITE(2,*)AVE(a)/24 1040 continue CLOSE(2) end
679 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 02:45:00 ] >>676 EORはF90以降だったようだ。 昨日は勘違いして77時代からあった気になっていた。使い方を良くわかっていなかったww 文法書を見てもらった方が早いが、そもそもFORMATつきでADVANCE='NO'でないと駄目のもよう。 77だとIOSTATでエラー番号を見ればEORを検出できるが、I/Oエラー番号はベンダー依存。 他のI/Oエラーが出ない自信があれば、ERR=nnで飛ぶことも可能。 77だとブランクを数値ゼロに解釈するので、文字列を内部ファイルとして読む場合に 色々前処理をしないとうまくいかないかもしれない。 90なら文字列をTRIMするなり、フォーマットをBNにするなりで対処しやすい。 まとまり無くてスマソ
680 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 12:12:40 ] そもそもFortranは「任意のサイズの○○」というのがやりにくい言語だよね そういうもんだと思って諦めてるけど
681 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 14:11:01 ] 最初に1回から読みして要素数(行数)確認してから Allocate...とか、かな。 でもこの辺の取り回しはどの言語も同じだよね。 使っていくうちに増える場合には 一度既存のデータ配列と同じサイズのTempな変数をAllocateしてそこに移して、 元のを開放してからまた同名で要素一個大きいのをAllocateして TEMPのを移して、TEMP開放、の流れは基本同じだし。
682 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 14:13:51 ] 終始一貫変化しない任意のサイズ、でなかったら77だときついな。 データを一度ファイルに落として、そのファイルの行数を数えてから 自動配列で配列生成してそのファイルを読む・・・・・とか。 不可能じゃないけどイヤだなw。
683 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 18:38:33 ] >>681 Fortranに限らず、データの個数が任意に変わる場合は ポインタ使ったリスト構造を作るのが普通じゃない? >>682 結局は、「Fortranでそういうことスンナ」って話になるよねw 速度的にも宜しくないし、データ量の多い科学計算には相容れない
684 名前:デフォルトの名無しさん [2009/10/30(金) 04:46:30 ] ・・・馬鹿でかい配列を最初に定義してそこで処理するのもなあ。 メモリがもったいない事は今はあまりないけどやはり非効率だし 場合によっては十分大きくとったつもりでも足りなかったり。
685 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 09:47:58 ] IBMのFortranのオンラインマニュアルにも、Fortran77と違って 大きな配列を最初に定義しなくて良くなりますよ〜、という事を Allocateのメリットの例にしてるくらいだからな。
686 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 13:27:32 ] FORTRANは言語仕様が堅くて大変だねえ C/C++ならそういう問題で頭を悩ます必要もないのに
687 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 14:46:45 ] >>686 最適化がしやすいようにわざと堅く作ってあるんだよ C/C++は確かに自由な文法だが最適化がしにくい
688 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:49:03 ] 最適化しにくいし、コンパイラ毎に推奨される書き方の違いは Fortranより大きいと思う。個人的にはこっちがいやで Fortranを中心に使っている。 でもやはりというかCのI/Oその他の自由度の高さゆえに 最終的には混ぜこぜコードの出来上がり、になる事も多いけど。 Cはコーディングの自由がありすぎて、結局サイトや教科書の 部分的丸写しが多くなっちゃうから上達しないだけなんだろうけどな。
689 名前:671 mailto:sage [2009/10/30(金) 18:45:48 ] >>679 レス遅くなりましたが、ありがとうございます。調べたところ、要するに 「form='formatted' かつ advance='no' の場合に限り、 eor=文番号 が使える」 ということなんですね。 ↓のコードでテストしてみました。 <ソース> real :: f(5) write(10,*) 1.0 , 2.0 , 3.0 write(10,*) 4.0 , 5.0 , 6.0 write(10,*) 7.0 , 8.0 , 9.0 rewind(10) do i=1,2 f=0./0 read(10,'(3f)',advance='no',iostat=io,eor=999) f print *,'io=',io print *,f enddo stop 999 print *,'EOR detected!' print *,'io=',io print *,f end <出力> io= 0 1.000000 2.000000 3.000000 4.000000 5.000000 EOR detected! io= -2 6.000000 0.0000000E+00 NaN NaN NaN
690 名前:671 mailto:sage [2009/10/30(金) 19:00:00 ] ふと思ったのですが、「レコード」というのはunformattedの場合の概念であって、 単なるASCIIであるformattedでは関係ないはずですよね。 そうすると、EOR(End Of Record)ではなく、EOL(End Of Line)などと 呼ぶほうが適切なのでは、と思ってしまいました・・・。 いずれにしろ、私的には文番号はデバッグ時を除いて使いたくないので、 >>676 の方法がベストですね。
691 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 20:14:11 ] >>690 IOSTATの番号で見ればいいので文番号は必須ではない。 しかし、いったん1行を文字列に読んで、加工するなりして、 内部ファイルで読むのがいろいろ出来て便利。 EORの呼び名に関しては、御説ごもっともだが、多分ADVANCE=’NO'によって、 逐次型本来の行単位のアクセスではなく、その内部の要素ごとで、ファイルの現在位置を 止めうるようにしたので、ダイレクトアクセス的なネーミングにしたのではないかと想像?
692 名前:671 mailto:sage [2009/11/01(日) 21:01:41 ] >>691 ほんとですね。ありがとうございます。 iostat= と eor= の少なくともどちらか1つを指定していないと、 EORになった時点で↓のようにエラー終了するようですね。 forrtl: severe (268): end of record during read, unit 10, file ・・・
693 名前:デフォルトの名無しさん [2009/11/04(水) 05:59:17 ] IOの挙動がらみで複数の行き先指定すると その後にgotoスパゲッティになることがあるからムズムズする。
694 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 16:22:39 ] メジャーな環境で動く汎用的なコードを書こうという場合、 安心して使えるFortranのバージョンってどれでしょうか? 少し前は「90にしとけ」って話をよく聞きましたが、最近は 95や2003も問題なく通用すると思って良いんでしょうか?
695 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 01:39:36 ] >>694 F95が標準の地位を占めたという感じでないか? 更新していないシステムでは、まだF90の環境が結構残っている。 F77はコマンド名として存在していてもF90のコンパイラを固定カラムなどのオプションで 呼び出していることが多い。 F2003はようやくCRAYが完全対応したところで、ベンダーごとに独自の部分的な対応に とどまっているのが実情。簡単なところから対応しているから大体は重なっているが。
696 名前:デフォルトの名無しさん [2009/11/05(木) 05:21:56 ] もともとがF77で始めたせいで、いまでは固定書式&左側6文字空白&72文字制限つきで でも命令文はF77~95の混在したコードになってもうた。プリプロセスも混ぜてるから拡張子は.fppだ。 まあでも、gfortran と intel fortran はちゃんと処理してくれるから、いいや。 FujitsuのもOKみたいだし。 無駄に行数が増えてしまうけど左側が空いてるとなんか安心するw
697 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:12:15 ] >>695 ありがとうございます。 F95で書こうと思います。
698 名前:デフォルトの名無しさん [2009/11/06(金) 02:03:35 ] 今から始めるんならF95でいいと思うよ。Fortranは古いコードと混ぜてもトラブルは 少ないように規格されてるから過去の資源も使い易いし。 2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう? まだ見たことないや。
699 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 15:29:10 ] たいていの商用コードはIntelとAMDのx86環境を前提としてるよね。 昔はIBM、日立、富士通、Sun、SGIって色々あったけど、今はそれらは ほとんど淘汰されてスパコンレベルしか残ってないし。 ま、コードを開発する側としてはやりやすくなったんだろうけど。
700 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 00:55:13 ] >>698 >2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう? >まだ見たことないや。 変数のスコープか? PRIVATE、PUBLICは今あるままで、PROTECTED(いわゆるリードオンリー)が加わる程度だと思ったぞ。 他にもあんのかな?
701 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 09:26:51 ] COMMON文ってmoduleみたいにスコープを指定ってできないの?
702 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 13:05:37 ] 名前を共有するんじゃなくて、メモリブロックを共有するための仕組みだからねえ。
703 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 23:57:09 ] >>701 おまえふざけてんのか?w
704 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 03:32:54 ] お寿司ってハンバーグみたいにソースで食べるってできないの?
705 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 08:15:17 ] ああ、普通そうやって食べる。
706 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:00:36 ] www 両方ともマヨネーズならアリだよな
707 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:04:07 ] >>706 え?
708 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 09:03:12 ] ・・・だめ?
709 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 16:44:02 ] 本物のプログラマはマヨネーズは使わない。 Quiche Eaterはマヨネーズを使う。
710 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:18:00 ] 質問です。 割り付け配列って何ですか?
711 名前:710 mailto:sage [2009/11/18(水) 19:33:35 ] 710です。たとえば以下のプログラムの変数A,B,Cを割り付け配列すれば どこを変更すればいいのですか? program matrix_wa implicit none integer::N,I,J integer,parameter::IDIM=100 real(8),DIMENSION(IDIM,IDIM)::A,B,C ! write(*,*) 'INPUT MATRIX DIMENSION' read(*,*) N write(*,*) 'INPUT MATRIX ELEMENTS OF A' do I=1,N read(*,*) (A(I,J),J=1,N) enddo write(*,*)'INPUT MATRIX ELEMENTS OF B' do I=1,N read(*,*) (B(I,J),J=1,N) end do CALL MATADD(IDIM,N,A,B,C) CALL MATOUT(IDIM,N,C) stop end program matrix_wa
712 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:34:17 ] !============================================== SUBROUTINE MATOUT(IDIM,N,X) !============================================= implicit none integer IDIM,N,I,J real(8),DIMENSION(IDIM,IDIM)::X write(*,*)'C=' do I=1,N write(*,*) (X(I,J),J=1,N) end do return end subroutine MATOUT !=============================================== SUBROUTINE MATADD(IDIM,N,A,B,C) !============================================= implicit none integer::IDIM,N,I,J real(8),DIMENSION(IDIM,IDIM)::A,B,C DO I=1,N do J=1,N C(I,J)=A(I,J)+B(I,J) end do end do write(*,*) 'C=' do I=1,N write(*,*) (C(I,J),J=1,N) end do return end subroutine MATADD
713 名前:デフォルトの名無しさん [2009/11/21(土) 10:18:39 ] ちょっとお聞きしたいのですが、 3つの物理量の実測(とびとびのデータ)からある答えの物理量 がわかるデータがあるとき、 3つの物理量がある入力値の場合の答えの物理量を出すときに、 データの線形補完をしたいのですが そういうやり方とかないでしょうか
714 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 12:07:51 ] >>713 言いたいことがよく分からないのだけど、補完みたいなことをしたいの?
715 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:21:33 ] 回帰分析とかいう分野の事?
716 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:25:40 ] >>713 最小二乗法とか?
717 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 00:11:48 ] >>714-716 ありがとうございます。 あまりうまく伝えられなくて申し訳ないです。。 詳しくないのですが多分回帰の範囲と思います 3変数から一つの解を出す方法なのですが、 データから多項式で式が一発で出せるようなのがあればいいのですが、 そういうのはないでしょうか。。
718 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 02:38:52 ] それを求めたいのか、求めるプログラムを作りたいのか。 前者ならR言語が使えるらしい。
719 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:13:04 ] >>717 y=a*x1 + b*x2 + c*x3 のような式において、x1、x2、x3、yのリストから係数a、b、cを 導きたいなら、Excelの関数で1発でできる。重回帰分析でググれ。
720 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:48:30 ] >>713 > データの線形補完をしたいのですが 最小二乗法使っとけ。 線型でいいということは測定できる変数x、y、z とそれらから分かる量wの間に w = a*x + b*y + c*z という関係があると仮定できるってことでしょ?で、係数a、b、cは分かんない。 この分かってない係数を測定データから決定することで、測定データの中には無 いx、y、zの組のときにwがどんな値になるかを知りたいのだと邪推してみる。 >>713 の頭の中を覗けるわけではないので間違ったこと言ってるかもしれんけど。 それをどうしてもFortranで書かなければならないのなら仕方が無いが、そうでも なければ >>718 が言うように R でも何でも使ってればいい。 でも最小二乗法ならwのデータも要るのか?元質問だとwは測定して無いっぽいな。 こういうときはどうすんだ? 元質問がグダグダなので無責任に色々と言い放ってみた。グダグダじゃなくても 責任ある発言なんてできないけど。
721 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:09:24 ] Windows 用の Fortran 95 コンパイラを買おうと思っているのですが, NAG Fortran Builder 5.2 と Intel Visual Fortran 11.1 日本語版の どちらにしようか迷っています。すみませんが,以下の疑問それぞれに ついて判るかた,教えてください。 【1】 以下の項目について,どちらが優れているのでしょうか? (A) コンパイルしてできた実行ファイルの処理速度の速さ (B) 開発環境の使い勝手の良さ(入力補完など) 【2】 Intel Visual Fortran でも NAG Fortran Builder のように GUI アプリケーションが作れるのでしょうか? 【3】 Intel Visual Fortran と NAG Fortran Builder の2つ以外に 日本語版の Fortran 95 コンパイラはあるのでしょうか? なお,私のパソコンは, Windows が XP Home Edition SP3, CPU が Intel Pentium 4 (2.40GHz), RAM が 512MB です。
722 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:19:25 ] >>721 1) (A)処理速度で言うならIntel。NAGは文法的な厳格さ、厳密さが売りで速度は二の次。 (B)Intelの統合環境はMSのVisualStudioで、入力補完などは無い。シンタックスカラーリング程度? VS2010あたりで色々対応したいと言うようなことは言っているが未定。 NAGの方は独自の統合環境で、こちらもシンタックスカラーリング程度だったような。 Fortranの入力補完は、ほとんど存在しない。 昔の(10年以上前の)LaheyについてきたWin3.1時代風のEDくらいか。 Polyhedron社が今のLahey用にVisualStudioの拡張を売っていたような気もするが詳しくは分からん。 Laheyのサイトを見てくれ。 2.IVFでのGUIは、Win3.0時代から続くQuickWin互換の初歩的なものと、Win32APIを直接叩く方式がある。 サンプルプログラムが提供されているが、Fortranの呼び出し規約とCの呼び出し規約が違うので Win32APIに習熟しているとともに、呼び出し規約等に惑わされない必要があって、理解が困難。 OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい。 3.日本語版があるかは知らないが、Winで動くものとしては 有料 商用 ・CUDAに対応するなどアグレッシブなPGIのFortran。 ・富士通とコンパチなLahey-Fujitsu Fortran (.Net対応とか、SSLライブラリがある) ・MacやCrayとの親和性が売りだったAbsoft Fortran (今はその利点もあまり無いが) 無料系 ・広告がうざいが、ただで使えるのがSilverFrostのFTN95。(商用は.Net 対応らしい) ・GNU系がよければ、g95 または gfortran. (この二つは同じ先祖から分かれた別物) 参考:非Win *FreeのSUN OS上でよければ、SUNのFrotran95もただで使える。 *Linux上なら Intel Frotranが学術目的ならただで使える。
723 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:47:53 ] >>722 OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい なつかしす。結局コレで遊んだ以外はコマンドラインでしか使わなかったな・・・ もっとも自分の古いマシンに乗ってるのは DEC のVisual Fortran だけど、まあ同じようなものだからいいか。