くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0166デフォルトの名無しさん
2009/04/19(日) 14:15:43MPI2にそんな機能があったような
0167164
2009/04/19(日) 20:21:55directアクセスの存在を始めて知りました。
レコード長を把握しておく必要はありますが、効率は良さそうですね。
実際の使い方としては、recl指定子の値をデータの最小サイズで与え、
読みたいレコードの位置を逆算してread文のrec指定子に与える、
という方法で合っていますか?
>>166
なるほど。ということは、Fortranの実装とは別の機能を用いる方法もある、
つまりやり方は色々ある、ということでしょうか。
0168164
2009/04/19(日) 20:54:59>recl指定子の値をデータの最小サイズで与え、
と言うより、そのファイルを作ったときのwrite文のreclと同じ値をread文のreclに与える、
と言ったほうが適切でしょうね。
あと、使っていて気づいたことなのですが、statusを指定せずにopenしてwriteする場合
sequential・・・いったん元のファイルを消した上で書き込み
direct・・・ファイルのレコード位置に対する書き込み
という違いに気をつけないといけませんね。文法的に正確に書けば
sequential・・・強制的にstatus='replace'
direct・・・ファイルがあればstatus='old'、なければstatus='new'
でしょうか。
0169デフォルトの名無しさん
2009/04/20(月) 17:42:55ディスクがフラグメンテーションしてる場合、データの分断を許すような
実装だと、ディスクへのアクセスはアドレスのテーブルみたいのを参照
しながらじゃないと原理的にできないよね
フラグメンテーションしててもデータの分断を許さないような実装なら、
ディスクスペースの使用効率は下がるかもしれないけど、テーブル参照が
不要になるからアクセスが速くなるはず・・・だよね?
速度を要するスパコン用のファイルシステムって、そういう実装なのかなぁと想像・・・
0170デフォルトの名無しさん
2009/04/20(月) 23:17:11ダイレクトアクセス知らなかったのか。
>直接アクセスする
とか書いているから知ってるかとw
昔の映画のコンピュータで磁気テープがグルグル回っているのはダイレクトアクセス
ファイルを読み書きしているんだべなぁ。
0171デフォルトの名無しさん
2009/04/21(火) 03:39:52今で言う、ディスクとメモリの両方を兼ねてたからね。
ほんのちょっと前にFACOMのやつにテープはめるのをした。
あれ、テープのはしっこを挿入口に近づけると空気で吸い込んでくれるのね。
人間の手で全部とりまわさないといけないのかと思ってたよ。
0172164
2009/04/22(水) 15:52:56不勉強故、失礼しました。
ところで、磁気テープというのは今も使われているものなのでしょうか?
今、20半ばの院生ですが、テープというのを見たことがありません。
0173デフォルトの名無しさん
2009/04/23(木) 01:43:48円の場合
function X(a)
X=cos(3.14*a/360)
end
function Y(b)
Y=sin(3.14*b/360)
end
こいつを回せば、円をつくることはできる。でもXは小数点の数字になっているよね。
でもやりたいことは、2次元配列を作成して、F(x,y)のx-yのメッシュの中で
円を作成するには、x−yは整数である必要がある。どうすればいいの?
わかる人いますか?
この円・球構造について、拡散方程式やら偏微分方程式を解きたいと思っているんだけど、
こういうことってできますか?
0174デフォルトの名無しさん
2009/04/23(木) 03:11:150175デフォルトの名無しさん
2009/04/23(木) 06:57:36メッシュが正方格子でなければならない理由はあるんかいな?
Yesならメッシュを細かくするしかないなぁ・・・
節点座標値が整数でなければならない理由はないと思うょ
0176デフォルトの名無しさん
2009/04/23(木) 09:04:46ギザギザがでるし、30度とか45度回転させた初期値境界値で同じ計算すると結果が結構違うにょ。
査読受けたら絶対そこを突っ込まれるにょ。
んで満足いく事例を出せなかったらそこで終わりにょ。
学部生より上なら極座標なり175の言う通り非構造格子にしてきちんとするのがいいにょ。
学部生なら、卒研としてならまあ許されると思うにょ。・・・Fortranと関係なかったにょ。
0177デフォルトの名無しさん
2009/04/24(金) 00:48:54どうしても直交座標にしたいなら、かなり細かくメッシュを区切って、
計算結果にある値をかけて、整数にするとか。
新しく買ったCorei7で計算させたら、滅茶苦茶速くてびっくりした。
PenMのノートで10分かかる計算が1分で出来て、しかも8個同時に走らせても余裕。
64bitOSを積んだから、というのもあるのかな。
0178デフォルトの名無しさん
2009/04/24(金) 05:33:49まあ、これはそうだろうなあ。
>しかも8個同時に走らせても余裕
へえ。よさそうだね。
余裕、というのは「一個の時のまあ8割くらいのスピードで8個とも動く」くらいなの?
0179デフォルトの名無しさん
2009/04/24(金) 16:38:50教官から貰ったコードが正方格子のだったけど、
変更できない、とかかな?
そもそも173のやりたいことがいまいちよくわからない。
Fortranとは関係ないし、ここまでかな
0180デフォルトの名無しさん
2009/04/25(土) 00:30:02特に並列化をしていない(というよりも、並列化がうまくいかなくて結局諦めた)ものを走らせると
大体16%ぐらいのCPU使用率になるから、
8個ぐらい走らせると100%使い切るようになるからね。
この使用率からすると、たぶんそれぞれ8〜9割で動いているといったところかな。
うまいこともっと最適化できないかな・・・。
0181デフォルトの名無しさん
2009/04/25(土) 00:40:55物理CPUは4個だろうから、よほど例外的な場合でなければ多分4つより大だと帰って遅くなるだろう。
0182デフォルトの名無しさん
2009/04/25(土) 14:40:15>>180
ありがとう。
少なくともOSが認識する使用可能なリソースはフルに使い切れるんだね。
>>181
Xeonの2コアが4つ乗ったマシンでOpenMPを走らせると
きれいに8倍になってくれたけど、これとはまたいろいろ設計が違うんだろうな。
0183デフォルトの名無しさん
2009/04/26(日) 01:08:12よく考えたらそうだよなあ…
実際時間を計ってみたら、8個計算の時間 / 2 > 4個計算の時間だし。
ただ、実際には数百から数千個計算するし、それぞれ条件が違うから時間もバラバラで、
その待ち時間を埋めるために、まとめて計算するほうが速かったなあ。
プログラム内でうまく並列化をしてフルに使い切れればいいけれど、なかなかうまくいかないんだよな…。
OpenMPをコマンドを入れたら、かなり遅くなったし。
0184デフォルトの名無しさん
2009/04/26(日) 11:27:08なるほど〜。
どちらかというとたくさんある計算をぼんぼん
放り込んでおける、事がメリットなのかもね。
そうなるとqueueの管理の仕方がみそ?
0185デフォルトの名無しさん
2009/04/26(日) 13:12:42Corei7は、物理4コアをハイパースレッディングで見かけ8コアにしている。
純粋に計算などが重い場合ハイパースレッディングは足を引っ張るだけ。
そのばあいは4スレッドで動かすほうがいい。
MKLのLinpackのBenchmarkをやってみるとどのくらい遅くなるかわかる。
OpenMPのオプションでスレッド数を物理コア数に合わせるようにすると本来の力を発揮する。
あるいはBIOSでハイパースレッディングを切るとかいう手もある。
ただハイパースレッディングが有効な場合もあるので、個別の事情に依る。
自分で試すしかない。
0186デフォルトの名無しさん
2009/04/26(日) 15:36:02ちゃんと1プロセス/1CPUにふってくれるのかな?
0187デフォルトの名無しさん
2009/04/26(日) 23:50:26いや、なんか環境変数にそれなりの指定をしないと、1スレッド1物理プロセッサに
必ず行くとは限らないので遅いまま。
OpenMPのマニュアルの環境変数のところを読めば書いてあったはずだが、
詳しくは忘れたw
0188デフォルトの名無しさん
2009/04/27(月) 12:50:57どちらかというと、dplace や mpirun みたいな並列実行の環境を調えるソフトの
とりあつかう領域だね。dplaceだと
dplace -c1,3,5,7
かな?実機でもってるわけでもないし、いまマニュアルが見れないからわかんねw
HTがあると並列しながら、ふつうの文房具的にPCやWSを使えるわけだから
使い方次第では結構いいかもなあ。
0189デフォルトの名無しさん
2009/05/02(土) 11:50:18作りたいんですけど、書き出す配列を全部列記する以外に楽な方法ってないでしょうか?
0190デフォルトの名無しさん
2009/05/02(土) 19:37:29もう一回計算しなおせ!w
データを後生大事に取っておくのは演算コストが高かった時代の名残。
むろん演算量にもよるがw
0191デフォルトの名無しさん
2009/05/02(土) 20:33:05目的がよく分からないんだけど
コード中の全ての配列をはき出すってこと?
0192デフォルトの名無しさん
2009/05/02(土) 22:53:03行列がスパースなら,非ゼロ項を書き出すことにすれば,ちょっとはマシな気がする。
0193デフォルトの名無しさん
2009/05/03(日) 04:00:14配列の全ての成分を書き出せば良いのであれば
integer a(1:10000)
real b(1:100,1:100)
write(10)a,b
とかではダメか?
0194デフォルトの名無しさん
2009/05/06(水) 06:16:46デバッグとかあるし。
大型計算機とかだと、1計算の時間上限があるからね。
再開するのに必要な情報を全部ファイルとして書き出す選択肢は
持っていた方が良いと思うにょ。
>>193
それがいちばんだね。
書式指定無しでファイルにたたき落とす
違うシステムでは役に立たないけど、メモリの内容をそのままファイルに落とすので
書き込みも読み込み+計算再開も速い。
書式付きもできるけど、めちゃくちゃ遅いし。
0195デフォルトの名無しさん
2009/05/08(金) 14:33:24デバッグ目的以外で、メモリの中身を全部ダンプする必要性が分からないんだが・・・
今時の計算は反復計算などの単純なループ部が計算のほとんどを占めてて
ループ開始前の前処理なんて全体から見れば知れてるわけで、
次回リスタート用のためにわざわざメモリのスナップショットを取る的な発想は今時ないでしょ。
メモリとストレージの速度差が開く一方の今日じゃなおさら・・・・
0196デフォルトの名無しさん
2009/05/09(土) 04:28:25195はあまり大きな計算はしたことがないんだろうな
0197189
2009/05/09(土) 15:11:48あー…書き方があいまいですいません、答えてくださった方ありがとうございます。
えと、粒子法的計算なんですけど、191さんがおっしゃっている通りです。
コード中のすべての配列をはきだしたいです。
193さんのやり方は当然わかりますけど、それだとwriteの後に吐き出したい配列を
列記しないといけませんよね。そういうの無しで全配列をばーっと吐き出す方法ないかな、
と思ったわけです。やっぱ使う配列をコツコツ列記するしかないみたいですね。
>>195
非定常計算なんで状況によっては計算途中の段階から少しだけ条件を変えて
計算したいとかあるんですよ。正直にやったら一週間近くかかるので。
0198デフォルトの名無しさん
2009/05/09(土) 16:24:49質問がひどすぎw
まぁベンダー拡張命令でメモリー全ダンプみたいなことが出来る機種もあった気がするw
0199195
2009/05/09(土) 16:47:04たしかに、スパコンでは数日〜1週間程度の計算しかしたことない。
大きい計算とは言えんか。
スパコンのジョブってたいてい時間制限が数時間のオーダーだから、
例えば30000ステップ計算したいとしたら3000ステップのジョブを
10回投げるってのが普通だよな。
粒子法はよく知らないけど、格子点はどんくらいなの?
0200195
2009/05/09(土) 16:49:29粒子数だっけ?
0201デフォルトの名無しさん
2009/05/09(土) 16:54:07普通は計算再開に必要な変数の数(配列の大きさではないよ)って知れてるよね。
粒子法なら、粒子の位置・速度と経過時間くらいか。
あとはiterationのプロセス毎に計算する量や座標系のように
再生成に計算量のかからないものがほとんどだろうから、
それをとっておく必要はないし。
ふつうに193のやり方で落とせばいいんじゃね?たいした手間でもなし。
ところで、ダンプして落としたとして、変数の変更はどういう風に再開時に反映させる
つもりだったんだろうか?
0202デフォルトの名無しさん
2009/05/09(土) 16:59:47同意。細切れ計算するときに継承すべき情報はあるけど、ダンプする理由はないやね。
ふと、189の「配列全部」は別にダンプではないのでは、と思ったけどオイラの勘違いかな?
0203デフォルトの名無しさん
2009/05/09(土) 17:01:580204195
2009/05/09(土) 17:17:34イメージ的に使ってしまった
0205デフォルトの名無しさん
2009/05/09(土) 17:55:35用途はCFDです。
まあ趣味なので大きな計算は必要ないのですが。
0206デフォルトの名無しさん
2009/05/09(土) 23:52:54論理型を整数型その他に変換できますか?
例えば、いくつかの言語では
(a>b)
等とすると0または1が得られますが
これと同等なことをFORTRANでも行いたいのですが方法がわかりません
無理ならすんなり諦めます
0207デフォルトの名無しさん
2009/05/10(日) 00:55:29一般的な回答としては、できない。
不可能ではないという意味では、IF THEN ELSE でやれば出来る。
意図しているイメージに一番近いだろうと思われるのは、TRANSFER関数で型変換をすること。
しかし、FORTRANの規格では論理型の内部状態を定義していないので
0/1に投影できるかは運しだい。普通は0/-1が多い(真:ビット全部0と偽:ビット全部1)。
0208デフォルトの名無しさん
2009/05/10(日) 01:51:22早速ありがとうございます
何となくですができました
0209デフォルトの名無しさん
2009/05/10(日) 05:17:13real a, b
a=1.0
b=2.0
lonlon = (a .GT. b)
write(*,'(i3)') lonlon
なるものをつくると、
最後の行で型が合わないと怒られる
0がでてくる
1がでてくる
-1がでてくる、
の4パターンあったw
危険だw
0210デフォルトの名無しさん
2009/05/10(日) 21:13:40それかコンパイラオプションをまとめているサイトないですか?
gccのまとめを見ればよいのでしょうか?
0211デフォルトの名無しさん
2009/05/10(日) 21:18:17どういう用途?
論理型が用意されてる言語なら、特に理由がない限りそういうマネはやめたほうがいいかと
シェルスクリプトレベルならよくやるけどさ
0212デフォルトの名無しさん
2009/05/10(日) 21:34:28まずググれ。話はそれからだと思う。
0213デフォルトの名無しさん
2009/05/11(月) 01:13:00こんなオプションあんだ・・・でも何に使うんだろ、ってのばっかだ俺w
0214デフォルトの名無しさん
2009/05/11(月) 12:22:05基本的にはやるべきでない。
0215デフォルトの名無しさん
2009/05/11(月) 20:00:38logical:: L(1)
L = (2.0 < 1.0)
write(*,*) count(L)
L = (1.0 < 2.0)
write(*,*) count(L)
とか
0216デフォルトの名無しさん
2009/05/11(月) 20:37:430217デフォルトの名無しさん
2009/05/11(月) 20:53:393つの条件abcのうち2つ以上が真なら、という場合に、
a = 条件式
b = 条件式
c = 条件式
if (a + b + c >= 2) ...
とか。Cの場合だけど。
0218デフォルトの名無しさん
2009/05/11(月) 21:39:080219デフォルトの名無しさん
2009/05/11(月) 22:35:220220デフォルトの名無しさん
2009/05/13(水) 02:46:284つの式が近くの行にあればいいけど、すごい離れた所にあるといろいろ嫌だよね
0221デフォルトの名無しさん
2009/05/22(金) 20:21:010222デフォルトの名無しさん
2009/05/22(金) 22:46:55READY
0223デフォルトの名無しさん
2009/05/22(金) 23:18:35ifort独自文法のform='binary'でファイルを開いてデータ出力しています。
そのファイルはC言語のファイルフォーマットが公開されているんですが、
unsigned int となっている部分をifortで出力する方法がわかりません。
この部分だけC言語で記述して呼び出す形ならできそうな気がしていますが、
Fortranだけで完結させる方法ってありますか?
アドバイスよろしくお願いします。
0224デフォルトの名無しさん
2009/05/23(土) 01:55:1132bitのunsighned int?
読み込みのほうはINTEGER*4 でうけて、それをINTEGER*8にTRNASFER関数で
適当な位置にコピーするか、出力サブルーチンを作って負数の場合は
INTEGER*8でUINTの場合の数を求めて出すという方法が考えられる。
0225デフォルトの名無しさん
2009/05/23(土) 12:05:07real(8) a
double precision a
どっちやねん、と思ってた。
先日規格を見たら後者だったので、ウヒー!
今後は全部後者で統一する。行が長くなって、チョトいや。
0226デフォルトの名無しさん
2009/05/23(土) 12:13:09どっちでもいい。後者は昔風の書き方。
今はむしろ前者が主流だと思う。
0227デフォルトの名無しさん
2009/05/23(土) 12:40:28うーん、こんなHPもあるからなぁ・・・
4.1 Fortranのデータ型
http://www.nag-j.co.jp/fortran/FI_4.html#AUTOTOC_4_1
コードを見られる可能性がある案件は、規格にならった方が
よさそうな気もする。
0228デフォルトの名無しさん
2009/05/23(土) 17:17:01それは、規格違反ということを意味しているわけではない。
KIND種が規格で決められていないためにベンダー依存になっていることを
問題視しているのだろう。
kd = SELECTED_REAL_KIND(14) とかで、8などの定数べた書きをやめてkdなどに
すれば避けられる。
規格の整合性としては REAL ([KIND =] n) の方が統一的でいいとおもう。
4倍精度が大概のコンパイラでサポートされつつある現状を考えると、REAL(n)の
形式にそろえておいたほうが将来的にものぞましいのではないかと思う。
0229223
2009/05/23(土) 20:23:06回答ありがとうございます。
詳しくないですが、32bitです。
各bitにどうデータが並んでいて、、、ってのを学ばないと難しそうですね。
ちょっとがんばってみます。
0230デフォルトの名無しさん
2009/05/23(土) 20:51:52むしろreal*8が普通だと思ってた。double precisionはむしろ非推奨って話も聞いたことあるぞ。
>>227のnagのページは全部鵜呑みにして良いのか甚だ疑問だわ・・・
つーか、この問題の責任は100%規格にあるだろう。規格作ったやつ出てこい!
0231デフォルトの名無しさん
2009/05/23(土) 22:29:44module xx
integer, parameter :: kd_re = selected_real_kind(16)
:
programm yy
use xx
real(kd_re) a
みたいな感じかな? 一理あるね。
>>230
JIS X3001-1に
『DOUBLE PRECISION型指定子は、組込みの
倍精度実数型のデータ要素を宣言するのに用いる』
とあるから、非推奨ってこともないだろ。
0232デフォルトの名無しさん
2009/05/23(土) 22:45:57FORTRAN66までは倍精度宣言は DOUBLE PRECISION
だけだったのだが、その後の流れで FORTRAN77では REAL*8
Fortran90でREAL([KIND=]8)の形が出てきて、だんだんと
REAL([KIND=]8)の形に統一しましょうという流れだと思う。
>>230
Fortran90策定の頃は、ベンダー毎にアーキテクチャーも数値フォーマットも
文字コードもバラバラだったのでこのくらいは許してやってくれ。
0233デフォルトの名無しさん
2009/05/23(土) 23:03:22書き直すのマンドクサイっす
・・・あんま移植性に拘りすぎるのもどうかと思うけどね。どうせみんなインテ(ry
0234デフォルトの名無しさん
2009/05/27(水) 00:52:40それぞれのサブルーチンで何回も同じ宣言をしなければいけないのですか?
このままだと定数の値を変えるのが非常に面倒なので
一回の宣言で済む方法を知りたいです
0235デフォルトの名無しさん
2009/05/27(水) 01:05:33定数宣言だけのファイルを1つ作って、各サブルーチンの先頭でINCLUDEする。
FORTRAN77の規格外だが大抵のコンパイラはINCLUDE文に対応している。
0236デフォルトの名無しさん
2009/05/27(水) 01:08:13PARAMETER文を用いてなら、標準では無いw
COMMON 変数でよければ BLOCK DATA 文で初期化できる。
ベンダー拡張機能を許せば、INCLUDE を使う手もある。
まぁ、横着せずにラインエディターで一括変換すればよろしいw
0237デフォルトの名無しさん
2009/05/27(水) 01:10:53とりあえずINCLUDE使ってみます
0238デフォルトの名無しさん
2009/05/27(水) 01:11:05モジュールでもいいぞ
0239デフォルトの名無しさん
2009/05/27(水) 02:04:13奴はFORTRAN77と縛りを入れている。
0240デフォルトの名無しさん
2009/05/27(水) 13:47:45entry文を使えば、何とかならない?
0241デフォルトの名無しさん
2009/05/27(水) 14:16:150242236
2009/05/27(水) 23:27:51たしかにENTRY文という手もあったな。
COMMONが嫌で、グローバル変数を実現する代わりに使ったことがあったが、
やっぱ変数全部がグローバルになるせいでデバッグが面倒で
よほど特殊な場合意外はやめたほうが良いと思った。
0243デフォルトの名無しさん
2009/05/31(日) 15:35:51#FAQならすみませんが、ご容赦ください
IVF10.1(11でも)動作したソースを、Linux上のintelに持ち込んでコンパイルしました。
すると、以下のケースに分かれました。
1)あえてコード変換をせずにコンパイル
コンパイルOKも、当然、表示は滅茶苦茶(要するに2バイト系がだめ)
2)SJIS->UTF8にしてコンパイル
FORMAT文の箇所でエラー発生、これがどうしても直らない。
ちなみにエラーメッセージは以下の通りです
0244デフォルトの名無しさん
2009/05/31(日) 15:37:35*//' ... ログ出力ファイルを入れて')
--------^
test.for(14): error #5082: 構文エラー、END-OF-STATEMENT が見つかりました、 <FORMAT_ELEMENT> <FORMAT_INTEGER> < ) <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> ... の 1 つを指定してください。
*//' ... ログ出力ファイルを入れて')
----------------------------------------------------------------------------------------^
このソースは、
100 FORMAT(//' *** test を始めます。***',
* //' ... ログ出力ファイルを入れて')
です。
他にも日本語からの問題なのでしょうか、"認識できないトークンを'?'をスキップしました"というエラーもでます。
なおf77でも同様で、この場合には、
Error on line 14: unbalanced quotes; closing quote supplied
Error on line 14: unbalanced parentheses, statement skipped
となります。
お気づきの点があれば、すみませんが、ご指摘ください。
よろしくお願いいたします。
0245デフォルトの名無しさん
2009/05/31(日) 16:06:32a) kterm上でトライ
b) 使ってる全角文字の中に ' ) あたりの半角と同じ値が混じっている
くらいしか思いつかないや。
少なくともf77のケースでのエラーはb の事を言ってるみたいだけど。
英数字以外は使わないのが一番だけどなあ〜。どうしても使いたかったら
character*2 zenkaku
read(*,*) zenkaku
write(*,*) ichar(zenkaku(1:1)),ichar(zenaku(2:2))
で全角一文字の対応する半角2文字のアスキーコード数がわかるので、強引に出来そうな気もするけどな。
winだと実際上の3行の部分は動くとおもうけど、linuxだとよくわからんね。
linux + fortran+ 2バイト全角文字 の話題はあまりお話を聞かないからうまく行ったらここにも報告してよ。
0246デフォルトの名無しさん
2009/05/31(日) 17:12:19a)kterm
Ubuntu9.04にてktermを入れて、確認。
・UTF8はコンパイル時、文字化け?でダメ
・同じくSJISもだめ
・eucではifortでのコンパイルメッセージの出力が化けている(どれでも同じ??)状況でしたが、実行時は日本語出力OK
でした。
となるとintelFortranのインストールもkterm上から行う方がよかったのか?
まだすべての確認はできていませんが、うまくいきそうという報告まで。b)も後日、試してみますので結果を報告致します。
0247デフォルトの名無しさん
2009/05/31(日) 17:36:04うまく表示できているのは、kterm上で、の場合。通常のconsoleでは(当然っちゃぁ当然ですが)化け化けです。
0248デフォルトの名無しさん
2009/06/01(月) 08:32:25245のbのやつは、対で使われることが多い文字
(ichar()関数の返す値が
' が39、Hexでは27
" が41、Hexでは29
) が93、Hexでは5D
] は34(これはFortranではあまり意味がないか・・)
のようなやつ)が全角に混じってるとダメそうな気がする、という程度の意味で書いてみた。
でも、win版やktermインストだと大丈夫なんだよね。
246さんの意見のとおり、インストール時の設定その他に依存する部分が大きそうな気もするな。
0249デフォルトの名無しさん
2009/06/01(月) 18:51:56まだf77は試してませんが、どうやら文字コードは確かに影響してるっぽい。
問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。
このため、見かけ上、1行内では2バイト換算で70文字程度にしていたものがオバフロしていた模様。
よってifortでは、-FI -132という固定ながら132文字にしたら通りました。
いったい何をしていたんだ…わしorz
ちなみにIVFでUTF8形式でソース保存して、それをWin上でコンパイルしたら妙なゴミが出てました。
結構コード問題は奥が深そうです。
0250デフォルトの名無しさん
2009/06/01(月) 23:28:41知ってる人のような気がする......
tt
0251デフォルトの名無しさん
2009/06/02(火) 01:58:37なか〜まw
そっか、UTFだとエディタの見かけより実際のはるかに長いんだね。試しに
vi でてきとうにUTF使ったファイル開いたら、たしかに row 数が多い。
気を付けよう。
0252デフォルトの名無しさん
2009/06/02(火) 10:58:03確認してないw
0253デフォルトの名無しさん
2009/06/04(木) 23:06:43FORTRAN I/O ERROR 913: OUT OF FREE SPACE
って出てきて途中で計算が止まったっぽいです。
なにやらメモリー不足とのことですが、どう解決すればいいのでしょうか?
0254デフォルトの名無しさん
2009/06/04(木) 23:47:02ハードディスクを増設しろ!
0255デフォルトの名無しさん
2009/06/05(金) 00:14:43I/O エラーだから、メモリーではなくディスクが足りないんだろう。
/tmp とかのスクラッチ領域がパンパンになっている可能性もあるが。
0256デフォルトの名無しさん
2009/06/05(金) 01:44:170257デフォルトの名無しさん
2009/06/05(金) 18:31:50http://www.uic.edu/depts/accc/software/compilers/forterr.html
913 OUT OF FREE SPACE
Library cannot allocate an I/O block (from an OPEN statement), parse array (for formats
assembled at run-time), file name string (from OPEN), characters from list-directed read,
ISAM key descriptor, shared COMMON descriptor, variable-format descriptor, or file buffer.
The program may be trying to overwrite a shared memory segment defined by another process.
Allocate more free space in the heap area (see the beginning of this chapter); open fewer
files; use FORMAT statements in place of assembling formats at run time in character arrays;
read fewer characters; user fewer ISAM keys; use fewer shared COMMON areas; use fewer
variable-format expressions; or reduce the maximum size of file records.
0258デフォルトの名無しさん
2009/06/06(土) 03:03:470259デフォルトの名無しさん
2009/06/06(土) 20:04:27以下のプログラムをexitを使わないで同様の結果を得るには、
どうすればいいのでしょうか?
ご教授願います。fortran90を使っています。
program
real :: r,a
integer :: io !入力結果の状態を表す変数
!
print *, 'CTRl-D を入力すると終了'
!
do while ( .true. )
read(5,*,IOSTAT=io) r
if(io /= 0 )then
exit
endif
a = 4 *3.141592* r ** 2
print *, r, a
end do
!
end program
0260デフォルトの名無しさん
2009/06/06(土) 20:16:431.歴史と伝統のGOTO文で抜ける。
2.READ文で END=nnn で抜ける。
だが元のままEXITで抜けるのがもっとも行儀が良いとされる。
0262デフォルトの名無しさん
2009/06/08(月) 21:37:33>exitを使わないで書き上げろ
exitで抜けるのが一番良いのに、何でこう言ったんでしょ?
0263デフォルトの名無しさん
2009/06/08(月) 22:28:50READ文の指定子の使い方の勉強とかかな。
0264デフォルトの名無しさん
2009/06/09(火) 10:49:220265デフォルトの名無しさん
2009/06/09(火) 11:41:39大丈夫。ただし、初心者にありがちな「エスパーさん、○○作って!」はやめて。
知っている情報をそのまますべて載せるべし。
■ このスレッドは過去ログ倉庫に格納されています