1 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:55:26 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
76 名前:デフォルトの名無しさん [2008/01/17(木) 14:32:18 ] write文に関して質問なんですが write(15,*)'r1=',r(n) みたいな文章を書いたとき r1= 0.12 のように=と数値の間に半角スペースが一つ入ってしまいます。これをなくすことはできないんでしょうか? 途中で投稿してしまいました。すみません。
77 名前:デフォルトの名無しさん [2008/01/18(金) 00:58:57 ] >>76 FORMATを使え!
78 名前:76 mailto:sage [2008/01/19(土) 00:29:52 ] な、なるほど。ありがとうございます。色々みてみます。
79 名前:デフォルトの名無しさん [2008/01/20(日) 20:22:50 ] 出力しようとすると、ハンドルされてない例外が発生しました。 ってでるんだけどどうすればいいでしょうか?
80 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:52:10 ] >>79 エラーメッセージを貼ってくれ。
81 名前:デフォルトの名無しさん [2008/01/20(日) 20:56:09 ] >>80 コンパイルにエラーはないんですが、出力しようとすると、新しい画面がでてきて、 ハンドル・・・とでるんです。
82 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:47:51 ] その「新しい画面」の内容を何とか工夫して伝えないと 伝わらないぞ
83 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:09:44 ] >>81 それがランタイムエラーだっちゅーの。 エラーメッセージは省略せず一字一句表示された通り書け。 使ってるOSとコンパイラの種類もな。
84 名前:デフォルトの名無しさん [2008/01/22(火) 07:41:38 ] 開発環境 :Conpaq Visual Fortran 6 言語Ver :Fortran77+Fortran90(混在状態) OS :Windows 2000 の上記の開発環境があります。 質問はプログラムを走らせたとき、途中の過程がどこまで行われたか知りたいと考えています。 上記のソフトでFortranを実行したときコマンドプロントが出るのですが、ここに計算課程を表示させたいです。 現在のプログラム内では結果の出力にWRITE文を使用し、OPEN文で出力装置を宣言させています。 私はOPEN文の出力装置の宣言をコマンドプロントに変えることで実行できると考えています。 しかし、出力装置の宣言にコマンドプロントを宣言する方法がわかりません、どなたかご教授お願いいたします。 ちなみに現在は以下のように使用しています。 : OPEN (5,FIEL = 'OUTPUT.dat') : WIRTE (6,*) Func1, Func2, : どなたかお願いいたします。
85 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 11:38:50 ] >>84 すでに標準出力をデフォの6番に割る振っているのだから、この上5番までも割り振ることは出来ない。 ただ、UNIXとかだとerr出力を割り振ったりできるのでCVFで絶対出来ないとは言わない。 マニュアル読めば出来るかもしれない。 しかし、ここは素直にコピーを作って、それのWRITE(5 をWRITE(6,に置換すれ。 目的はそれで達成できる。 オリジナルをいじると元に戻せなくなるので注意w
86 名前:デフォルトの名無しさん [2008/01/23(水) 14:48:20 ] >85氏 返答どうもありがとうございました。 指示通り、プログラムのコピーを作成し、マニュアルを探って検証した結果うまくいきました。 方法はすごく単純で、以下のように書き換えるだけでした。 : OPEN (5,FIEL = 'OUTPUT.dat') OPEN (6,FILE = 'CON') : WIRTE (6,*) Func1, Func2, : と書き加えたところ、コマンドプロントへ結果が出力されました。 ご教授ありがとうございます!
87 名前:デフォルトの名無しさん [2008/01/23(水) 15:45:53 ] f77をしようしています。 2つの整数の約数と、最大公約数と最小公倍数を求めるという プログラムを書いてもらえませんか?
88 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:40:48 ] >>87 最大公約数 最小公倍数 fortran でググレ
89 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:51:56 ] >>87 素直に宿題で出ました。困ってます と書いたら、誰か書くかも。
90 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:00:34 ] 宿題は自分でやれ
91 名前:88 mailto:sage [2008/01/27(日) 14:55:01 ] >>87 最大公約数 最小公倍数 fortran でググったのか? 検索結果の一番上に出てくるが。
92 名前:デフォルトの名無しさん [2008/01/28(月) 17:49:50 ] 自分も宿題なんですけど質問します 数値積分で、n個の台形の総和で近似する場合のプログラムなんですけど、 繰り返し文使いますよね? DOからCONTINUEの間に、面積の総和をSWA、何番目かの台形の面積をSとして SWA=SWA+S って書き込みました SWA=0.0みたいにSWAを初期化する言葉は必要ですか? 家のパソコンではプログラミングできないので教えてください
93 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:38:46 ] FORTRAN の仕様としては初期化は必要ないが、 中には 0 初期化してくれないコンパイラもあるので 初期化しておいた方が無難。
94 名前:88 mailto:sage [2008/01/28(月) 21:45:51 ] >>93 むしろ、subroutine 化したときの暗黙save属性の方が怖くない? オレは A = A + B 型の処理があれば、 脊髄反射でA = 0d0 を加える癖にしている。
95 名前:92 mailto:sage [2008/01/28(月) 22:19:21 ] レスどうもです 初期化したほうが良さそうですね 失礼します
96 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:37:58 ] fortranのプログラムを書くソフトは何を使えばいいのでしょうか? 講義では秀丸をつかってたのですが有料で買えません。 代わりのソフトウェアは何をつかえばいいのでしょうか?
97 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:04:49 ] >>96 汎用フリーエディターなら、TeraPad www5f.biglobe.ne.jp/~t-susumu/ をよく聞くね。 CPad for Salford FTN77 www.vector.co.jp/soft/win95/prog/se153699.html なんてどう?
98 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:30:49 ] >>93 FORTRANの規格では初期値は不定じゃなかったけ? IBM育ちなので、方言なのかもしれんが。 おすえて。
99 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:53:37 ] >>97 ありがとうございました。 下のリンクのほうつかってみます。
100 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:57:34 ] fortran77をダウンロードしセットアップして再起動したのですが、 すべてのプログラムのsalford software というところには デバッッカー(?)と説明文みたいなものだけでfortran77本体らしきものが ありません。 何か問題があるのでしょうか?
101 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:55:24 ] >>100 Cpadを使え
102 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:59:59 ] 本に載っていたコード何ですが文番号やらgotoがいっぱいついていてややこしいので 文番号などを使わない形に書き換えようとしています。 自分でやってみたのですが一部分からないところがあったのでみていただきたいと思います。
103 名前:102 mailto:sage [2008/01/29(火) 16:01:49 ] do 90 lz=lun,lup do 80 lx=llf,lrg 略 if (j.le.0) goto 80 if (j.eq.i) goto 80 do 11 jj=1,10 if (je(i,jj).eq.j) then jk=jj goto 70 end if 11 continue do 12 jj=1,10 if (je(i,jj).eq.0) then 略 goto 70 end if 12 continue 70 xj=x0(j) 略
104 名前:102 mailto:sage [2008/01/29(火) 16:02:19 ] if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then if (i.gt.j) then 略 do 555 jj=1,10 if (je(j,jj).eq.i) then j0=jj goto 554 endif 555 continue 554 call actf(i,j,jk,as,ac,gap) 略 endif else 85 en(i,jk)=0.d0 略 endif 80 continue 90 continue
105 名前:102 mailto:sage [2008/01/29(火) 16:10:06 ] 以上が本のコードです。 条件文以外は削除しております。 doループの80,90やgoto80などは何とか分かったのですが goto70や、goto554がどうなってるのかがさっぱりで・・・ 申し訳ないですがアドバイスお願いします。 先ほどの投稿では書き忘れてましたが 最後の方にある文番号85に関しては無視していただいて結構です。 探して見たところどこにもgoto85はなかったので 本のコードにゴミが残っていたと思われます。
106 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:36:49 ] >>105 f90 を使っていいかどうかと、使用コンパイラーを書こう。 f77 では、cycle exit が(標準では)使えない。
107 名前:105 mailto:sage [2008/01/29(火) 17:57:47 ] 失礼致しました。 一応はFortran77なのですが コンパイラはg77なのでcycle,exitなどは使えたと思います。
108 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:44:49 ] 85は放置、70はjeを探しているだけなので合併で大丈夫なはず、 554のexit はif構文に無関係 do lz=lun,lup do lx=llf,lrg 略 if (j.le.0) cycle if (j.eq.i) cycle do jj=1,10 if (je(i,jj).eq.j) then jk=jj exit end if if (je(i,jj).eq.0) then 略 exit end if end do xj=x0(j) 略
109 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:45:10 ] if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then if (i.gt.j) then 略 do jj=1,10 if (je(j,jj).eq.i) then j0=jj exit endif end do call actf(i,j,jk,as,ac,gap) 略 endif else 85 en(i,jk)=0.d0 略 endif end do end do
110 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 11:06:40 ] >>108 11と12のdoループは、 je=jとje=0の両方が真になることがあれば,合併不可 常に、少なくとも一方は「10回全て偽」になれば、合併可
111 名前:105 mailto:sage [2008/01/30(水) 16:06:53 ] 返事が遅くなって申し訳ないです。 みなさまレスありがとうございます。 11,12ループの所だけを省略せずに抜き出してみました。 do 11 jj=1,10 if (je(i,jj).eq.j) then jk=jj goto 70 end if 11 continue do 12 jj=1,10 if (je(i,jj).eq.0) then jk=jj je(i,jj)=j goto 70 end if 12 continue 70 xj=x0(j) je=jとje=0の両方が真になるかどうかなんですが これをみるかぎり、やってることは両方jk=jjを代入してるだけなんで do jj=1,10 if (je(i,jj).eq.0) then je(i,jj)=j end if if (je(i,jj).eq.j) then jk=jj exit end if end do xj=x0(j) にしてもいいのかな、と思ったのですが。どうでしょうか?
112 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:26:11 ] >>111 111のプログラムは間違い。 je(i,7)=j je(i,3)=0 それ以外は偽、のとき、 jkに何が入るべきか、考えてごらん。 je の取りうる値がわからないので、 この部分だけでは判断できない。 多分、合併はダメ。
113 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:24:44 ] すみません、fortranのプログラムで助けて欲しいのですが open(50,file='test.txt') do i=1,ii read(30,4000)dummy3,(a(i,j),j=1,jj) write(50,4000)dummy3,(a(i,j),j=1,jj) enddo 4000 format(A7,144F8.2) pause というプログラムの144F8.2について 144を変数として扱いたいのですがどのようにすればよいでしょうか・・・ line=144としたとき format(A7,'line//F8.2') format(A7,'line'//F8.2) などではダメでした。整数だと144F8.2の状態だと問題なく走ります。 お助け下さい
114 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:36:34 ] すみません、もっと簡略化して以下でお願いします do i=1,ii read(40,4000)dummy3,(a(i,j),j=1,jj) enddo 4000 format(A7,144F8.2)
115 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:11:48 ] >>113 >>4 内部ファイルを参考にする。 Intel 系コンパイラなら、書式に<>が使える。 number = 144 4000 format(A7,<number>F8.2)
116 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:06:06 ] 俺の方法は character(len=50):: fmt integer:: line write(fmt,*) "A7,", line, "F8.2" do i = 1, ii read(40,fmt) dummy3,(a(i,j),j=1,jj) enddo てやると思う。 数字書き出すときに1桁、2桁、3桁それぞれ別書式にする場合に使ってる。
117 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:45:46 ] しかし、FORMAT文の動的変更は200レス毎に1回くらいは必ず来るなw これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。 漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。 他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw 改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。 文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw
118 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:36:12 ] 良くも悪くも数値計算用言語ですから、 数値を上手く取り扱う方法に目がいって その辺の所は教科書書く人も勉強する人も興味ない。
119 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:25:45 ] >>115 >>116 無事にいけました☆本当にありがとうございました!
120 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:55:37 ] >>118 読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。 まぁ、 1.フォーマット文が文字列や文字変数で与えられる。 2.内部ファイルによって、文字列⇔数値変換が出来る。 という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。
121 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:23:33 ] 執筆者予備軍としての一言 ・VB やJAVA のようにさまざまな発刊企画があれば、 上級者向け書籍が作れるが、Fortran では無理。 ・初心者向け書籍では、内容を厳選するよう要請される。 頁数を少なく、文字数を少なく、挿し絵を充実、などなど。 common や内部ファイルは真っ先に削除対象となる。
122 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:27:04 ] COMMON文の説明なんて要らないから 純粋なFortran95の解説書出してよー F2003でもいいけど
123 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:55:12 ] COMMON 文は F77 では必要悪だが F95 だとバグを産む素でしかない。
124 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:44 ] >>121 コラムとか付録のサンプルとかで、何とか突っ込んでくれ。
125 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:53:35 ] 動的の説明を書かないにせよ character(len=20):: fmt fmt = 'A5,2X,I10' 100 format(fmt) って例が載っているだけでも、 あーこんな使い方できるんだ〜 って思えるよなあ。
126 名前:118 mailto:sage [2008/02/04(月) 01:00:23 ] >>120 質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、 より実用的、応用的なプログラムを組んでる人だと思うんだよね。 Fortranは数値計算とセットでやる事が多いだろうから 優秀な大学じゃないと内部ファイルまでやれないよ。 無理してそこまでやっちゃったら、大切な部分が疎かになったり 数%しか単位取れませんでしたとか言う事態になっちまう。
127 名前:デフォルトの名無しさん [2008/02/04(月) 16:50:31 ] symbol A is not an array こんなエラーが出るんですが何がいけないんでしょう?
128 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:59:12 ] シンボルAは配列ではありません
129 名前:デフォルトの名無しさん [2008/02/04(月) 19:58:45 ] Statement function statement cannot occur here invalid forward reference to label 117 >>128 ありがとうございます ちなみにこれはどうすればいいんでしょう?
130 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:17:37 ] >Statement function statement cannot occur here 文関数はここに存在することが出来ません 実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。 配列や関数の引用の書き方が間違っている可能性もある。 >invalid forward reference to label 117 ラベル117の無効な前方参照 文番号117が参照されているが見つからない。 どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので エラーメッセージは自分でよく読むように習慣づけよう。
131 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:17:27 ] >>129 >>130 氏を補足しよう。 >Statement function statement cannot occur here これは未宣言の配列を用いるとよく出てくるメッセージだ。 配列を宣言し忘れていたり、綴りを間違い、かつ添え字に変数を使っていると出てくる。 FORTRAN77では文関数なるものが導入された。 これは一行で書ける関数を宣言文のところで宣言しておくと、実行文のところで利用できるというものなのだか 大して役に立たないのでほとんど使われない。それだけならよかったのだが、とんでもない副作用が生じてしまった。 実行文のところに、たまたま変数を添え字とする宣言し忘れの配列を使ったとする。 すると見かけ上は文関数の定義のように見えるので、(そういうパターンにマッチしてしまうので) 上のようなエラーメッセージが現れることになる。 例 f(i) = 5 * i + 1 これが宣言文のとこに現れば、f(x) = 5 x + 1 という関数を文関数で宣言したことになるし、 DIMENSION f(10) i = 1 f(i) = 5 * i + 1 .... のような形で現れれば、配列fのi番目の要素に、5i + 1を入れる代入式と解釈される。 この文関数がらみのエラーは、だされるメッセージと実際のエラーの内容が食い違っているので、 FORTRAN77初心者を惑わす罠になっている。 これは必ず通る道なので、まぁ文句言わずにあるがまま受け入れろw
132 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 07:36:18 ] >こんなエラーが出るんですが何がいけないんでしょう? 俺なら「おまえの頭」っていうところだけどな
133 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 11:07:31 ] >>132 うっせー おまえこそ すっこんでろ!w ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!
134 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:24:45 ] FORTRANってなんですか? アプリケーションを作れたりするプログラミング言語なんですか?
135 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:59:57 ] 科学研究をするログラミング言語です
136 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:48:50 ] Linuxでの実行モジュールを作るには、Linuxで開発・コンパイルするしかないんでしょうか? WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・
137 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:42:45 ] Linuxでやるしかないかな。 だけど、コーディングをLinuxでやる必要はないので、 そんなに大変じゃないと思う。 コンパイルオプションをLinux版に変えるだけで 頑張ってMakefile書くくらいで終わりっしょ。 特にVisual Studio + Intel fortran から Intel fortran Linux に行くだけなら つまづくこともかなり少ないと思われ。
138 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:16 ] gcc をクロスコンパイル用にコンパイルしてしまえば 別に Windows 上でも Linux 用のバイナリを作ることはできるが、 Visual Studio 上となると・・・。 自分で makefile 書けば一応いけるのか? まあ、一番の問題はデバッグが大変ってことか。
139 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:58:55 ] ./a.out
140 名前:136 mailto:sage [2008/02/08(金) 00:16:57 ] >>137 ということはWindowsとLinux両方買わないといけない、ってことですよね? コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・ >>138 gccはGNUなだけにその辺偉いのですが、速度が・・・ 数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。
141 名前:136 mailto:sage [2008/02/08(金) 00:21:06 ] 今気づいたのですが、Intel FortranコンパイラをVisual Stuido上で使った場合 出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?
142 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:52:57 ] >>140 学術目的ならLinux版は無期限ライセンス版が落とせる。 >>141 普通のEXEバイナリを吐く。
143 名前:136 mailto:sage [2008/02/08(金) 10:07:16 ] >>142 >学術目的ならLinux版は無期限ライセンス版が落とせる。 ↓ですね。 ttp://www.intel.com/cd/software/products/ijkk/jpn/224378.htm コンパイラ以外も可とは、気前いいですね。 ただ、いくつかはPage Not Foundになってたりしますが・・・ >普通のEXEバイナリを吐く。 そうですよね、安心しました。 そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ どうもありがとうございました。勉強になりました。
144 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 19:45:07 ] VisualStudioがあるのにIntel C++コンパイラ必要? Intelのほうが速いから?
145 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:58:28 ] >>144 FORTRANと組み合わせるならIntelC++の方が楽。 BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。 またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。 無論C++でWin32API叩いたりするならMSの方が有利だろう。
146 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:56:22 ] >>145 なるほど thxです
147 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:58:08 ] かなりどうでも良いことなんですが、 vimで.f90のソースを書いていると、 勝手にインデントをスペースに置き換えられるんですよね。 まあnoexpandtabすればタブ文字で書けるんですが、 syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。 これもsyntaxファイルを改変すれば変えられるのでしょうけど。 fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?
148 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:12:21 ] 常識 1行72文字とか132文字とか制限があるのに 何文字にカウントされるか分からないタブ文字を使うなんて プラットフォーム依存性を無駄に招いているとしか思えない
149 名前:147 mailto:sage [2008/02/11(月) 20:42:23 ] >148 なるほど。文字数の制限があるからですね。 fortran90から入ったので、 ほとんど文字制限を気にした事が無かったから気づきませんでした。 ありがとうございました。
150 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:25:04 ] >>148 > 常識 > 1行72文字とか132文字とか制限があるのに f90 は自由形式だからその制限は無いはず。 f77 は制限アリ。
151 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:50:24 ] >>150 文法書をもう一度読め。 Fortran90は132カラムだ。 Fortran2003ではもう少し増やす。機械生成のコードだと、変数名などが長くなりやすいから。 それにしてもインデントでタブが入るエディターは本当にむかつく。
152 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:55:05 ] 行頭のスペースを勝手にタブ文字に変えられると「タブ形式」と間違えられちゃうよー
153 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:05:18 ] 少なくとも Intel Fortran は1行の文字制限はないよ。 他のコンパイラも大概独自で対応しているんじゃないかな。
154 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:37:30 ] NagのFortran Builder という開発環境を使ってる方いましたら、どんなものか教えてくれますか? ttp://www.nag-j.co.jp/FortranBuilder.htm 他社A他社Bってどこでしょうかね?
155 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:19:44 ] >>153 まぁFortranの規格はISOが決めているから。 各ベンダーの拡張は拡張として。 Intelは確かに原則制限無し、7200文字のようだ。 >Free Source Form >In free source form, statements are not limited to specific positions on a source line. >In Fortran 95/90, a free form source line can contain from 0 to 132 characters. >Intel Fortran allows the line to be of any length. >Fortran source line length > fixed form: 72 (or 132 if /extend_source is in effect) characters; >free form: 7200 characters
156 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:54:10 ] 目が悪くて文字解像度をあげられず、 エディターの一行表示上限が94文字しかないオレ様にしてみれば、 132文字も7200文字も無限と同じ。
157 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:17:43 ] makedepf90、Windowsでビルドできないかなぁ。 みなさんオブジェクトの依存関係とか、どうやって調べてますか? 基本的に1ファイルに1個モジュールで書いてるから use文を抽出さえすれば簡単にできそうか
158 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:40:42 ] うほっ! 前スレに自己出力プログラムが出ていたが、俺も作ってみた。 IntelFortranで確認した。 一応F90の規約にのっとっている。以前上げられていた奴より分かりやすいのではと思うが如何? ここでCHR(39)は『'』。 CHARACTER(LEN=68)::f f='("CHARACTER(LEN=68)::f"/"f=",3a/"PRINT f,CHAR(39),f,CHAR(39)"/"END")' PRINT f,CHAR(39),f,CHAR(39) END
159 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:52:02 ] Vistaで使えるフリーのfortran90コンパイラってありますか?
160 名前:デフォルトの名無しさん [2008/02/13(水) 17:24:29 ] どうやってもこのエラーが消えないけどどうしたらいいんだろう? assignment between arrays of differing rank
161 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 17:38:11 ] >>159 Vista + Cygwin + gfortran or g95
162 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:50:54 ] >>159 Silverfrost の FTN95 かな。Vistaで動くかは知らんがw ttp://www.silverfrost.com/11/ftn95/overview.asp >>160 配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。
163 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:44:10 ] FORTRAN90 を勉強している者ですが構造体を下記のプログラムのように 使いたいのですがエラーがでてしまいます。m と n は、上位ルーチンのみ で固定させたい(下位ルーチンにはサブルーチンの引数でサイズを渡したい) のですが上手い方法をお教え頂けますでしょうか?構造体を使わず、 a(n,m) i(n,m) と配列にすればいいのでしょうが構造体を使って 書きたいので質問させて頂きました。よろしくお願い致します。m(_ _)m program test implicit none integer,parameter::m = 1 integer,parameter::n = 1 type kouzou real(8)::a(n) integer::l(n) end type kouzou type(kouzou)::data(m) call dataset(data,m) write(*,*) data(1)%a(1) write(*,*) data(1)%l(1) end program subroutine dataset(data,m,n) implicit none integer,intent(in)::m,n type kouzou real(8)::a(n) integer::l(n) end type kouzou type(kouzou),intent(out)::data(m) data(1)%a(1) = 3.0d+00 data(1)%l(1) = 2 return end
164 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:23:42 ] >>163 記憶が正しければ、それはFortran95以前では出来ない。 TYPEの中の型やサイズを引数にするのは、Fortran2003で導入される機能だ。 Fortran95以前で実現するには、POINTER属性で宣言してメインでALLOCATEするのかな? ただ、単にTYPEの宣言を1ッ箇所で済ませたいだけならば、独立したMODULEでTYPEを宣言して あとは残りのルーチンでそれをUSEすればよいと思う。 MODULE m_type IMPLICIT NONE integer,parameter::n = 1 type kouzou real(8)::a(n) integer::l(n) end type kouzou END MODULE m_type ! MODULE m_subs USE m_type CONTAINS subroutine dataset(data_,m) implicit none integer,intent(in)::m type(kouzou),intent(out)::data_(m) data_(1)%a(1) = 3.0d+00 data_(1)%l(1) = 2 return end subroutine dataset END MODULE m_subs ! program test USE m_subs (以下略 (ここではm_typeをカスケードに呼んだが
165 名前:デフォルトの名無しさん [2008/02/17(日) 11:02:41 ] スレチと思うけど質問させてください。 計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって 何て言う名前ですか?フリーウェアですか?
166 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:10:40 ] >>165 それはジョブ管理システムというものだ。 ググレばなんか出てくるだろう。 普通はメーカー毎・OS毎に独自のものがある。 LinuxとかだとLSFというのが主流の気がする。 UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。
167 名前:165 [2008/02/17(日) 14:40:22 ] >>166 ググって色々調べてみたところ「Generic NQS」ってのが フリーみたいですね。 自宅で数値計算をして遊んでみようと思いまして(;^_^A どうも返答有り難うございました。
168 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:25:42 ] Intel Visual Fortran での、Windows用グラフィック・ルーチンを作っています。 プロトタイプができているので、興味がある人は見てみてください。 ttp://d.hatena.ne.jp/fortran66/ やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、 普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。 変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。 大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと 思っています。
169 名前:163 mailto:sage [2008/02/17(日) 23:44:38 ] >>164 さん 丁寧なご回答どうもありがとうございます!! 返信が遅くなり 申し訳ございません。今、intel fortran compiler 10.1 で メイン部分を下記にして動くことを確認できました。 Fortran2003で導入される機能ということで驚いています。 program test use m_subs implicit none integer,parameter::m = 1 type(kouzou)::data_(m) call dataset(data_,m) write(*,*) data_(1)%a(1) write(*,*) data_(1)%l(1) end program
170 名前:163 mailto:sage [2008/02/17(日) 23:45:55 ] 実は、私がやろうとしていたのは、構造体のサイズ m とその中の要素の サイズ n を下記のように入力データのようなものから動的に取得して 構造体の確保を実現させようと考えておりました。 下記のようなプログラムの構造体バージョンが目標でした。 下記の配列バージョンだと確保した配列全部をサブルーチンの 引数でひきずっていかなければならないと思うのですが構造体で 定義しておけば配列をパックにした構造体 1 つを引数で渡せると 考えました。 164 さんに教えて頂いたプログラムの MODULE m_type での 構造体の中の要素のサイズ n は、動的(データで決定)ではなく parameter 文で静的にコンパイル時に確定させなければ ならないんですよね? 長々と書いてしまって申し訳ありません。m(_ _)m
171 名前:163 mailto:sage [2008/02/17(日) 23:46:47 ] program test implicit none integer::m,n read(5,*) m,n call test2(m,n) end program ! subroutine test2(m,n) implicit none integer,intent(in)::m,n real(8),allocatable::a(:,:) integer,allocatable::l(:,:) allocate(a(n,m),l(n,m)) call dataset(a,l,n,m) write(*,*) a(1,1) write(*,*) l(1,1) deallocate(a,l) return end ! subroutine dataset(a,l,n,m) implicit none integer,intent(in)::m,n real(8),intent(out)::a(n,m) integer,intent(out)::l(n,m) a(1,1) = 3.0d+00 l(1,1) = 2 return end
172 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:32:34 ] >>170 そういうことなら、以下のように出来る。 MODULE m_type IMPLICIT NONE type kouzou real(8), POINTER::a(:) integer, POINTER::l(:) end type kouzou END MODULE m_type ! MODULE m_subs USE m_type CONTAINS subroutine dataset(data_,m) implicit none integer,intent(in)::m type(kouzou),intent(in out)::data_(m) ← INOUTにしないと駄目みたい。 data_(1)%a(1) = 3.0d+00 data_(1)%l(1) = 2 return end subroutine dataset END MODULE m_subs ! program test USE m_subs implicit none integer,parameter::m = 1 INTEGER :: n = 2 type(kouzou)::data_(m) ALLOCATE(data_(1)%a(n), data_(1)%l(n)) call dataset(data_,m) (以下略 ただALLOCATEは配列の全要素にいちいちやらないと駄目。解放も面倒。コンパイラによってはPOINTERはALLOCATEでも可。
173 名前:163 mailto:sage [2008/02/18(月) 14:44:48 ] >>172 さん、本当に感謝です!! 上手くいきました。 ありがとうございます!! m(_ _)m 下記にすることで動的に確保できました。 上手い方法があるもんですね... ただ、指摘された以下の場所は、私が試したところでは、inout で なくても OK でした。 type(kouzou),intent(out)::data_(m) あと、解放ですが deallocate(data_) 一発で OK? program test use m_subs implicit none type(kouzou),allocatable::data_(:) integer::i,j,m,n read(*,*) m,n allocate(data_(m)) do j = 1,m do i = 1,n allocate(data_(j)%a(i),data_(j)%l(i)) end do end do call dataset(data_,m) write(*,*) data_(1)%a(1) write(*,*) data_(1)%l(1) deallocate(data_) end program
174 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:15:43 ] >>173 多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。 Fortran2003で可能になる機能だが実装されている。 >あと、解放ですが deallocate(data_) 一発で OK? 多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。 少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ
175 名前:163 mailto:sage [2008/02/19(火) 00:01:59 ] >>174 構造体とポインタの使い方が分かって非常にためになりました。 ありがとうございます。色々と変えてみて試してみます。m(_ _)m
176 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:37:08 ] 単精度をコンパイルオプション一発で倍精度にすることってできますか?