Fortran90をただでコンパイルする方法はないでしょうか?
2 :
デフォルトの名無しさん:01/10/16 15:47
ゼルビス
激しく糞スレ
なんとなく上げ
カレッジにて。
FORTRANのコンパイラでDEBUGとRELEASEってのがあるんですが、大事な計算結果が変わってしまうんですけど、これってどちらの精度がいいかってわからないもんなんですか?
もし知っておられるなら教えて欲しいです。
また、計算結果がわかっていない計算をしてるので、確かめようがないので困ってます。
お願いします。
計算方法がまちがっている。
10 :
デフォルトの名無しさん:01/11/16 13:55
>>7 ではありませんが、同じようなデバッグとリリースで結果が変わります。
何か考えられる原因はないですかね?
実は実際に Fortran でプログラムを作っている人間ではないで確認してませんが、
初期化していない変数を、そのまま出力したりすれば値は変わると思い
ますが、計算結果を代入すれば初期化していないことは結果には関係
ないですよね?
13 :
デフォルトの名無しさん:01/11/16 17:13
DEBUG, RELEASEって最適化レベルのフラグか何か?
そうだったとして、
自分のプログラムのバグ
浮動少数値演算で最適化レベルにより計算結果が違ってくる現象
コンパイラのバグ
一般的にはこの順番で怪しい
>>12 計算で使用している変数の初期化をしていなかったら?
ロジックが誤っていて変数に代入している部分をスキップしていたら?
どうもありがとうございます。
>>13 Windows 上の Visual Fortran のデバッグビルドとリリースビルドですが、
最適化のレベルということになるのだと思います。
で、MSDN を見てみたら、
> コンパイラを最適化すると、予期しなかったようにコードが変化する場合があります。
なんていうのがありました。どうしたら良いのかは書いてないみたいですが。
>>14 なるほど。それはそうですね。それも調べてみないとか。
VC++ なら警告レベルを上げればエラーになりそうですが、Visual Fortran
でもできるのかな。
最適化レベルを上げると演算精度を犠牲にした最適化が行われる場合がある。
ゆえに、DEBUG状態の方が安全だと思う。
Fortran総合スレとして再利用しましょう
で・・・
Fortran関係のWeb掲示板ってどっかにある?
探してもあんまり見当たらないんだけど・・・
18 :
デフォルトの名無しさん:01/11/16 22:20
ナボナはお菓子のFortranです。
19 :
デフォルトの名無しさん:01/11/29 15:59
DEBUG と RELEASEのコンパイルオプションが自分で定義できるはず.
コンパイルスイッチをチョコチョコ変えて原因を探るべし
キット/O2とかそんなところでかかる
20 :
デフォルトの名無しさん:01/12/02 22:03
Visual Fortranを使用していますが、私の場合、
必ず /fltconsistency を使用します。
/fltconsistencyまたは/Opオプションは,Intelシステムでの
浮動小数点演算の一貫性を改善します。
LINUX MLD3 を使っているのですが。XeditでFORTRANプログラムをつくったのですが
f77 -o exsamp78.out exsmp78.fとやってもa.outができないのですがどうしてなんですか?
教えてください。
In article
>>21, 21 初心者 wrote:
> LINUX MLD3 を使っているのですが。XeditでFORTRANプログラムをつくったのですが
> f77 -o exsamp78.out exsmp78.fとやってもa.outができないのですがどうしてなんですか?
man f77
# っていうかふつうratforつかうぞ(って、Linuxのディストリビューションでによ
# ってはratforはいってないのもあるのかなあ)
23 :
デフォルトの名無しさん:01/12/07 02:13
連立一次方程式をガウス・ジョルダン消去法で解きたいのですが、対角成分が0になった時のピボット選択の部分はどういう風にプログラムすればいいのですか?
In article
>>23, デフォルトの名無しさん/23 wrote:
> 連立一次方程式をガウス・ジョルダン消去法で解きたいのですが、対角成分が0になった時のピボット選択の部分はどういう風にプログラムすればいいのですか?
IF文つかえばいいですね。
25 :
デフォルトの名無しさん:02/01/09 02:33
>>25 理解できない。
>>23 対角成分が非0になるように列を入れ替える。
>>7 Intel Inside な場合、Intel仕様とIEEE仕様の違いかも。
i8087 (いしにえのIntel系FPU)の場合、
IEEE math と Intel math という二つのモードがあって、
IEEE で決まっている例外割り込み(桁あふれ等)を有効にするには、
精度の低い IEEE math を使う必要があったと思われ。
#って誰の役にもたっていない...
*****クサカベ警報******
このスレは間も無く駄スレになります。
28 :
デフォルトの名無しさん:02/01/10 23:05
FORTRANをマターリ語ろうよ!
29 :
デフォルトの名無しさん:02/01/10 23:27
日本語の言語仕様書が欲しい・・・
30 :
デフォルトの名無しさん:02/01/10 23:29
31 :
デフォルトの名無しさん:02/01/10 23:30
>>30 Sunのf77あたり。PDFのはみっけたんだけど、書籍になってるのが欲しいッス。
根性で印刷するして、製本するしかない?
32 :
デフォルトの名無しさん:02/01/10 23:34
Sunのf77って使ったことないです。ごめんなさい。
#昔のSunにはf2cが入ってたけど、それじゃないよね。
>29 JISの規格書なら買えるでしょ。一万位だったか?
34 :
かじりたてオーとキャド:02/01/11 22:09
フォートランに関して是非御教授してもらいたいことがあります。
ユニックス・フォートランー>PCフォートランにコンバート作業中なのですが、
ユニックス上で組まれているフォートラン・プログラムの
各ソースプログラムからのサブルーチン経路がわかるようなモノ(ツリー)を
出力することは可能でしょうか? お願い致します。
頼むからカタカナで書かないでくれい。
ちなみに俺はそんなもん知らないヘタレですが。
36 :
デフォルトの名無しさん:02/01/11 23:06
ググールにて、"FORTRAN ftree" 引いてみそ。
おいらが前引いた時は、Fortran77 subset対応っぽい奴しか
見当たらなかったけど。
37 :
デフォルトの名無しさん:02/01/12 01:35
>>34 昔ホストプログラムのやつを手打ちでつくったことあるよ。サブルーチン300個ぐらいのやつ(藁
39 :
デフォルトの名無しさん:02/01/16 22:11
age
43 :
デフォルトの名無しさん:02/02/20 21:27
2度と出てこなそうなスレなのであげ
44 :
デフォルトの名無しさん:02/03/13 18:33
富士通フォートランで扱える行列のサイズはどのくらいですか?
教えてください.
漏れはAIX-FORTRAN〜HPFだから知らん。
配列の次元数上限ならまだしも、サイズ上限って、、、
OSや環境依存でないの?
46 :
デフォルトの名無しさん:02/03/13 20:07
>>45 初心者ですいません.そうです,配列の次元数上限のことです.
いくらぐらいまで正常にプログラム回りますか?
47 :
デフォルトの名無しさん:02/03/15 15:00
整数型から文字型、文字型から整数型へ簡単に変換する方法はないでしょうか?
48 :
デフォルトの名無しさん:02/03/16 12:52
現在でも、使ってます。やはり大量データの計算処理は
fortranが早いから、使ってます。ところで算術比較で.EQ.とかって
あるけど==とか、<=とかはfortran90から使えるの??
誰かおしえてー。
>48
そういった記号はf90から使えるよ。
自由書式(132桁まで)にも対応してるので
すごく使いやすくなった。
さげ
51 :
デフォルトの名無しさん:02/04/25 10:48
Fortran Powerstation(Win)を使っています。
つい最近Fortranを再インストールしたら
fatal error C1007:
というエラーがでてコンパイルできなくなりました。
誰か対策方法教えてください〜。お願いします。
↑自分で解決しました。環境変数がうまく設定していなかったようでした。
Compaq Visual Fortran で、COMサーバ作っている人いないかな
54 :
デフォルトの名無しさん:02/05/15 20:35
漏れの研究室、ひそかにfortranでプログラム使ってる。
欝山車脳。
うちの部署は堂々とFORTRANでWinアプリを作っていますが、何か?
とはいえ、鬱だ。
56 :
デフォルトの名無しさん:02/05/19 01:06
漏れの先生の主張は一つの言語を使いこなせれば、応用が利くから大丈夫。
とは言え少々欝だ
Fortran使いこなしても、応用利く言語ってかなり少なそう。
Fortran95だと別にAdaあたりとほとんどかわらんけどな。
構造体もポインタも使えるし。
>>47 > 整数型から文字型、文字型から整数型へ簡単に変換する方法はないでしょうか?
READ文、WRITE文を使えばOK。
こんな感じ
READ(INUM, 'I4', CNUM)
でいいと思った。(しばらく、FORTRAN使ってないので、細かいところで
間違っている可能性あり。)
>>47, 59 補足
文字型=>整数型 READ(CNUM, '(I4)') INUM
整数型=>文字型 WRITE(CNUM, '(I4)') CNUM
ですかね。
61 :
デフォルトの名無しさん:02/05/28 22:05
スレ違いかもわかりませんが、ちょい質問です。
FORTRAN サブルーチンを C(C++) から呼び出すとき、
文字列の配列はどうやって渡せば良いのでしょうか?
ええと、FORTRAN の CHARECTER C(3)*10 みたいな要素に、
C 側から放り込むやり方についてです。一応、自分でも試しました。
C++ で同じ文字列長の char 配列を複数用意し、
ポインタ配列を使って (配列*文字列) を表現したあと、
extern "C" fsub_( int& 配列数, char* 配列, int 文字列長 );
な関数宣言をしておいて、
SUBROUTINE FSUB( arr, cha )
integer arr
character cha(arr)*(*)
といった感じのサブルーチンに渡してみたのですが、
まともに動いてくれません。何故か文字化けします。
単純な一個の文字列ならうまく行ったんですけど…。
これが出来るようになると、ウチの研究室で FORTRAN を使う必要が
なくなって、非常に助かります。誰か偉いひと、ご支援ください。
ちなみに、コンパイラは g77 & g++ (2.96) on linux です。
文字化けした中身を、od -xc か dump で表示してコピペしたら?
>61
文字1個で上手くいくならループを回して1文字ずつ送れば良いような。
と思ったが、ちこっと調べてみたら、
最後のNULL文字以降を殺しておくこと(NULL文字以降も一緒に送られてしまうから)
for (i = strlen(<文字列>); i >= <配列長>; i++){
<文字列>[i] = ' ';
}
とやっておく、或いは、fortran側で、
<文字列> = <文字列>(1:<配列長>-1)
とやるか。
> これが出来るようになると、ウチの研究室で FORTRAN を使う必要が
> なくなって、非常に助かります。誰か偉いひと、ご支援ください。
fortran使いがまた減るのか・・・
…解決しました。自分、アホでした。
ポインタ配列×文字列なんぞ使ってたのが悪かったわけで、
素直に char c[3][5]; とか宣言したらすんなり動きました。
>63
Cでメインルーチン組んだ方が応用ききますからねえ。
でも、細々としたところでは、まだ頼る必要があります。
あるプログラムをVisualFortranで動かそうとしているのですが、動くときと動かないときがあります。
具体的な条件は以下のとおりです。
1.VisualFortran6.6(最新)付属のコマンドプロンプト上では動かない。
2.VisualFortran6.6のデバッカつきのもので動かすとちゃんと走る。
3.VisualFortran(バージョン97)では付属のコマンドプロンプトでも動く。
というものです。ちなみに1の動かないところでは「MATH〜」とエラーメッセージが出ます。
ですので、0割りなどが考えられるのですがそれならば2、3のケースでも動かないはずですよね?
ということで本当によくわかりません。
どなたかわかる方がいましたら教えてください。
抜け落ちている情報がありましたら指摘していただければすぐに書きます。
>>65 > 抜け落ちている情報がありましたら指摘していただければすぐに書きます。
「エラーメッセージは正確に」って、さっき言われたでしょ?
ごめんなさい、エラーは、以下のとおりです。
run-time error M6201: MATH
- exp: DOMAIN error
Image PC Routine Line Source
pipe.exe 00430649 Unknown Unknown Unknown
pipe.exe 004304A7 Unknown Unknown Unknown
pipe.exe 00430601 Unknown Unknown Unknown
pipe.exe 00432998 Unknown Unknown Unknown
pipe.exe 0043240E Unknown Unknown Unknown
pipe.exe 00458AEC Unknown Unknown Unknown
pipe.exe 00452BE8 Unknown Unknown Unknown
pipe.exe 0042B919 Unknown Unknown Unknown
pipe.exe 00401672 Unknown Unknown Unknown
pipe.exe 0045C869 Unknown Unknown Unknown
pipe.exe 0044DCC4 Unknown Unknown Unknown
KERNEL32.dll 77E5D326 Unknown Unknown Unknown
>65
おそらくそんなに早くは実のあるレスがつかないと思われるので
気長に待ちなされ。
>68
はい、わかりました。
>>67 > run-time error M6201: MATH
> - exp: DOMAIN error
は、exp() のドメイン (引数の有効範囲) を逸脱したってことだから、
exp() の引数がおかしくなってると思う。 (でも、マイナス方向は -∞ まで、
行っても大丈夫だし、プラス方向はオーバーフローエラーになるような気がする
が...。初期か忘れとかで浮動小数点として認識できないような値なんだろう
か ?)
とりあえず、問題の行は 00430649 番地にあるから、それを見直してみれば ?
(MAP ファイルの出し方と見方はわかるかな ?)
>70
レスありがとうございます。
MAPファイルってぜんぜんわからないんですよね。。。
VisualFortran特有のものですか?
>>71 ごめんよ、俺は VisualFortran つー奴は使ったこと無いので、ヘルプ
ファイルしか読んでないんだけど、Project Settings の Fortran タブ
のRun Time カテゴリにある Generate Traceback Information を
チェックしてビルドしてみてちょうだい。これで現象が再現したら、
トレースバック情報が...
forrtl: severe (24): end-of-file during read, unit 10, file ...
Image PC Routine Line Source
teof.exe 004011A9 AGAIN 21 teof.for
teof.exe 004010DD GO 15 teof.for
teof.exe 004010A7 WE 11 teof.for
teof.exe 00401071 HERE 7 teof.for
teof.exe 00401035 TEOF 3 teof.for
teof.exe 004013D9 Unknown Unknown Unknown
teof.exe 004012DF Unknown Unknown Unknown
KERNEL32.dll 77F1B304 Unknown Unknown Unknown
と言うようにでるから、エラーメッセージのすぐ下の行の LineNo が問題
の行です。
これで再現しないなら、さっきチェックした Generate Traceback
Information のチェックボックスをクリアして、今度は同じ Fortran
タブの その他 カテゴリにある Generate Link Map チェックボックスを
チェックしてビルドしてね。そうすると、pipe.map (この名前が嫌なら、
Link タブの Debug カテゴリの Mapfile Name テキストボックスに好き
な名前を入れれば変更できます。) って言うファイルが作られます。
それには、関数の名前と開始アドレスが載ってるから問題の関数までは
これでわかる。(念のため再度実行して、エラーのアドレスを再確認のこ
と。) その関数に複数の exp() が使われてるなら、ヘルプで
/MAPINFO:LINENO を調べて、それを指定する。そうすると MAP ファイル
に行番号毎のアドレスが出力される。
> MAPファイルってぜんぜんわからないんですよね。。。
> VisualFortran特有のものですか?
MAP ファイル自体は、一般的な用語。コードとか、グローバル変数なんか
がどの番地に配置されているかの対応表のこと。
73 :
デフォルトの名無しさん:02/06/24 23:47
俺、そのあたり いにしえの IBM 5550 MS-Fortranでしかやった事ないけど(ワラ
C言語で言うところの matherr.h みたく、
浮動小数点例外をハンドリングするルーチンってFortranで書けなかったっけ(処理系依存 or IEEE規格)?
C言語なら、浮動小数点例外の発生したオペレーション名と引数(最大2つ)を構造体で取れるので、
forrtl: DOMAIN error: exp(NaN) (NaN = 0xffffffffffffffff)
みたいな表示をする事も可能だよ。
つうか、デバッガーの上で走らせる...と問題なく動くんだっけ(汗
74 :
73 (横に逸れますが):02/06/24 23:59
って事で、処理系のマニュアル or ヘルプファイル検索したら、
浮動小数点例外(やその他のエラー)を、人間様が判る形で表示する方法が
解説されてると思うよ。
#ちなみにIBM 5550の MS-Fortran 1.0のエラーハンドラーは、関数呼び出しタイプが _pascal だったような(汗
# i80286時代の標準言語って、pascal〜ADAだったんだよねー (遠い目
しかし、
>>72の end-of-file during read って懐かしー。
FortranのREADって(Cのと同じく)トラブルのスクツだよねー。
Kernighan & Plauger が RATFORで Cモガキやったのもむべなるかな。
> FortranのREADって(Cのと同じく)トラブルのスクツだよねー。
まあ、どんな言語でもそうだよね。つーか、人間でも言葉喋るより聞く方が難し
いよね。出力は、(大体) 自分の思うとおりできるけど、入力は相手次第だから
ねぇ。
ところで、のと の問題は解決したのかなぁ。
>70
レス遅れてごめんなさい。
ちょっと忙しかったのでまだ言われたとおりにやってみていません。
でも、アドバイスありがとう。
もうすぐやるつもりです。
>70
やってみました。
VisualFortranをさわったことないのに調べていただいて
ありがとうございます。
Generate Traceback Informationをチェックして〜というのは、
はじめにも書きましたがデバッカモードでやらせるとプログラムは
問題なく走るので原因究明にはなりませんでした。
Generate Link Map チェックボックスを チェックして〜というのは
その他のタブ、が見つけられなかった(日本語はないと思うのですが)ので、
やれませんでした。
しかし、いずれにせよこのケースは上のようにプログラムは走ってしまうと
思います。
走らないのは付属のMSDOSプロンプトを使ったときだけなので。
>>77 > デバッカモードでやらせるとプログラムは問題なく走るので原因究明に
> はなりませんでした。
使ってないんでよくわからないけど、「Generate Traceback
Informationをチェックして」作った実行ファイルを「付属のMSDOSプロン
プト」で実行できないの ?
> その他のタブ、が見つけられなかった
う〜〜〜ん、ヘルプファイルにははっきり「その他」って書いてあるんだ
よなァ...。俺も変だとは思ったんだけどね。じゃあ Others とか
Miscellaneous とか言うカテゴリはないの ?
> しかし、いずれにせよこのケースは上のようにプログラムは走ってしま
> うと思います。
基本的にそんなことはない。Generate Link Map と言うのは、あくまでも
MAP ファイルを作るだけで、実行ファイルは同じものができる。
極端な話、他のオプションが変わってないなら、MAP ファイルだけ作って
00430649 がどの関数か当たりをつけると言うこともできるはず。
とりあえず Generate Link Map がわからないであれば、Project
Options: って言う所 (/include "Release" とかいっぱい書いてあると
ころ) の最後に /MAP /MAPINFO:LINES を入れてビルドし直してみて。
>>67 PowerFortran使った事ありませんが... (MS-Fortranだったもので)
>run-time error M6201: MATH
>- exp: DOMAIN error
>Image PC Routine Line Source
てのが、デバッガーでは出ないつうのは、
デバッガーでは例外検出しないモードか、
あるいは例外検出しても計算続行するモードになってるんじゃないのかなー?
>70
やってみました。
>使ってないんでよくわからないけど、「Generate Traceback
>Informationをチェックして」作った実行ファイルを「付属のMSDOSプロン
>プト」で実行できないの ?
ナイスアイデアですね!
というか当たり前なのでしょうか?
しかし、実際やってみると不思議なことにexeファイルを作らずに
やってしまうみたいです。デバッカモードは。
なので、DOS窓で/tracebackというコンパイルオプションをつけて
やってみました。
すると以下のようになりました。
run-time error M6201: MATH
- exp: DOMAIN error
Image PC Routine Line Source
pipe.exe 00430A69 Unknown Unknown Unknown
pipe.exe 004308C7 Unknown Unknown Unknown
pipe.exe 00430A21 Unknown Unknown Unknown
pipe.exe 00432DB8 Unknown Unknown Unknown
pipe.exe 0043282E Unknown Unknown Unknown
pipe.exe 00458F0C Unknown Unknown Unknown
pipe.exe 00453008 Unknown Unknown Unknown
pipe.exe 0042BD39 Unknown Unknown Unknown
pipe.exe 0040D64E SMGSGS 2966 pipe.f
pipe.exe 00401672 MAIN 139 pipe.f
pipe.exe 0045CC89 Unknown Unknown Unknown
pipe.exe 0044E0E4 Unknown Unknown Unknown
KERNEL32.dll 77E5D326 Unknown Unknown Unknown
この139行目はサブルーチンSMGSGSをCALLしているところで、2966は
CF=1.D0-EXP(-YP/26.5D0)
というコードになっています(すみません、すべては見せられないので)。
たしかにEXPが使われているところで、あやしいのですがEXPは引数が0でも
問題ありませんし、ここでエラーになる要素がないような気がするのですが…。
81 :
デフォルトの名無しさん:02/06/25 23:05
linuxのfortranはネームリストの読み込みが変だ(った)
>>80 とりあえず、その直前で YP (実数型だよね) の値を出力してみたら ?
> ここでエラーになる要素がないような気がするのですが…。
>>70 にも書いたけど、確かに exp() の定義域は -∞〜+∞ だから DOMAIN
error になるのは、YP がおかしいような気がする。
> DOS窓で/tracebackというコンパイルオプションをつけてやってみました。
よくわからんのだけど、DOS 窓でコンパイルしないとだめと言うことか ?
visualfortranのウォッチにはバグがある
YPの値が知りたい。必ず落ちるのか、特定の値のときだけ落ちるのか・・・
すまそ。リロードしないで書き込んだらかぶってしまいまいた。ROMってます。鬱
みなさん、レスありがとうございました。
YPの値はNahでした。
それだとEXPはだめなんですかね。
ただいまどこからNahが出てくるのか探しています。
83さんのコメントが気になるのですが本当ですか?
最適化をやめさせるとか。
最高レベルの最適化をするとコードが動かないこと多し。
最適化というのはどのようなことですか?
コンパイルするときにレベル、というのは決定するのですか?
メニューのプロジェクトー設定タブかなんかにありませんか?
90 :
デフォルトの名無しさん:02/06/26 17:33
f90でcのマクロ定義#defineに相当するようなものってあるのでしょうか?
visualFortranのhelp探してるんだが、それらしきのが出てこない。
同じ定数をいろんな関数の中で使ってるのだが、桁数が多くて
間違いの元になりそうだから、#defineで定義できれば楽になると思ったんですが。
それとFortranって変数に数値ぶち込むときdoubleだったらいちいち
1.d0とかやらないとだめなんですね。cだったら単に1でいいのに。
型チェックがきびしいんでしょうか。
>>86 Nah ? Nan (Not a Number) じゃなくて ? どういう値なんだろうか...。
まあ、地道に追っていくしかないかな。頑張ってね。
>>87 そうそう、最適化するとお前みたいなへたれの書いたプログラムは動かんことが
多いよね。
>>90 数値定数でいいんなら、PARAMETER 文でいいと思うけど。
>>91 >数値定数でいいんなら、PARAMETER 文でいいと思うけど。
んで、複数ファイルに同じパラメータ書くのは冗長だから、
パラメータは共通ファイルに書いといて、
!include ディレクティブとか #include で取り込みたいものですね。
c んで、UNIXのF77で fppとかcppとかm4とかsedとか使ってプリプロセスしてやると、
c F77爺に「処理系依存するソースコード書くなゴラァ」とか怒られる罠。
c F77爺って、一体この25年間ナニやってたのか、25分程問い詰めてみたい気分
>>92 > include ディレクティブとか #include で取り込みたいものですね。
VisualFortran とかならできますけど、それが何か ?
ん、F77爺にF77互換で書けって言われなくて幸せですね。
95 :
デフォルトの名無しさん:02/06/27 12:41
helpでinclude検索してみました。
Fortranでもこんなことできるんですね。
昔のF77fortranに比べたらf90って、いろんなほしいなって思った
ものが実装されてるんですね。
なんだかC,C++のまねのような気もしますけど。
プログラムファイルをコンパイルする時,
インクルード文も一緒にコンパイルするんですか?
97 :
デフォルトの名無しさん:02/06/27 17:31
たぶん、includeで指定されてるファイルをそこに展開するんだと思うが。
コンパイラへの命令みたいなものじゃないでしょうか。
>>97 すんません,展開するってのはプログラムファイルが入っている
フォルダに入れる ってことでいいんでしょうか?
みなさん、いろいろありがとうございました。
解決、までには至ってないですが、エラーの原因はつきとめました。
結局、アルゴリズムが悪かったようです。
Aという倍精度の実数をIF文で0の場合をはじいておいても、
A=AQRT(A)
とするとどうやらA=0となってしまうことがあるようです。
なので、そのあとでB/Aをすると0割りによりNanになるみたいです。
0割りを防ぐにはどのようにIF文などをつければいいのでしょうか?
案があれば聞かせてください。
AQRTってなんですか?
すみません、SQRTの間違いです。
打ち間違えました…。
Aで割る前にIFでAのチェックをするとか
ごめんなさい、間違えました。
というか↑の状況なら何も難しいことはないですよね。
IF文でAを0より大きいか0かで分岐させても、表示させると
どうやらA=0でもIF文の中に入ってしまうことがあるのです。
ちゃんと0として入らないときもあるのですが。
とても小さい値のときにIF文に入ってしまうようで、しかし
そのあとAで割るとNanになってしまいます。
IF文のところを0でなく1.0D-307とすると大丈夫なのですが、
(倍精度は307桁まであるようです)そのままではコードとして
あまりに決まりが悪いので、何か方法はないでしょうか?
a=1/∞みたいな感じの値で割ってしまって結果の値が∞になって爆発してるとかじゃないでしょうか?
確か浮動小数点の場合0はある程度幅を持っていたような気がします。
VisualFortranのヘルプで”浮動小数点環境”って検索してみれば、
なにやらいろいろ書いてあります。日本語版ヘルプはコンパックのホームページからダウンロードできます。
105 :
デフォルトの名無しさん :02/06/28 04:23
>>103 そもそも実数型に対して、.GE.だとか、.EQ.だとか、等号を問題にする
ような判定式を用いるのはまずい。例えばAが0かどうかを判定するのに、
A.EQ.0.0D0とは書かずに、DABS(A).LT.DEPS(DEPSはDATA文で1.0D-10などと
定義しておく)という風に書くのはFORTRANではごく普通のやり方。
「コードとして決まりが悪い」などということはない。
というか、値が1.0D-100とか1.0D-307(w とかいうのはもうゼロと同じ
なのであって、これと0.0D0を区別して、前者の場合は正しく動くが、後者
の場合は正しく動かないというのは、プログラムのロジックに問題があると
思うぞ。誤差の問題に関して脳天気なプログラムと推察する。この観点から
プログラム全体を見直すべし。
106 :
デフォルトの名無しさん:02/06/28 04:25
>>103 そもそも実数型に対して、.GE.だとか、.EQ.だとか、等号を問題にする
ような判定式を用いるのはまずい。例えばAが0かどうかを判定するのに、
A.EQ.0.0D0とは書かずに、DABS(A).LT.DEPS(DEPSはDATA文で1.0D-10などと
定義しておく)という風に書くのはFORTRANではごく普通のやり方。
「コードとして決まりが悪い」などということはない。
というか、値が1.0D-100とか1.0D-307(w とかいうのはもうゼロと同じ
なのであって、これと0.0D0を区別して、前者の場合は正しく動くが、後者
の場合は正しく動かないというのは、プログラムのロジックに問題があると
思うぞ。誤差の問題に関して脳天気なプログラムと推察する。この観点から
プログラム全体を見直すべし。
スマソ。何故か連続投稿。???
>105
>というか、値が1.0D-100とか1.0D-307(w とかいうのはもうゼロと同じ
>なのであって、これと0.0D0を区別して、前者の場合は正しく動くが、後者
>の場合は正しく動かないというのは、プログラムのロジックに問題があると
>思うぞ。
すみません、理解力がないためか、前者と後者とは何を指すのでしょうか?
もし1.0D-100とか1.0D-307のことを指しているのなら、どっちもちゃんと
動きますよ。動かないのは0.0D0としたときだけです。
何を言いたいのでしょうか?
>誤差の問題に関して脳天気なプログラムと推察する。この観点から
>プログラム全体を見直すべし。
言われたとおりそうします。
しかし、
>DABS(A).LT.DEPS(DEPSはDATA文で1.0D-10などと
>定義しておく)という風に書くのはFORTRANではごく普通のやり方。
とありますが、このごくふつうのやり方ではDEPSより小さくて0.0D0より
大きい値をIF文に入れることはできないですよね。
でも本当はそうしたいわけなので、根本的解決になっていないような気が
するのですが…。
とんちんかんなことを言っていたらごめんなさい。
109 :
デフォルトの名無しさん:02/06/28 18:44
本当の0だけを取り除いて、0に非常に近いけど0じゃない値は
使いたいということでしょうか?
浮動小数点の値はどんな感じのビットになっていて、0の場合だけを
ビット演算ではじくとははどうでしょう?
0の場合のビットパターンを用意して、判定したい値とXORとって
ビットが全部0なら0、一つでも1があったらビットパターンが違ってたってことで0でないというのはどうでしょう?
自分でやってみた訳じゃなくて、単なる思いつきだからどうなるかは判りませんが・・・
>>108 前者…1.0D-100や1.0D-307
後者…0.0D0
要するに1.0D-100や1.0D-307は0.0D0と同じものと見なすべきだと
言いたかったわけです。
>とありますが、このごくふつうのやり方ではDEPSより小さくて0.0D0より
>大きい値をIF文に入れることはできないですよね。
>でも本当はそうしたいわけなので
ここが一番気になるところ。「そうしたい」というのは、DEPSより小さくて
0.0D0より大きい値は、0.0D0とは区別して「正しく」処理したいということ?
それだとA.NE.0.0D0などと書くのと同じで、DABS(A).GT.DEPSというように
Aを0とみなす範囲を広くとった意味がまるでなくなることになる。
本当に1.0D-20などを0.0D0とは区別して計算したいのですか? こういう区別を
しなければならないようなプログラムには根本的な問題があると思うわけです。
111 :
デフォルトの名無しさん:02/06/28 18:56
コンパックFORTRANに付属のBitViewerというツールで
浮動小数点の中身がみれます。
112 :
デフォルトの名無しさん:02/06/28 19:00
コンピュータって2進数で近似してるわけだから、
あんまり細かいところ見ても意味がないのではないでしょうか?
>109
えっとですね、ちょっと単語が難しくてわからないところも
あるんですが、基本的に「本当の0だけを取り除いて、
0に非常に近いけど0じゃない値は使」うということは
IF文でできるんですよ。
しかし、そのIF文のなかで
1.0D0/A
とすると(0かそうでないかでわけた実数をAとしました)、
値がNanになってしまうというのが問題点なんですね。
そうならないためにはどうすればよいか、と悩んでいるんです。
使いたい
114 :
デフォルトの名無しさん:02/06/28 19:05
うーん、このスレは全プログラマの数パーセントといわれる
数値解析プログラマの集まりと見た。
それだけに他の情報処理系は入ってこられないから荒れない
な。
↑「使いたい」っていうのは間違って入っただけです。
意味ないですm(__)m
116 :
デフォルトの名無しさん:02/06/28 19:12
この板の住人は理系出身者ばかりであると
断言できる。
>倍精度実数型は、コンピュータ内での数値表現を実数型(4バイト)の倍(8バイト)使うことによって、
>より正確に表現するものです。表現可能な数値の範囲は、
>正の最大値で1.7976×10+308、正の最小値で4.9406×10-324です。
という記述をネットで発見。
最小値の逆数は10+324のオーダーになるがこれは倍精度実数型に収まらないんじゃ・・
でもこれって、のと氏のいう範囲とも食い違うし間違いかも。
自信ないのでsage
118 :
デフォルトの名無しさん:02/06/28 19:27
>117
貴重な情報をありがとう。
私の1.0D307という情報のソースは古〜い本なので、
それこそ間違っているかもしれません。
というかむしろ近くてあってるのかなと感じたのですが(^_^)
ちょっとun理系チックな考え方ですけど。
1.0D307というのはfortranで扱える最大の桁数(もちろん倍精度)
みたいで、実際1.0D307とか打ってコンパイルするとエラーが
出ますよ。
Visual fortranだけかもしれないですが。。
120 :
デフォルトの名無しさん:02/06/28 22:43
たまにステップ実行でデバッグして変数見てると、
+0とか−0とか言う値が出てくるが、これって0に非常に近いけど
0じゃない、でも0と見なすって数なのか?
121 :
デフォルトの名無しさん:02/06/29 00:25
わかりやすく言うと(この時点で眉唾)、8桁の電卓があるとしよう。
最大正の値が99999999。最小正の値が0.00000001(最初の0は表示なし)。
123.5678は表示できても12.3456789は表示できない。
(これが10進の浮動小数点っつことだよな。)
0で割れないのは数学上当たり前なので÷0はできないようにした。
じゃ、100を0.0000003で割ったらこの電卓は表示できるかね?
試しに0で割るとNaNになるの?Infじゃなく。
Fortran使ってる人まだこんなに居るんだ。
やっぱ地球科学系の数値計算とかでしょうか?
まさかWinのアプリケーションFortranで作ってるとかいう人は居ないと思いますが。
なぜ地球科学(ワラ
>>123 >まさかWinのアプリケーションFortranで作ってるとかいう人は居ないと思いますが。
>>55の鬱が悪化するかも(藁
>>121 浮動小数点をそういう電卓に喩えるのはまずい。
1.234D56のように仮数部と指数部に分けて表現する、これが浮動小数点の
基本概念。仮数部で有効桁を、指数部でオーダーを表すわけです。
「100を0.0000003で割ったら」、0.3333333333D9などとなり、これは
勿論(有効桁分は)正確に表現できます。
したがって>>のとさんのように1.0D-200は0ではないちゃんとした値であって、
きちんと計算出来て欲しいというのはもっともです。実際その値そのものは
正確に保持しているわけですからね。しかしこの考えはプログラミングの
観点からは非常に危なっかしい。この値がどこから出てきたのかというのが
問題になります。最初から例えばプランク定数で定義され、素粒子の世界だけ
で閉じている計算から出てきたものであればまあ一応OK(一応と付け足した
のは、これでも問題があるからですが、これは後回しにします)。しかし
現実に相手にしているのは有限要素法なんかだとmmとかμmとかの世界であって、
せいぜいD-10程度のオーダー。こういうオーダーの計算を行っている途中に
D-200などのオーダーの値が出てきたら、これはもうゼロ以外の何の意味も
持ちません。その辺りの考え方がアバウトなようで、心配なわけです。
と、ここまで書いて本当にここら辺りの問題をうまく伝えられるのかが疑問に
思えてきた(苦笑
まあ、のとさんも色々試行錯誤しているようで、その結果待ちということに
しましょう(w
127 :
デフォルトの名無しさん:02/06/29 07:19
128 :
C->F90:02/06/29 12:02
Fortran90のポインタ使ったことある人いますか?
Cのポインタと同じく変数のアドレスを持っている32bitの整数ということなのか
と思ったけど、本で調べてもアドレスなんてこと全く書いてなかった。
Cのポインタと同じようには使えないんでしょうか?
>>99 それは、当たり前。コンピュータの実数って所詮近似値だから、非常に小さい値の
sqrt() を取ったら 0 になってしまうことがある。
また、非常に小さい値に対して 1.0D0/A 等とやると結果が有効範囲に収まれない
ことも充分ありえる。
どうしてもこれを避けたいなら、逆に 1.0D0/A の結果が NaN になった事を検出
すると言う方法の方が簡単だと思う。ヘルプで、ISNAN(x) 関数を調べてみて。
ただ、実際問題としてそのような状況になるのはロジックに問題があるような気が
するけど、それは大丈夫 ?
>105
親切にいろいろありがとうございました。
126にかかれていることはよ〜くわかりましたよ。
大丈夫です、わかりやすかったです。
よく考えたら非常に小さな値をセンシティブに扱っても
意味はないですね。
先生ともディスカッションして(実は大学院生(^_^))
あまりに小さい値は0としようということになりました。
本当にありがとうございまず。
>70
70さんもいろいろありがとうございました。
ロジックは大丈夫です。
いろいろな要因が重なるうちに(主に小さい値どうしの掛け算)
値が小さくなっていってしまったりするだけです。
ここの人はみんな親切で助かりました。
いろいろあって忘れてしまったのですが(すみません)、
tracebackのことを教えてくれたのが一番助けになりました。
ありがとうございました。
ただ、まだプログラム自体は完成してないのでまた聞くかも
しれません(^_^)
131 :
デフォルトの名無しさん:02/06/29 19:19
>>55 winのアプリケーションFORTRANで作るっていっても、関数だけFortranで作って
メインのところはVC++とかで作っているんですよね?
まさかWinMainから全部Fortranで作ってるとか・・・
確かに、根っこ部分はCですけどね。
FORTRANのイベントループ(のようなもの)、
見てるだけで目眩がします。算術GOTO文の嵐。
133 :
デフォルトの名無しさん:02/06/30 11:36
某高校のFORTRANはBASICで動いてる。
Breakキーを押すと「Break in 685」と表示される…。
う”〜〜〜ん。
134 :
デフォルトの名無しさん:02/07/01 20:04
>>132 F77で書くようにとか仕様があるんですか?
F77でwhile(){ }とかdo{ }while();とか実現しようとすると、goto使わざるを得ないからいやだな。ifとgotoでループ作ってる人が居てびっくり。
>>134 一応、F77のしばりはありますね。DO-ENDDOくらいは使っちゃいますけど。
VFは、今度は HP Visual FORTRAN になるのでしょうか?
MPS=>DVF=>CVFと、バージョンあげるたびにメーカーが変わっているような気が......
次バージョン是非、エディタにIntelliSense付けて欲しいな。
あ、FORTRAN.Net になるのか?
136 :
syukudai:02/07/03 00:16
線形回帰のソースおちてるところ知りませんかね?
自分で探してもみつからないので・・
基本的な質問させてください。
フォートランの場合は配列を引数とするためには、サブルーチン側ではど
のように書けばよいのですか?
subroutine 名前 (x(i),y(i))
みたいな書き方で良いのでしょうか?それとも添え字は要りませんか?
subroutine 名前 (x,y)
>>139 わかりました。
もうひとつききたいんですが、そのサブルーチンの後に
subroutine namae (x,y)
dimention x(100)
dimention y(100)
みたいな宣言も必要ですか?
141 :
デフォルトの名無しさん:02/07/05 05:54
>>140 当然配列宣言は必要。宣言がないと通常変数と区別がつかない。
あと、ディメンションじゃなくてディメンジョンね。スペルが
チョト違うYO!
まあ普通は、REAL*8 X(100),Y(100)のように型宣言で配列宣言
も兼ねる書き方をするけど。
それにしても英小文字で書くとFORTRANじゃないみたいだなあ。
頭の固い漏れだけか?(爆
>>141 > それにしても英小文字で書くとFORTRANじゃないみたいだなあ。
禿同。
あやうくスペル間違いでコンパイルとおらないところでした。感謝します!
しつこいようですがもうひとつ聞きたいのですがメインプログラムで配列を渡す時は
サブルーチン名(X,Y)でいいですか?それからメインでは、渡す配列は20までしか
確保していないのですが、受け取るほうのサブルーチンで21以上にもアクセスできますか?
subroutine(x,y)
RWAL*8 x(100),y(100)
do 10 i=1,50
z=x(i)+y(i)
みたいなことが書きたいのです・・文法あってるかな・・
そりゃむりだろ・・
なんでワザワザそんなことを。
146 :
デフォルトの名無しさん:02/07/05 18:01
fortranを実行するときにwfl386とwfc386の2種類があるけど
どう違うの?
147 :
デフォルトの名無しさん:02/07/05 20:34
RWAL型ならできるかも。ナンチテ
>>143 無理でないかい。
多分コンパイルエラーか、x(20)以上にアクセスするときに何か実行時エラーが出ると思う。
C言語なら、動くよ。ただ確保したところ以外にいじるとどうなるかは
わからないが。
Fortran最近始めたばかりで余りよく知らないんだが、
関数のなかでもx(100)とかやらなくちゃならないってことは
関数には配列のコピーが渡されるって事か?
>>149 >関数には配列のコピーが渡されるって事か?
NO。FORTRANの引数はすべてアドレス渡しで、cのような値渡しの
仕組みは一切ない。したがって、
>関数のなかでもx(100)とかやらなくちゃならない
というわけではない。実際、SUBROUTINE側では配列の長さが分から
ないので、REAL*8 X(1) などと宣言したりする。
要するに配列である旨をコンパイラに教えるだけの意味。
まあオプションでOut of Rangeのチェックができるコンパイラもある
けどね。現実的にはそんなチェックをかけたら、使い物にならない(爆
>>143 >メインでは、渡す配列は20までしか確保していないのですが、受け取る
>ほうのサブルーチンで21以上にもアクセスできますか?
>>144-149の言うとおり、できるわけがない。実体(実引数)は必要な
だけ確保しておかなければならないのは当たり前です。
コーリングシーケンスはそれでOK。CALL NAMAE ( X, Y ) などとやる。
勿論配列宣言と型宣言も必要。この場合の配列宣言とは、単に宣言だけ
でなく、領域実体の確保も意味することに注意。
うむ、これでほんとに分かってもらえるかな。ま、とにかく、がんがれ!(w
subroutine hoge (x,y)
RWAL*8 x(1),y(1)
余談&常識なんだけど、
引数に多次元配列を渡す場合は、
配列の形状を共有するために、
内側N-1次元分の配列サイズも
引数で渡す。
153 :
デフォルトの名無しさん:02/07/09 23:57
fortranで書かれた、連立一次方程式を解くプログラムと
逆行列を求めるプログラムが
欲しいのですが、これらをを自分で作らずに手に入れる方法などを
どなたかご存知ありませんか?
やはり、自分で作るしかないのでしょうか?
よろしくお願いします。
154 :
デフォルトの名無しさん:02/07/10 00:40
>>153 本屋でタチヨミすれば?
逆行列程度ならネットにおちてる可能性も・・
しかしC言語等に比べるとネットに落ちてる確率は低い。
物理屋さんしか使わないからな・・
>>153 その類の数値解析パッケージは、探せばくさるほど転がってるけど。
英語読めるか? 137あたり参照。
156 :
デフォルトの名無しさん:02/07/10 12:32
CのプログラムをFORTRANに変換するツールってあります?
157 :
ショボ鯖缶:02/07/10 17:21
研究でSUNのマシンを買ってきたんだが、
FORTEなんたらってうFORTRANのコンパイラCDがついてたけど
ライセンスは別途購入する必要があるの?
SUNのコンパイラ入れればやっぱ処理速いんですか?
教えてキボンヌ。
158 :
ショボ鯖缶:02/07/10 17:21
研究でSUNのマシンを買ってきたんだが、
FORTEなんたらってうFORTRANのコンパイラCDがついてたけど
ライセンスは別途購入する必要があるの?
SUNのコンパイラ入れればやっぱ処理速いんですか?
教えてキボンヌ。
159 :
ショボ鯖缶:02/07/10 17:22
研究でSUNのマシンを買ってきたんだが、
FORTEなんたらってうFORTRANのコンパイラCDがついてたけど
ライセンスは別途購入する必要があるの?
SUNのコンパイラ入れればやっぱ処理速いんですか?
教えてきぼん
160 :
ショボ鯖缶:02/07/10 17:23
ウワ 二重カキコになってる。申し訳ありませんでした。
三重カキコじゃん
162 :
デフォルトの名無しさん:02/07/10 17:25
163 :
デフォルトの名無しさん:02/07/10 20:17
VisualFortran6.xの後続って出るのかな?
VisualStudio.NET対応のVisualFortran.NETとか
HPと合併してFortran止めちゃったりしたら悲しい・・・
intel fortran はどう?
165 :
デフォルトの名無しさん:02/07/12 00:39
>>164 結構良さそうだね、IntelFortran
でもIntelのって初めて聞いた。アカデミックソフトのカタログにも載ってないし。
これって本当にコンパイラだけみたいだね、開発環境はVisualStudioが必要みたい。
166 :
デフォルトの名無しさん:02/07/12 11:04
俺も大学の頃はFortranなんて死に絶えているだろうと思ってC/C++で
シコシコ数値懐石やってたさ。ところがどっこい、流体計算ではまだ現役。
しかも3000行のソースの中に"go to"が100箇所以上あるスパゲティ・ソース。
構造化プログラミングから入った俺には読解自体がかなりつらい。
167 :
デフォルトの名無しさん:02/07/12 11:06
本当にFortranはCより早いのか?最近のCPUのアーキテクチャに
あわせてコンパイラに最適化コード吐かせたCより早いのか?
(という実験をそのうちやろう)
fortranをcやc++やjavaで書き直す必要ってあるの?
また実際そういう流れってあるの?
必要性が無くても流れで移植とかがはやってるってこと無い?
169 :
デフォルトの名無しさん:02/07/12 12:18
>>168 Cはともかく、Javaは無理じゃないか?書き直すことは出来るが
速度や、数学関数の精度が低いだろう。Cでも現場によっては
今ひとつと言われてしまうかもしれない。
その前に、古い時代のスパゲティ・ソースをFortran77や90の
仕様を使った構造化プログラミングに直すのがまず先決のゆな
気がするぞ。
170 :
デフォルトの名無しさん:02/07/12 12:19
「最近はハードウェアが高速で安くなったから、コードは効率よりも
保守性を重視して....。」という話も、スパコンの中で数十時間解析
してる世界だと通じない場合があるよなぁ。「じゃ、あと10億で
クラスターを一台増やしましょう!」なんて気軽にはいえん。
171 :
デフォルトの名無しさん:02/07/12 12:27
>>168 Fortranの問題というより、汎用機の時代から
世間のプログラミング作法の常識とはかけ離れて
可読性の低いソースが書きつづけられていることが
問題だとおもふ。
>>170 なんにでも特例はある。というかスパコン自体特例なような。
一度使ってみたいが。
173 :
デフォルトの名無しさん:02/07/12 12:57
>>171 いまさら40前後の上司に"go toつかわず、関数作って、CPUに
あわせた最適化コード吐かせて高速化"なんていえんわな......。
C++移行したいらしいが研究者がC++を使えない罠
FORTRANの方がCより速い、とか言われる理由
・再帰関数書けないFORTRANは、引数がヒープ上にあり、大域変数としてアクセスされる
・ベクター計算機用ライブラリは、FORTRANの方が普及してる
・FORTRANしか使えない人にとって、Cを覚えながらプログラム書くより、早く結果が出る
>>175 > ・再帰関数書けないFORTRANは、引数がヒープ上にあり、大域変数としてアクセスされる
レジスタ渡しのほうが速かったりしない?
> ・FORTRANしか使えない人にとって、Cを覚えながらプログラム書くより、早く結果が出る
それは「速い」理由じゃなくて「早い」理由。
177 :
デフォルトの名無しさん:02/07/13 02:52
Fortranでプログラム書いている人って、だいたいが大学の研究者
とかで、ソースコードにしても基本的に自分さえわかればいいって
感じで書いているから、ソース渡されても解読するのが非常に困難。
ドキュメントなんてまず書かないし、関数のヘッダとかも付けないし、
doループifブロックのインデントないし、とにかく流れが読みにくい。
Fortran77にCの機能くっつけたようなF90にしても、周りの人ほとんどか
古式ゆかしいF77使っていて、F90使っている人なんて皆無に近い。
Fortran用のindentみたいのはないのかね?
180 :
デフォルトの名無しさん:02/07/13 11:59
>>178 インデントなんて、ifとかループの範囲の行を少し引っ込ませれば
いいだけだから、Fortran用のインデントも何もないと思う。
F77の場合1行64文字位までしか書けないから詰めてるんじゃないかな。
f90ならもっとたくさん書けるけど、まだまだ77信者が多いから
F77形式でやらなくちゃならない。
正直、フォートランは大文字で書いて欲すぃ。
FORTRAN77 使ってます。
別に信者というわけではなく、商用コンパイラでしか動かないコードがあり、
うちの研究費では 77 と 90 両方を買うことができないため 77 が優先されました。
せんせー、科研費当てて Fortran90 コンパイラ買ってください...。
>>182 無料のコンパイラじゃダメか?
DECのとかintelのとか?
184 :
デフォルトの名無しさん:02/07/16 23:37
>>183 Intelのコンパイラって、無料だったっけ?
といいつつあげてみる
Intelは評価用ライセンスで試してみました。
しかし、今まで使ってきた商用コンパイラでコンパイルされた
某ライブラリとのリンクしなければならないため、
困ったちゃんな状態に。
Intelでライブラリをコンパイルし直せばよいのですが、
あっちでwarning、こっちでerrorという状態になり(誰だよ、このコード書いたのは..)
あきらめてしまいました。
とうぶんFORTRAN77でいきます...。
某ライブラリが何かを書けば解決するかもしれないね
などと書いてみるテスト。
ちなみにわたくしただいまintel fortranでOpenMPの修行中です。ハァハァ
187 :
デフォルトの名無しさん:02/07/21 14:55
板のレベルについていけない初心者です.
Visual Fortran 5.0でbitmap画像を処理してみたい.
各座標のRGB値を読み取って,10進数で配列に納めたいんですが...
OPEN(10,FILE='01.bmp',ACCESS='DIRECT',recl=1)
OPEN(6,FILE='data.dat')
DO m=1,150
READ(10,rec=m+54) c(m)
WRITE(6,*) m,ichar(c(m))
ENDDO
これじゃ,なんか駄目っぽい.
どこが駄目か教えていただけるとありがたいのですが.
>187
まず読み込むbmpの色深度によって1ピクセルのデータのサイズが変わるけど
その処理をしてないと思った。これはフルカラー(24bit)だったらR,G,B
それぞれ1バイトずつだからまあ24bit限定にすればよいと思うけど。
あと、bmpフォーマットは上下逆(右下?がデータの先頭に来る)
だけどその辺知ってるのかなという気がした。
何をしたいのか書いてくれないと説明のしようがないと思われ。
bmpフォーマットについては,調べてみましたので大丈夫だと思います.
フルカラーを想定しているので,まずヘッダの54バイトを読み飛ばす.
55バイト以降は,BMPの左下からRGB値がBGRの順で並んでて,
配列C(m)は,CHARACTER*1で宣言していますので,
c(1)には最左下のB値
c(2)には最左下のG値
c(3)には最左下のR値
c(4)には最左下の一つ右のピクセルのB値
がそれぞれ文字型で入っていって,
それを,ichar(c(m))で,10進数に直せば
c(1)=120,c(2)=20,・・・
といった具合に,各座標のRGB値を10進数で取り出せるのでは?と思ったわけです.
ところが,バイナリエディタで開いた値とは,違う値が返ってくる.
>文字コードを返すICHAR関数はFORTRANの標準の組み込み関数であるが,
>その値は機種に依存することになる.
ってのが関係してたりするのかな?などと考えて頭がこんがらがって
きたので,ここで質問した次第であります.
===============================================
なんか,見当違いなこと書いちゃってるかもしれませんが,
よろしくお願いします.
あ,途中ちょっと修正
×間違い
c(1)=120,c(2)=20,・・・
といった具合に,・・・
○正解
ichar(c(1))=120, ichar(c(2))=20,・・・
といった具合に,・・・
スマソ
これだとbmpの55バイト目から204バイト目を十進で出力するプログラムだね。
cが150取ってなかったら落ちるだろ。
>>191 cの配列のサイズは十分大きくとってあります.
おっしゃる通り,
「bmpの55バイト目から204バイト目を十進で出力する」
というのを意図したプログラムです.
ところが,出力されてくる値が,バイナリエディタで開いて見た値と
異なっている.もうなんでなんだと.
BMPファイル的にはフルカラーなんですが,元画像は白黒CCDカメラで撮った
ものなので,バイナリエディタで開くと,20,20,20,13,13,13,55,55,55・・・
といった具合に,3つ同じ値が連続しています.
ところが,ichar(c(m))で返ってくる値は19,20,20,24・・・
みたいなかんじで,バイナリエディタで開いた値とは異なる.
意味がわからん.といったわけです.
=======================================================
毎回,情報の小出しになっちゃって申し訳ないですが,
よろしくお願いします.
193 :
デフォルトの名無しさん:02/07/23 15:04
>>193 ちょっと僕のキャパを超えました.
まださらっと見ただけですが,リンク先,あまり理解できませんヽ(´-`)ノ
所要で外出のため,
明日にでもじっくり読んで考えます.
どうもお世話になります.
>>194 http://wwwoa.ees.hokudai.ac.jp/people/numa/enshu/fileio.html にもあるけど、recl指定がByte単位のコンパイラ(g77とか)とワード(4Byte)単位の
ものがあると。おなじrecl=1でも前者は1Byte,後者は4byteだと。で、Compaq
fortranはどうやらコンパイルオプション/assume:bytereclを明示的に指定しないと
後者扱いになるよっていう話みたいね。自分はByte単位のコンパイラしか使ったこと
ないんでいまいちわからんが。もし後者だとすると
READ(10,rec=m+54) c(m)
の時点でm=1の場合(1+54)*4=220バイト目から読んでることになるんでないかと。
今回のような用途の場合、54バイトなんて言うバイト単位の読み飛ばしをしたければ
/assume:byterecl をつけた上で
OPEN(10,FILE='01.bmp',FORM='UNFORMATTED',ACCESS='DIRECT',recl=1)
とOPENしてやる必要があるんじゃないでせうか。UNFORMATTEDも明示した方が
確実ではないでせうか。VisualFortranも知らんでしゃしゃり出てスマソだが。
↑
すんまへん上の名前の192は193の間違いですた。
197 :
デフォルトの名無しさん:02/07/24 00:22
UNIX上で使っていたアーカイブ・ライブラリ(拡張子.aのやつ)って
Windows上でも利用できますか?
古いワークステーションのプログラムをWindows上で走らせたいのですが、
アーカイブ・ライブラリになってるんです…。
198 :
デフォルトの名無しさん:02/07/24 07:50
普通無理だす
199 :
デフォルトの名無しさん:02/07/24 08:01
>>197 アーカイブは勿論オブジェクトモジュール(コンパイル済みの奴)の集まりなのでしょう?
それをUNIXからWindowsにそのままコピーして動くなんて、理屈から言っても、
ぜ〜〜〜〜ったい無理だと思う。Javaじゃないんだし。そんなことができたら、
ビルおじさんは赤鬼みたく激怒するのでは? 少なくともソースのリコンパイルは
必要でしょう。それで正しく動くかどうかもかなり怪しいと思われるが…。
で、全く話題が変わるが、「くだ質スレ」でint table[256]の各配列要素にすべて32を
初期設定する方法について盛り上がっていたのだが、FORTARNでは次にようにできた
と思うのだが、これでOKでしたっけ?
INTEGER*4 TABLE(256)
DATA TABLE/256*32/
考えてみれば*は乗算の演算子なわけで、256*32の計算結果が1個だけセットされる
ような気もする。DATA文の中では演算子は使えなくて、やはり上のコーディングで
OK? FORTRANから離れて大分経つので、自信がない。誰か詳しい人ヨロピク♪
200 :
デフォルトの名無しさん:02/07/24 08:30
>>199 >DATA TABLE/256*32/
でOKだと思います。DATA文って「宣言文のような見かけの立派な実行文」ですよね。
新しい規格からは削除されるみたいですが、大丈夫。新しい規格でコーディングする
くらいなら誰もFortran使いませんって(笑)。
まったく同意。
FORTRANの様な言語は言語仕様を拡張したり文法をいじる必要はない。
開発補助ツールを充実させればいいだけのこと。
>>195 どうも報告遅くなりますた.
理解もそこそこに,おっしゃる通りにOPENしてみました.
んで,みごと解決!
いや,お世話になりました.感謝感謝です.
>>202 そりは大変良かったですね。自分もWebで調べただけなんで自信なぞこれっぱかも
ありませんですた。でもCompaq Fortranのサイトは細かいとこまで載ってるんで
とっても(・∀・)イイ!発見。
204 :
デフォルトの名無しさん:02/07/26 20:23
数値計算なんかにFortranが愛用されている理由に
Cなんかより速いって理由があるらしいけど、
何でCよりFortranの方が速いんですか?
コンパイラの最適化とかですか?
それとも言語の仕様とか
>>204 パソコンレベルの話だとFortranの速度の優位性は特に無いと思いますよ。
今時のコンパイラだとCもFortranも大して変わらないか、むしろCのほうが
速いことも実際あります。スパコンレベルだとFortranユーザーばっかり
なのでメーカーもそれなりにFortranには力を入れているんだと思いますが。
あとこれは聞いた話ですが、Fortranの最適化がCより優れている点は
タコいコードを書いてもそれなりに最適化してくれることだとか。
数値計算する人って計算そのものを研究する人と計算を応用に使う人の
2種類に分けられますが、前者はともかく後者はプログラムに関しては
素人がそろっているのでこういう点では助かるのではないかあと。
まあ、実際そんなことよりもアカデミックならFortranマンセーだろうがっ!
という感じでFortranを使ってる人がほとんどな気が。私だけ?(わら
数値計算をする人たちはプログラムには大して興味ないからだろ。
FORTRANで用が足りるのになんでわざわざC?ってかんじなんだろ
207 :
デフォルトの名無しさん:02/07/28 18:14
プログラムには大して興味ない数値計算をする人たちがかつて作った
プログラムをメンテしなくてはならない私は、やはりFORTRANが嫌い。
自分が作ったプログラムは、FORTRANでも好きだけど。
208 :
デフォルトの名無しさん:02/07/28 23:29
Fortranの入門書でまともそうな本ってありますか?
本屋行っても、時代遅れのような本しかなくて・・・
210 :
デフォルトの名無しさん:02/07/29 16:42
fortran の本は大学の本屋に行けばたくさん売ってると思う。
その辺のPC関連の書籍扱ってる店では全然ないね。
必ず
IMPLICIT NONE
を宣言して,変数を全て自分で型を宣言しないと気が済まない人って
いますか?
212 :
デフォルトの名無しさん:02/07/29 20:31
LAPACK使いこなしてる人います?
213 :
デフォルトの名無しさん:02/07/30 11:42
>>211 Cの方を先にやってたから、その方が普通だと思っている。
CからFortranの関数呼び出すとき、値がまともに返らないと思って
いて、関数名の先頭の文字にIを使っていたので、Rか何かくっつけたら
きちんとdoubleが返ってきた。
関数の宣言で、double precision Iなんとか(......)と
やってもimplicit none しない限りだめなの?
214 :
デフォルトの名無しさん:02/08/07 21:38
FORTRAN用のXPテストユニットってないのかな
215 :
デフォルトの名無しさん:02/08/08 02:56
部長が、私が作ったソース内にimplicit none を発見して私に怒りました。
「fortranには暗黙の型宣言があって、みんなそれを使ってプログラム組んでるのだから、
お前一人がそんな勝手なことをするとわけがわかんなくなる」ということだそうで。。
個人的な好みから、小文字でソース書いてるのですが、「これfortranか?」とも。。
退職が頭をかすめました。
216 :
デフォルトの名無しさん:02/08/08 03:05
>>215 それはfortranではありません
FORTRANです
217 :
デフォルトの名無しさん :02/08/08 06:38
>>215 そんなことでいちいち「退職」なんて考えてたら、体がいくつあっても
足りんぞ(藁
部長のお叱りはもっともと思われ。君がコーディングしたものを、他人が
読む羽目になることはよくあること。自分だけの基準を勝手に決められた
のでは、読まされる方はたまったものではないよん♪
そもそも
>>213がおかしい。
>関数の宣言で、double precision Iなんとか(......)と
>やってもimplicit none しない限りだめなの?
んなこたぁない。Iなんとかの部分をきちんと書いていないと
思われ。大体IをRに変えたら「real」でなく「double」に
なったというのも怪しい…。
218 :
デフォルトの名無しさん:02/08/08 07:21
>>215 退職しる。そもそもそんな奴がFORTRANを使うような職場にいるのが間違い。
CやPascalを書くときならともかく、LXXXXがRealだろうか、とか考えたくもない。
だいいち他の奴のソースとギャップが大きすぎてかえって読みづらいだろ。
219 :
デフォルトの名無しさん:02/08/08 10:43
>>215 IMPLICIT NONEはなるべく、というか必ず宣言すべきでは?
これを勝手に宣言し、さらに各変数の(変数名はそのままに)型宣言するだけでも怒られるの?
その上司はデバッグしたことないのでしょうか???
>>216 lapackは数値計算にとっても便利だよ。
212のまちがい。
ふざけたプログラムを作ってみました.
program test
cimplicit none
integer*4 i
i=10
write(6,'("i=",i10)') j
stop
end
実行環境 Debian GNU/Linux i386
g77 2.95.4-16
$ gcc -o test test.f
$ ./test
i= 134522604
値は実行環境に依るでしょう.
implicit noneのコメントを外せば,
jが宣言されていないからコンパイル出来ません.
「fortran」使いでした.
あれ,タブで飛ばしたのに左ツメになってしまった.
s/$ gcc/$ g77/
寝ぼけていました.逝ってきます.
225 :
デフォルトの名無しさん:02/08/21 21:22
私の持っている本には乱数発生の関数が載っていなかったのですが、
そのようなものはないのでしょうか?
組み込み関数として用意されているのでしょうか?
くわしい方いましたら、教えてください。
コンパイラはVisualFortran(6.6 UpdateA)です。
ran()
tp://ftp.compaq.co.jp/products/dvf/cvf-help.zip
↑に日本語のマニュアルがある
ありがとうございました
もうひとつ質問したいのですが、擬似乱数ではなく本当の乱数
というのはないのですか?
>>230=225
「本当の」乱数というものは現実には存在しないでしょう。
サイコロを振っても「本当の」乱数になるかどうかは疑わしい。
あるところで妥協せざるを得ない。
ただし乱数度を表す指標みたいなものがあって(例えば周期の長さとか)、
どういうロジックで(擬似)乱数を作り出したかにより、その乱数の
「質」の良さ、ひいてはそのロジックの優秀さが判定できるでしょうが。
M系列
>>234 あ、6.0の日本語マニュアル出てたんだ。気が付かなかったサンクスコ。
やっと出たか
237 :
デフォルトの名無しさん:02/08/30 19:10
>>205 行列演算になるとFORTRANの方が速い(2倍以上高速になることはザラ)
同じ数値計算アルゴリズムをVC++6プロフェッショナルとVisualFORTRAN6
の両方で比較したことがあったが、FORTRANの方が4〜6倍速くて鬱になった
ことがある。
>あとこれは聞いた話ですが、Fortranの最適化がCより優れている点は
>タコいコードを書いてもそれなりに最適化してくれることだとか。
禿げしく同。C++では注意深くコードを書かないと糞みたいに遅くなる
こと有。
FORTRAN77:言語が単純なので数値計算の問題に集中できる。
C++ :言語が複雑で完全にマスターするのが大変。
数値計算の問題に集中できない。気が散る。
C++を諦めてFORTRANに戻ろうかとも考えている。
でも、あのC++の柔軟性やSTLの便利さは捨て難いけどなぁ。
238 :
デフォルトの名無しさん:02/08/30 19:14
話がCからC++にスレかわっててゴメン。
しかもFortranスレだという罠
windows2000 & VisualFortran6.6で動くプログラムをwindowsXP環境に
すると、次のようなエラーになりコンパイルできません。
/subsystem:console
/entry:mainCRTStartup
/igonore:505
/debugtype:cv
/debug:minimal
/pdb:none
C:\DOCUME~1\dfor.lib
libc.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:test.exe
LINK : fatal error LNK181: cannot open input file "C:\DOCUME~1\dfor.lib"
きっとリンクするときにC:\DOCUME~1\dfor.libの箇所がだめなんだと思うんですが
(実際そのフォルダにはdfor.libはない)、どうしてこんな設定になってるんで
しょうか?
どなたかわかる方いましたら教えてください。
>>240 プロジェクトフォルダごとコピーしたんじゃない?
新規プロジェクトで
ソースファイルだけコピーしてみ
>>241 解決しました。
ありがとうございます。
243 :
デフォルトの名無しさん:02/09/06 22:56
乱数を300ふって、それの分布をチェックしたいんですけど、
うまくいかないんです。誰か助けて。
0〜800くらいまでの乱数を25刻みでいくつづつカウントされるか
チェックしたいんですけど、if文がうまく書けてないみたいで・・・
dimension T(i),Y(i) T(i)に乱数が入ってて、
do j=1,25 箱25個
Y(j)=0 カウント数の箱の初期化
end do
do i=1,300
if(T(i).gt.0.and.T(i).lt.25)
Y(1)=Y(1)+1
else if(T(i).gt.25.and.T(i).lt.50)
Y(2)=Y(2)+1
・・・・・・・・・
・・・・・・・・・
else
Y(25)=Y(25)+1
end if
end do
do ii=1,25
write(*,*)Y(ii)
end do
これじゃY(1)にカウントが150とかいっちゃって、
乱数が一様に分布されなくなっちゃいます。
一様になるはずなんです。
どこが違いますか?
245 :
デフォルトの名無しさん:02/09/07 20:22
Y(i)ってInteger宣言になってないとまずいと思うんだけど、
もちろんそうなってるんですよね?
246 :
デフォルトの名無しさん:02/09/08 09:12
Tに実数型の値(乱数)が入っているのなら、勿論INTEGER宣言する必要もないのだが、
Yは明らかに整数型のつもりで使っているらしいから、当然TもINTEGER宣言してある
のでしょう。
いずれにせよ、
>>244のコーディング通りなら正しく出ると思います。正しく出ない
原因は(1)実際のコーディングが
>>244の通りでない (2)Tに正しい一様乱数が
入っていない。実数で入っている乱数をEQUIVALENCE的に整数型で受けているといった
場合もこの(2)に含まれる。
考えられる原因はこれくらいですかね。
それよりも
>>244のロジックに注文をつけたくなります。これだとelseifのネストが
25個もできることになりますよね。これはいかにもかったるいでしょう。
私なら次のようにします。
DO I=1,300
J=T(I)
J=(J-1)/25 + 1
IF ( J .GT. 25 ) J=25
Y(J)=Y(J)+1
END DO
247 :
デフォルトの名無しさん:02/09/10 16:10
擬似逆行列を解くルーチンってどっかにないでしょうか?
LAPACKだとこれが出来ないっぽいんですが。
何かヒントいただければお願いします。
入力した5つの定数の中から最大値を出力するプログラムおしえてくだせえ!
最大値を出すやりかたがわからないんですが・・
249 :
デフォルトの名無しさん:02/09/11 15:34
そんなもん max(x1,x2,x3,x4,x5) ってやってやればどれか分かると思うんだが。
250 :
デフォルトの名無しさん:02/09/24 19:50
if(条件)文1
文2
とあるとき、if文の影響範囲は文1と文2の両方に及びますか?
thenがあるときとないときでは違うのでしょうか?
251 :
デフォルトの名無しさん:02/09/25 07:03
>>250 おやおや、無視されていますね。
FORTRANから離れて大分経つので自信はないが、私なりの回答を。
ifは文1にしか影響しない。文2はただの独立した文。
if(条件)文1 が、一つの「if文」と見なされるでしょう。
THENをつけた場合は、ELSEかENDIFかが出てくるまでの間がまとめて、
一つの「THEN節」として処理されるのではないでしょうか?
以上、酔っぱらいながらの、昔を思い出しての回答。
間違っているところがあったら、誰か訂正よろしくね♪
watcom fortran 11.0cをwindows XPで使いたいんですが、どうすれば良いでしょうか?
254 :
デフォルトの名無しさん:02/10/02 18:03
255 :
デフォルトの名無しさん:02/10/04 16:19
引数を1つ、出力は配列(3)を2つ出すプログラムをつくりたいです。
READ(5,*)引数
DIMENTION 配列a(3)
DIMENTION 配列b(3)
Z = hoge(引数)
(略)
END
FUNCTION hoge(引数)
DIMENTION 配列a(3)
DIMENTION 配列b(3)
なんたらかんたら
RETURN
END
でいいのでしょうか?
>>255 読みにくいです.
PROGRAM TEST
REAL*4 A(3),B(3)
INTEGER*4 I
INTEGER*4 J
READ(5,'(1I)') I
CALL HOGE(I,A,B)
WRITE(6,'("A:",3(1X,F5.2))') (A(J),J=1,3)
WRITE(6,'("B:",3(1X,F5.2))') (B(J),J=1,3)
STOP
END
SUBROUTINE HOGE(I,A,B)
INTEGER*4 I
REAL*4 A(3),B(3)
INTEGER*4 J
DO J=1,3
A(J)=FLOAT(I*J)*0.5
B(J)=FLOAT(I)*2./FLOAT(J)
ENDDO
RETURN
END
257 :
デフォルトの名無しさん:02/10/05 00:45
>>256 そういう読みやすい書き方を紹介してくれる
書籍かサイトご存知ないでしょうか?
258 :
デフォルトの名無しさん:02/10/05 00:57
>>256 END DOってどのコンパイラでも通るのか?
まぁFORTRANは77しか使ったこと無いから90,95とかはわからんが.
>>257 じゃぁせめて配列サイズも引数に渡してあげましょう.
引数爆発起こしますが変更に耐えられません.
259 :
デフォルトの名無しさん:02/10/05 06:01
おぉブレーネリあなたのお家はどこ?
私のお家はもー無いの 去年火事で燃えちゃった
ヤッホー Frotranランラン ヤッホー Frotranランラン
ヤッホー Frotranランラン ヤッホー Frotranランラン
ヤッホー Frotranランラン ヤッホー Frotranランラン
ヤッホー Frotranランラン ヤッホッホー!!
tast
261 :
デフォルトの名無しさん:02/10/05 09:56
>>259 なつかすぃなあ。デバッグで行き詰まったりしたとき、
ヤケクソでヤッホー フォートランランラン…♪なんて
やってごまかしたこと数知れず(爆
ところで、>私のお家はもー無いの 去年火事で燃えちゃった
っていうのは故意の替え歌? あと「Frotran」も、わざと?
意味が分からん(汗
>>257 そういうのはセンスと経験(慣れ)の問題で、本を読んだだけで身に付くもの
ではないと思いますよ。とにかく実践ありき。ゴリゴリコーディングして、
経験豊かな人にボロクソにけなされるうちに、コツが分かってきます。
FORTRANに限らず、どんな言語でもそうですけどね♪
♪の人キタ━━━━(゚∀゚)━━━━ッ!!
替え歌連続書き込みしまくって、疎んじられてるヤシが吸い寄せられてきた事だし、
今日のfortranスレはお開きって事で。
>>258 DO 10 I=1,10
WRITE(6,'(1I2)') I
10 CONTINUE
ですか?
265 :
デフォルトの名無しさん:02/10/05 17:39
>>264 うん.ラベル管理が死ぬほど億劫だがそうしてる.
gnuと,最近のSunのコンパイラは通るらしいけど,
古めのWSで通らなかった痛い経験があるので使わないことにしてる.
規格厨じゃないが規格外だし
F77以前で規格外ですか?
綴り間違えた
火災保険は入っていたけど、子供は天国へ逝っちゃった。
かみさんとも別れちゃった。
おぉブレーネリ 私の居場所はどこ?
268 :
名無しさん@XEmacs:02/10/10 15:52
IF ( A NE 0 ) THEN
A = SQRT(ABS(A))
ELSE
A = 0
ENDIF
だっけ?
269 :
デフォルトの名無しさん:02/10/11 01:16
IF ( A .NE. 0 ) THEN
A = HAGE
ELSE
A = MAGE
ENDIF
比較演算子と論理演算子はドットで囲まないと
270 :
名無しさん@XEmacs:02/10/11 10:05
10年やっても2年やらないと忘れるもんだな・・
271 :
デフォルトの名無しさん:02/10/18 23:36
書式なしで書かれたバイナリデータを、違うコンパイラで
読む方法はないでしょうか?
同じソースでもコンパイラによってはerror during read と出て
読み出しすらできない場合や、読めるけど中身のデータがおかしく
なる場合があります。
readの際にrecl、convert等を適当に指定したりしてみたのですが駄目でした。
書き込みをしたコンパイラを使えばいいのですが、計算時間より
転送時間の方が何十倍も時間がかかってしまうという環境なので
できれば手元のマシンで処理したいのです。
それぞれのマシンの機種は?
エンディアンが違うんじゃないのかねえ。
Compaq Alphaのワークステーション(リトルエンディアン)の
FORTRANだと、コンパイルする時にオプションを指定すれば
ビッグエンディアンのデータをそのまま読めた。
--convert bigendianだったかな。
>>271 odとか、バイナリエディタ(bviとか)でデータの並びを確認しては
どうでしょうか?
FORTRANでビット演算は出来ないという理解は正しいでしょうか?
>>272,273,274
コンパイル時にビッグエンディアンを読み込みするオプションつけたら
うまくいきました。ありがとうございました。
276 :
デフォルトの名無しさん:02/10/23 01:08
ビット演算は一応出来るはず。
LSHIFTとかANDとかあるんだが,
富士通とSunとGNUでは存在を確認した
Fortran90の枠組みで、指定したバイト数からなる、任意型のデータ
を書き出すにはどうすればいいのでしょうか。
Cで言えば、
struct SomeType x ;
FILE* fp ;
fwrite( (void*)&x , sizeof( SomeType ) , 1 , fp ) ;
ということがやりたいです。これには、構造体 SomeTypeを
1バイトポインタにキャストできる必要があります。
・書式なし逐次記録で書くと、先頭にバイト長が入ってしまう
REAL*8 :: X(3)
OPEN(98,'a.dat',FORM='UNFORMATTED',ACCESS='SEQUENTIAL)
WRITE(98) X
16進Dump
18 00 00 00 | x(1)のイメージ | x(2)のイメージ | x(3)のイメージ |
(つづく)
(277のつづき)
・FORTRAN77が引数の型を調べないことを利用して、INTEGER*1の配列として
任意の型を受け取って書く。
以下のようにコーディングできるが、正当な書き方ではない。
SUBROUTINE BWRITE( UnitNo , Buf , N , POS )
INTEGER :: UnitNo , N
INTEGER*1 :: Buf(N)
INTEGER :: I
DO I=POS,POS+N-1
WRITE(UnitNo,REC=I) Buf(I)
END DO
END SUBROUTINE BWRITE
CALL BWRITE(98,X,24,1)
279 :
デフォルトの名無しさん:02/10/26 15:24
みなさん、はじめまして。
以前FORTRAN77を勉強し、最近、構造型が便利だということでF90を
勉強しだしていますが構造型で少しわからないところがあります。
たとえば
TYPE MyClass1
real :: rdum
integer :: idum
END TYPE MyClass1
としておき、さらに
TYPE MyClass2
TYPE(MyClass1) , ALLOCATABLE :: tdum(:,:,:)
END TYPE
とするとエラーが起こります。
このように自分が作成したTYPEの中でALLOCATABLEを宣言することは無理なのでしょうか?
もし解決方法をご存知の方がいらっしゃったら教えていただけないでしょうか?
よろしくお願いします。
それでは失礼します。
そりゃあ、構造体のサイズは一定でないとまずいでしょ。
POINTER使えば?
281 :
デフォルトの名無しさん:02/10/26 16:45
ちょっとお知恵をお貸し下さい。
LINUX上のコンソールで走らせるプログラムを書いているんですが、
Input reading file name > ここのファイル名を入力
とかいう風にやりたいんですが、
write(*,1000)
read(*,1010) FILE
1000 format('Input reading file name > ')
1010 format(A16)
と言う風にやると、“Input reading file name > ”のところで改行されてしまうんです。
この改行を抑制する方法って無いでしょうか。
282 :
デフォルトの名無しさん:02/10/26 16:47
>281
ぎゃぁ!!
固定Formatで書いてるつもりなのに………(汗)
上のソースは固定formatです。
書き忘れましたが環境は、VineLinux2.5にAbsoftのProFortran7.5をインストールしています。
>>281 $を付けると改行しません.
HP FORTRANだけの独自拡張だと思っていたのですが,
Linux上のf2c,g77-3.2どちらでも使用できました.
g77-2.95は試していません.
program test
implicit none
integer*2 i
write(6,'("Input number: ",$)')
read(5,'(i2)') i
write(6,'("The number is ",i2)') i
stop
end
284 :
デフォルトの名無しさん:02/10/26 18:28
>>283 ありがとうございます!
試したところうまくいきました。
ところで、これってFortran77/90/95とかの規格には含まれてないんですよね?
285 :
デフォルトの名無しさん:02/10/26 18:31
>>284 また脊髄反射でレスをカキコしてしまった………。
私は、ProFortranを使ってはいますが、未だに固定フォーマットでプログラムを書いてますし、
Fortran77の教科書で書いてます。
でも、もう卒業だからFortranをこれ以上使うとも思えないんですよね………。
286 :
デフォルトの名無しさん:02/10/26 21:52
>>281 構造体のサイズはいじれないんですね。
POINTERですか、一度勉強してみます。
とりあえずできないことが確認できただけでもよかったです。
どうもありがとうございました。
>>284 > ところで、これってFortran77/90/95とかの規格には含まれてないんですよね?
HP FORTRANのマニュアルにはFORTRAN77にはない拡張だと書いてありましたが,
FORTRAN90や95の規格に含まれているかどうかは分かりません.
ちなみにCompaq FORTRANでも有効でした.
288 :
デフォルトの名無しさん:02/10/27 00:13
>>280 やってみたんですがPOINTERを使ってもターゲットになる構造体のサイズに依存するんで
構造体の内部変数の配列のサイズを変更した構造体を作ることはできないのでは
ないのでしょうか?
何度もすみませんm(_ _)m
289 :
デフォルトの名無しさん:02/10/27 00:27
>287
そうですか………。
Fortran90の本を読んでもでていないんで、多分拡張ですよね。
それにしても、Fortran77の本に書かれていた、各行一文字目での制御って
普通の画面でも有効なんでしょうか。
<うちの環境では駄目でした
今更(只今M2で就職決定済み)でFortran覚えても意味無い気がして来たけど趣味
でやってます(笑)
>>289 > それにしても、Fortran77の本に書かれていた、各行一文字目での制御って
> 普通の画面でも有効なんでしょうか。
> <うちの環境では駄目でした
意味が分からないのですが、
c comment
のことでしょうか?
「Fortran77の本」とは具体的に何と言う本か?
「普通の画面」とは何のこと?
「うちの環境」とはどんな環境?
「駄目」とはどういう状態のこと?
291 :
デフォルトの名無しさん:02/10/27 14:34
>>291 > 説明不足でご免なさい。出力を改行させたくない場合、
> write(*,'+','kaigyousimasenn')
> と言う用にすれば出来ると
> の本に書いてあったんです。
> このようにしてみたのですが、そのまま画面と言うかターミナルに表示されてしまいまして。
283に書かれたやり方で良いのではないでしょうか?
それでは問題があって、他のやり方を探していると
いうことでしょうか?
293 :
デフォルトの名無しさん:02/10/27 20:20
>292
いえ、正直なところ、ただの好奇心の範囲でして。
お騒がせして申し訳ありません。
問題自体はあれで解決しました。
お付き合いいただき、どうもありがとうございます。
294 :
デフォルトの名無しさん:02/10/27 20:20
295 :
デフォルトの名無しさん:02/10/29 18:04
fortran77なんですけど、コンパイルができません。
どこが違っているのか、おしえてください。おねがいします。
c ex 2.1.1 *** wa,sa,seki,sho,bekijyou no keisan ***
implicit double precision(a-h,o-z)
open(15,file='date211.inp')
open(25,file='date211.out')
read(15,*) a,b
wa = a+b
sa = a-b
seki = a*b
sho = a/b
beki = a**b
c
write(25,*) 'a = ',a, 'b = ',b
write(25,*)
write(25,*) 'wa = ',wa,'sa= ',sa,'seki = ',seki,'sho = ',sho,
& 'beki = ',beki
c
write(6,*) 'a = ',a, 'b = ',b,'c = ',c,'d = ',d
write(6,*)
write(6,*) 'wa = ',wa,'sa = ',sa,'seki = ',seki,'sho = ',sho,
& 'beki = ',beki
stop
end
ちなみに、頭が全部そろってますが、cや&は7列目以降にはかかれていません。
こぴぺしたものなので・・・。
>>295 Salfordのお試し版とg77なら
cとdが未初期化だゴルァ
と怒られた以外、ちゃんとコンパイルできたぞ。
297 :
デフォルトの名無しさん:02/10/29 22:11
バッファリングされているFortran記録を、ファイルにフラッシュ
させるにはどうしたらいいのでしょうか?
いかにもOSあるいはコンパイラに依存しそうですが。
Visual Fortran だと、FLUSH あるいは COMMITQQ なんてのがありますが。
使用コンパイラのリファレンスを見るべし。
299 :
デフォルトの名無しさん:02/10/30 17:19
>>295さん、どうもありがとう。異常終了が起こるのは、やっぱり、マシンがだめなのかなぁ・・・。
300 :
デフォルトの名無しさん:02/10/30 17:20
これも、どこが違うかわらからないので、教えていただけませんか。ずうずうしくてすみません。
c ex 2.2.3 addition of angle
implicit double precision(a-h,o-z)
integer dg1,sc1,dg2,sc2,dg,sc
date pi/3.141593/
write(25,*) 'input dg,mn,sc'
write(6,*) 'input dg,mn,sc'
open(15,file='date223.inp')
open(25,file='date223.out')
read(15,*) dg1,mn1,sc1
read(15,*) dg2,mn2,sc2
r=pi/180.0
c
rd1=((sc1/60.0+mn1)/60.0+dg1)*r
rd2=((sc2/60.0+mn2)/60.0+dg2)*r
rd=rd1+rd2
c
wk=rd/r
dg=wk
wk=(wk-dg)*60.0
mn=wk
sc=(wk-mn)*60.0+0.5
write(25,*) 'rad1= ',rad1, 'rad2 = ',rad2,'rd=',rd
write(25,*)
write(25,*) 'angl1 = ',dg1,'deg ',mn1,
& 'min',sc1,'sec'
write(25,*) 'angl2= ',dg2,'deg',mn2,
& 'min ',sc2',sec'
write(25,*) 'total=',dg,'deg',mn,
& 'min',sc,'sec'
stop
end
>>300 > これも、どこが違うかわらからないので、教えていただけませんか。ずうずうしくてすみません。
「違う」って何でしょう。お使いの環境が不明。
コンパイルに失敗するのか。それともコンパイルは
出来ても実行結果が意図と違うのか。
気付いたところ。
openでstatusを指定していない。
scは整数型として宣言しているのにsc=...の文は60.0を
乗じたり0.5を加えたりしている。更に倍精度実数wkから
整数mnをキャスティングなしで引いている。
closeしなくていいの?
pi=4.*atan(1.)のほうがよくない
304 :
デフォルトの名無しさん:02/10/30 21:47
状況を説明してなくて申し訳ないです。
コンパイル時に、エラーがでるのです。
教科書は、型宣言をしておらず、dateから始まっています。
だから、型宣言が違うということでしょうか。
あまり詳しいことを学ばないまま、レポートが出てしまったので、困っています。
どのように直せばよいのでしょうか
ご指導のほど、お願いします。
>>300 コンパイラのエラーメッセージ読んでみれば?
もしかしたら、HITACのようなTSS環境だと、メッセージでないのかな?
(ううなつかしい)
あるいは授業のハンドデバッグの宿題だったりして。
で、まじれす
4行目 date でなく、dataでしょう。
22行目 出力変数は、rad1,rad2ではなく、rd1, rd2 でしょう。
27行目 sc2のあとのアポストロフィの位置が間違えてます。
当然、'date223.inp'に適切なデータが記述されていないと
ランタイムで落ちます。
304を読んでなかった。
レポートかぁ。
書かなきゃよかったかな。
いずれにせよ、業務上であれば、300のようなコードかいてきたら、
殴ります。
308 :
デフォルトの名無しさん:02/10/31 14:50
>>306 ありがとうございました。ちゃんとコンパイルできました。
しかし、実行段階でやはり、コアダンプします。
学校のPCのため、設定はいじれないんですが…。
どうすればよいのでしょうか
>>308 クラッシュする位置を特定してどうしてそこでクラッシュするか考える
やりかたとしては
プログラムをよく読んで脳内で実行
もしくはデバッガをつかう
デバッガが使えなければいちいち write して、
各時点で各変数の値がどうなっているか、どこでクラッシュするか確認する
>>308 設定でなくて,プログラム自体が間違っているのでしょう.
図書館でFORTRANの参考書を借りるとかして下さい.
このスレを参考書にするのはどうかと思います.
311 :
デフォルトの名無しさん:02/10/31 20:01
>> 298
ありがとうございます。処理系に依存するとは知りませんでした。
実際に僕が使っているFujitsu Fortranでは、サービスルーチン
として(つまり組み込みでない)FLUSH()関数が用意されていました。
せめて、
open(15,file='date223.inp', status='OLD') くらいは
かいてみそ
date223.inp が無いんじゃないの?
やりすぎ
314 :
デフォルトの名無しさん:02/11/11 15:02
fortranでreal*8の変数zに1.1を代入して、
それをc++のdowbleの変数に渡したとき、1.10000002384186という値に
化けてしまいます。この数値の再現性は100%です。
なんでごみが混じってしまうのでしょうか。それへの対応法はありますでしょうか?
アドバイスお願いします。
スペルdoubleですね。恥ずかしい
VF6.5、VC++6でやってます。
FORTRAN上で、zに単精度の1.1を代入していませんか?
コンパイラオプションにもよりますが、単純に 1.1 と書くと、通常、
単精度になりますから、せいぜい10進数では7桁程度の精度しかありません。
Z=1.1D0 と書けば、倍精度になりますから、15桁くらいの精度になります。
倍精度拡張オプションをつかえばいいのかな?
318 :
デフォルトの名無しさん:02/11/15 01:33
C言語ソースからPAD図を生成するツールはあるけど。
fortranソースからフローチャート生成するツールって
ないっすか?検索したけどみつからない。個人的に
ツール作成した神はいませんか?
320 :
デフォルトの名無しさん:02/11/16 00:35
あーいうのじゃなくて簡単に
操作ができるツールみたいなの探してる。
やっぱねぇのかなぁ?ベクターさんではみつからないし。
>>319
321 :
デフォルトの名無しさん:02/11/16 20:03
フォートランで、C言語で作ったDLLファイルを使いたいんですが、
それを勉強するのに適した本とか、WEBページとかありますか?
323 :
デフォルトの名無しさん:02/11/20 17:10
教えていただきたいのですが
Fortranでの計算結果をアニメーションで表したいと思っています.
(例えば振り子の運動など)
どのような方法がありますでしょうか?
Fortranには
Visual Fortran 6.0を用いております.
ご教授ください宜しくお願いします.
324 :
デフォルトの名無しさん:02/11/20 17:34
>>323 fortranで計算結果を適当に書き出して(DATとか)それをVBとかで表示じゃだめ?
俺はそうしてますた・・いちばん簡単だと思う。
>>316 >>317 ありがとうございました。これってFORTRAN使いの方(に限らない?)にはあたりまえの事なんですね。
こんなこと聞いてアホかと怒られました。勉強させていただきました。
326 :
デフォルトの名無しさん:02/11/24 12:35
AIX上のXLFortran使っている方がいれば教えてください。
KAP or VAST-2 最適化プリプロセッサって、
シングルスレッドのプログラムでも有効ですか?
数値解析のプログラムを使っているんですが、
もしかしたら必須アイテム?
fortranスレあったんですね
最近、数値計算メインをC++からFortran95に乗り換えました
F77->QB->Pascal->C->C++,VB->C++,VB,perl->LabView,F95,C++,VB,ruby
で、結局fortranに帰ったと Fortran95(・∀・)イイ!!
安いコンパイラと安い解説書があればもっと流行るのになぁ
>323
VFならQuickWinが付属していますので、それを使ってください。
ただし、汎用性もなくなるのでお勧めできませんが。
ヘルプで
Using QuickWin->Displaying Graphics Output
を参照のこと
328 :
デフォルトの名無しさん:02/11/28 16:33
>>327 よろしかったら数値計算部をC++からFORTRANに乗り換えられた理由を教えて
いただけないでしょうか?
C++だと遅くてやってられないからです。
まあ、配列の仕様が違うので仕方ないですが、
CやC++は数値演算には向きませんね。
>>329 「数値演算」といっても規模によるだろうけど、
具体的には C/C++ とどの程度の差がでるものなの?
俺は C/C++ で数値計算をずっとやっててそれしか知らないので
ちょっと興味がある。
C++はvector使ったら遅いかもしれんけど、Cは速いとおもうけどなあ。
アセンブリ出力見てみれば?
メモリの使われ方とかをちゃんと理解している人が書いた
(真っ当な) C プログラムよりも Fortran のプログラムって速いのかな?
関数呼び出しのオーバヘッドとかが違うとしても、
劇的に速度が向上するとは思えないんだけど。
>328
CとFortranの速度差はせいぜい5%程度です(経験的).C++は作りにもよりますが、
Cより遅くなります.速度を上げるために設計に頭を使うというのはどうかと.
C++から乗り換えた理由は,F95がCと同等以上のことが出来るためです.
実際使ってみると,すごくいい.Cよりもよく出来てる(新しいから当然).
特に配列の拡張がすばらしいと思います.また,並列命令がある.
元々Cが数値計算に向かない点として
・配列の添え字が0から始まる(ほとんどの数学ルーチンは1から始まる)
・階乗がない
・複素数がない
・商用ルーチンがいまいち
というのがありましたから,移るのにためらいはありませんでした.
なんで今まで移らなかったかというと,解説書がなかったから(昔はDECのしかなかった)
F77で書くくらいなら,多少遅くてもCを使いますがね.
334 :
デフォルトの名無しさん:02/11/29 11:09
328です.レスが遅くなってごめんなさい.
C++をC的な使い方をしているかぎり,基本的にFORTRANの参照渡しと同じです
から行列計算でもそれほど遅くならないと思います.行列計算の最適化に対する
ノウハウの差が若干でる程度かと...
C++で行列計算をやるときに悲惨なのは,行列クラスを作ってC=A*Bの行列演算
ができるように=演算子や*演算子を書き換えた(オーバーロードした)ときです.
関数(サブルーチン)内で定義した作業用の行列やC++が裏側で勝手につくる行列が,
関数が呼び出されるたびに生成され,また関数から呼び出し側に戻るときに破壊さ
れるような事態が発生しうるのです.しかも,呼び出し側に行列演算結果を渡すの
に値コピーが行われるのです.1000 x 1000の行列だと1000000個のデータの
コピーが...確かに,下手なプログラムを作ると遅くなってしまいます.
でも,FORTRAN77が嫌だったのでは,プログラムが読みにくいのとバグが見つけ
にくく,見つけるのに1ヶ月もかかった経験があるからです(今から考えると
それはプログラムの設計が悪かったからでしょうが).
確かに,fortran95は改善されていますね.でも,この前95で作られたコード
をみたんですが,サブルーチンなんか引数が多いし,やっぱりアレルギー反応
を起こしてしまいました.
で,C++を続けるかfortran95に戻るか迷い中だったものですから...
335 :
デフォルトの名無しさん:02/11/29 11:14
呼び出し側に行列演算結果を渡すのに値コピー
↓
呼び出し側に行列演算結果を返すのに値コピー
の誤りでした.
>334
fortran95のプログラムには旧形式と新形式があるので,一見F77の
プログラムに見えるものもあります.F95は基本的にはCと同等ですから
引数が多いのはしゃーないです.Cも多いですし.構造体を使って
変数をパッケージすればいくらか改善できるでしょうが
fortran2000ではついにオブジェクト指向が導入されたということなので
期待しているんだけど,いつ実装されるんだか^^
f95の時は実装が97-98年,大型に入ったのが00年,本が出始めたのが
昨年くらいからですからね.他の言語と比べるとゆっくりしてるなぁ
HPFは2000の規格を実装するんだろうか?知ってる人がいたら教えてくらさい
337 :
デフォルトの名無しさん:02/11/29 14:59
うーむ...ついに,Object fortranの出現ですか.
ある有名な学者が「究極の言語はObject Fortranだ!」
と言ったとか...
でも,Object fortranの実装には少し時間がかかるだろうなぁ.
C++だってクラスとか継承とか仮想関数だとかで結構複雑になって
ますからねぇ.かなり機能を限定するのでは?
338 :
デフォルトの名無しさん:02/11/29 20:18
計算機によりますが、CとFortranの差は5%程度ですまないことも多いのです。
Cのサブルーチンだと、配列を2つ引数にとったときに、
その2つの配列が重なっている可能性があるために、最適化が制限されます。
並列計算機のアーキテクチャによっては、この制限が致命的になります。
また、整合配列が使えないので、汎用的な行列計算ルーチンを書くのが面倒な
のも大きな欠点です。
>>338 C99のrestrictと整合配列で解決。
340 :
デフォルトの名無しさん:02/11/29 23:08
普段進化的アルゴリズムで数値計算してるモノですが,
CとFORTRAN77では計算速度に最高30%近い差が出ましたよ.
残念ながら(?)GNUよりもFujitsuやSun等の商用コンパイラの方がかなり速いですね.
FORTRAN77の引数やグローバル変数などの問題はもう割り切るしかないです.
30%!それは黙って見過ごす違いではないな。
ぜひFORTRAN77のアセンブリ出力を拝みたいものだ。C以上にいかなる
手段を持って最適化しているのか、後学のために拝見したい。
342 :
デフォルトの名無しさん:02/11/30 01:43
おそらくそう画期的な最適化は無いと思います.
最高約30%の差が出るのは私が使っている問題の性質と思います.
解を出すために遺伝子座が数千の個体が数十個出来ますし,
その操作手順も数千ステップとかなり煩雑です.
おそらく小さな最適化が積もり積もった結果と思います.
343 :
デフォルトの名無しさん:02/11/30 11:19
fortran77での質問です。
hが0から3まで0.2ずつふえていき、
0<h≦1のときは、p,1<h≦2のときはq,2<h≦3のときはr
となるようなプログラムの作成の仕方を教えてください。
また、配列と入力データには何を入れればわからないので教えてください。
御願いします。
344 :
デフォルトの名無しさん:02/11/30 11:36
>>338 >Cのサブルーチン
いかにもふぉーとらんスレですね。。。
345 :
デフォルトの名無しさん:02/11/30 14:23
いろいろ面白い情報をいただきありがとうございました.
今までfortranやC言語に抵抗があったのですが,ようやくその理由が
わかりました.要するに,私は
「サブルーチン,関数の引数の数が多くなり,また引数を渡す際の記法が
煩わしい言語が嫌い」
なのです.COMMON文やグローバル変数を使えば回避できますが,これが
バグの温床になりがちで昔さんざんひどいめにあいました.
でも,これは「スイカに塩をかけて食べる奴が嫌い,トマトに醤油をか
けて食べる奴が嫌い」といった好みの問題だから,言語論をふりかざし
ても決着はつきませんよね.
>>343 申し訳ないけど,質問の意味がわかりません.
p,q,rは何でしょう? 何がp,q,rになるのでしょう?
hはdoループの制御変数と思いますが,h がp,q,r
になるのなら,doループは正常に作動しないと思います.
>配列と入力データには何を入れればわからないので教えてください。
もっと詳しく書いてくれないとこれも理解できないです.
346 :
デフォルトの名無しさん:02/11/30 15:08
>>345 >でも,これは「スイカに塩をかけて食べる奴が嫌い,トマトに醤油をか
>けて食べる奴が嫌い」といった好みの問題だから,言語論をふりかざし
>ても決着はつきませんよね.
むしろFORTRAN77は,
言語に対する理想論はとりあえずおいといてって感じで割り切って使える人でなければ
使うのは難しいと思います.
計算機丸一日回すのが当たり前というような速さがとにかく欲しいという人向けと思います.
347 :
デフォルトの名無しさん:02/11/30 17:11
>>345 P=r*g*h
Q=r*g*b
みたいなかんじです。
rやgは定数としてはじめに宣言しています。
>347
うーん。有限範囲を持つ物体の逆2乗の重力計算ですかね。
h を素直に do ループで増分して、
if で場合分け程度で解決出来ませんか。
>>343,
>>347 FORTRANの前に日本語での説明の仕方を勉強した方がいいぞ。
h の状態に応じて b の値を変えたいの?
この説明だけでは配列とか入力データとか言われてもわからないよ。
どうせ宿題なんだろ。問題文全部晒してみ。
350 :
デフォルトの名無しさん:02/11/30 19:54
>>348 はい、宿題です(笑。
では、お言葉に甘えて。よろしく御願いします。
hは0から3までの範囲で、0.2おきに示す表を作成するんです。
で
0<h≦1のとき
x=dacos(1-2*h/d)
a1=(x-cos(x)*sin(x))*d**2/8
px=ro*g*b*h**2/2
pz=ro*g*a1*b
zc=2*h/3
xc=p**(zc+cos(x)*d/2)/pz
1<h≦2のとき
x=dacos(2*h/d-1)
a1=(pi-x+cos(x)*sin(x))*d**2/8
px=ro*g*b*h**2/2
pz=ro*g*a1*b
zc=2*h/3
xc=p**(zc-d/2)/pz
351 :
デフォルトの名無しさん:02/11/30 19:54
続き
2<h≦3のとき
a1=pi*d**2/8
ax=b*d
hg=h-d/2
px=ro*g*a*hg
pz=ro*g*a1*b
z=(3*h*d-2*d**2)/(b*h-3*d)
zc=h-z
xc=px*(h-hg-z)/pz
です。ro=1000、pi=3.141593、g=9.8とはじめにdata文で定義しました。
b,dは入力ファイルから読み込むようにしようと思っています。
問題文では、b=5,d=2と与えられているのですが、はじめからこの数字を使ったほうがいいのですか?
px等の変数については配列を用いること とありますが、これもいまいちわかりません。
今日は2時くらいまでは起きているので、親切な方、ご教授ください。よろしく御願いします。
まだ意味不明なのだが・・・
353 :
デフォルトの名無しさん:02/11/30 21:10
>>352 どのあたりが不明ですか?
問題文は書いたのですが。
354 :
デフォルトの名無しさん:02/11/30 21:26
最適化について。
例えば、gccでは、未だにソフトウェアパイプライニングも
ベクトル化も並列化も実装されていませんよね。
また、restrictを利用すれば最適化できるのかもしれませんが、
gccでは実装されていません。だから、配列に関するCのコードは
ひどいです。
>351
問題を出した人は、なんのつもりで配列使用の縛りを
入れたんだろう。
f90 で配列演算をさせるつもりなのか、
単に出力表を配列に格納させるつもりなのか。
単に出力するなら配列使わなくてもいいのにねぇ。。。
これって、プログラム自体が目的の宿題っていう感じじゃないね。
なんのアルゴリズムというか手順を修得させる気なんでしょう。
いずれにせよ。。。以下の2点が分からないので
352をはじめ、だれもやる気起きないような気がしマフ
1)この問題の意図は何か?特に配列との関係
2)この問題を受け取った人は、何が分からないのか
というか、単に出力させるだけなら、もう答え出ているじゃん。。。
356 :
デフォルトの名無しさん:02/11/30 23:42
>>355 えーっとですね、fortran77です。はい。
この問題の意図は・・・
多分、doとif文の練習???みたいな。
何がわからないかというと、配列と、
入力データに何を入れるか。
b,dはわかるけど、あとが・・・。
0.2
0.4
0.6
っていれていくのかなぁ。
357 :
デフォルトの名無しさん:02/12/01 00:57
>>356 とりあえず、DO, IF文と配列を使う演習問題風にするとこうかな?
後は自分で()の中を書き足して下さい。
PROGRAM HOGE
PARAMETER (RO=1000.,PI=3.141593,G=9.8)
REAL H(N),A1(N),PX(N),PZ(N),XC(N),ZC(N)
(BとDを入力)
DO 100 I=(N回まわす)
H(I)=I*0.2
IF (0≦H(I)≦1) THEN
(0≦h≦1のときの計算)
ELSE IF (1≦H(I)≦2) THEN
(1<h≦2のときの計算)
ELSE IF (2≦H(I)≦3) THEN
(2<h≦3のときの計算)
END IF
100 CONTINUE
WRITE(*,'(6A12)') 'H','A1','PX','PZ','ZC','XC'
(表を出力)
STOP
END
FORTRAN77って ELSEIF 使えたっけ?
359 :
デフォルトの名無しさん:02/12/01 05:12
>>358 dimension ????????????????
data ro/1000/, g/9.8/, pi/3.141593/
open(7,file='input.txt')
open(8,file='output.txt')
read( 7,*) d,b,number
write(6,*) d,b,number
?????????????????
do 10 k=1,number,0.2 (hが0.2ずつ増えていくことをいいたいんですが、初期値等わかりません。)
?????????????
0<h≦1の範囲のとき
if ((h .gt.0).and.(h .le. 1)) then
x=dacos(1-2*h/d)
a1=(x-cos(x)*sin(x))*d**2/8
px=ro*g*b*h**2/2
pz=ro*g*a1*b
zc=2*h/3
xc=px*(zc+cos(x)*d/2)/pz
else if
以下略で。
b,d の値と、データの個数nをinput.txtから読み込ませようと思っています。
????????????となっているあたりと、10 continue の位置もわからないです。
こんな感じでは、だめなのでしょうか。????や、直すべき点をご教授ください。
御願いします。ちなみに、パラメーター表記も未習です。
360 :
デフォルトの名無しさん:02/12/01 10:44
>>357 F90/95 のMODULEって、インスタンスを一つしかもてないのでは?
(インスタンスという言葉を使っていいのかわかりませんが)
あっしは「メンバ関数を持つコモン」「スコープを持つサブルーチン群」
のようなものと解釈しております。
なので、実際にMODULEを使ってOOのようなことをやろうと思うと
すぐ行き詰まるような気が。
違ったら、指摘お願い。
>359 こういうことを言いたいのかな?。358さんのに追記。
PROGRAM HOGE
PARAMETER (RO=1000.,PI=3.141593,G=9.8)
REAL H(N),A1(N),PX(N),PZ(N),XC(N),ZC(N)
read( 7,*) d,b,number
write(6,*) d,b,number
dx=0.2
k2=number/dx+1
DO 100 I=1,k2
H(I)=I*0.2
IF (0≦H(I)≦1) THEN
(0≦h≦1のときの計算)
ELSE IF (1≦H(I)≦2) THEN
(1<h≦2のときの計算)
ELSE IF (2≦H(I)≦3) THEN
(2<h≦3のときの計算)
END IF
100 CONTINUE
以下略
>359
358 のように親切じゃないですが、
Do ループの変数を、実数でまわすのは止める習慣を
つけた方がいいっす。
358 の様に整数変数に実数刻みを掛ける方が
将来的に、「安全堅牢」な態度が身に付きます。
あと、プログラミング自体が苦手ではない感じ
なのはソースを見ればわかるのですが
10 continue の位置がわからないとか配列宣言が不明とか
極めて基本的な事なんで、言語リファレンスないし
初心者向けの本に1回ぐらいは目を通した方がいいと思います
363 :
デフォルトの名無しさん:02/12/01 13:59
dimensionのところは何をかけばいいのでしょうか?
>>363 配列にしたいものを並べればよろしいかと.
362さんが言うように,まずは参考書を読みましょう.
一行ずつ聞くつもりですか?
>>363 dimension 名前(要素数1 [, 要素数2, …])
が知りたい訳じゃないですよね?
「何を書けば」と聞かれても「どの様にしたいか」によって答えが変わってきますが
>358 の例なら
H(1)=0.2, A1(1)= hが0.2(=H(1))の時のa1(=pi-x+…)の値, PX(1)= hが0.2の時のpx, …
H(2)=0.4, A1(2)= hが0.4の時のa1の値, PX(2)= hが0.4の時のpxの値, …
H(3)=0.6, A1(3)= hが0.6の時のa1の値, PX(3)= hが0.6の時のpxの値, …
…
といった具合に計算結果を保存したいので
> REAL H(N),A1(N),PX(N),PZ(N),XC(N),ZC(N)
として H,A1,PX,PZ,XC,ZC がそれぞれ要素数N の配列になる様に宣言しています。
後はこれらの配列が上記の内容になる様に DOループ内で計算させて、
全ての計算が終わった後に配列の内容を出力すれば良いのではないでしょうか。
366 :
デフォルトの名無しさん:02/12/01 15:26
real h(n),x(n),a1(n),px(n),pz(n),xc(n),zc(n),hg(n),z(i)
data ro/1000/, g/9.8/, pi/3.141593/
open(7,file='input.txt')
open(8,file='output.txt')
read( 7,*) d,b,n
write(6,*) d,b,n
h(i)=0.0
do 10 i=1,n,0.2
h(i)=h(i)+i
c-----0<h≦1の範囲のとき
if ((h(i) .gt.0).and.(h(i) .le. 1)) then
x(i)=dacos(1-2*h(i)/d)
a1(i)=(x(i)-cos(x(i))*sin(x(i)))*d**2/8
px(i)=ro*g*b*h(i)**2/2
pz(i)=ro*g*a1(i)*b
zc(i)=2*h(i)/3
xc(i)=px(i)*(zc(i)+cos(x)*d/2)/pz(i)
以下略。
にしたのですが、
do 10 i=1,number,0.2でThird parameter of DO statement must not be zero
*Invalid DO statement
x(i)=dacos(1-2*h(i)/d)で* DACOS is an intrinsic function used with invalid argument(s)
elseif ((h(i) .gt. 2)). and.((h(i) .le.3)) thenで* Invalid IF or ELSEIF statement
とエラーが出てしまうのですが、どのように解決すればよいのですか。
368 :
デフォルトの名無しさん:02/12/01 15:53
>>367 Do ループの変数を、実数でまわすのは止める
ってやつですか?
この意味もわかりません。
教科書読んでみたんですが、やっぱりわからないので、質問したのですが。
第一行目のz(i)はz(n)のミス。けど、それでも、
そこでエラーが出てるし。
>>368 整数型変数iに,整数でない0.2の増分を与えてループさせるのがおかしい.
361を読むべし.
>>366 > (x(i)=dacos(…でエラー)
DACOS関数の引数の型と現在のプログラムを比較してみましょう。
なぜここだけ明示的に「DACOS」なのかも疑問ですが。
使用するデータ型の指定は無かったのですか?
> (elseif …でエラー)
括弧の対応
>>378 >(1行目でエラー)
配列の要素数が不定なのが原因。
「hは0から3までの範囲で、0.2おき」と指定があるのなら
必要なデータ数は決まってくるのでは?
371 :
デフォルトの名無しさん:02/12/01 17:21
使った教科書や Fortran コンパイラがなんなのか不明ですが...
1)変数の型、特に数値は整数、実数の区別をはっきり”意識”する
意識するのが面倒ならば、コンパイラにさせるよう
最初に型宣言しておく
→Do でのエラー
2)数学上の逆関数 Arccos が Fortran でどうなっているか
(言語リファレンスで)確認する。特に注意書きを読む。
→DACOS でのエラー
3)2)同様 IF 及び ELSEIF の言語リファレンスを読む
→IF or ELSEIF のエラー
4)配列の宣言を教科書または言語リファレンスで確認する。
特に大きさをどうやって宣言するかはしつこく確認。
→z(n) でのエラー
5)コンパイラーのメッセージ内英単語は、簡単な単語なので
辞書を引く
>355
学生に問題を出すときに制限を付けることはよくあります.配列使用
の縛りは,配列を用いたループの使い方を習得させるためじゃないかな.
特に,代入,初期化,判断文,ループの概念をなかなか理解できない
ようですから.
プログラミングって大学で教えるような技術じゃないんですよね.
単にデータフローを作ってるだけだし.
だから,数値アルゴリズムの授業がメインとなってしまう…
>357
CでもOOPは可能ですから、f90/95でも出来ますよ。
構造体に変数と関数ポインタをパックすればいいので
ただ、OOP言語っていうのは、言語仕様に含まれるという意味だと
個人的に思っているので,f90/95はOOPではないと思いますね
373 :
デフォルトの名無しさん:02/12/01 19:57
>372
うーん。プログラミング教えるのなんか大変そうですね。
数値アルゴリズムだけだと、構成的な解析分野の数学の証明
、つまるところ逐次近似みたいになるのですかね。
なんかコンピューターのプログラミング教えるのって、
融通が利かない&特別な能力を持つ「変人」へどう指示出すか、
っていうマネジメント教育みたいですね。
do 10 i=1,number,0.2 →整数で回すべし。361を参照。
x(i)=dacos(1-2*h(i)/d)で* DACOS →dacos(倍精度実数型)でいいの?acosじゃないの?
elseif ((h(i) .gt. 2)). and.((h(i) .le.3)) thenで* →Ifの使い方は大丈夫?
375 :
デフォルトの名無しさん:02/12/01 20:47
みなさん、ご親切にありがとうございます
今、いろいろやってみてるんですけど、やはり・・・・。
do文でiをsに変えてみたんですけど、何も変わらず。
*** PZ has non-integer subscript(s)
などとでてきます。
また、一番初めに*** An adjustable array is only allowed in a subroutine or function
てでてくるのですが、これは
real h(n),x(n),a1(n),px(n),pz(n),xc(n),zc(n),ax(n),hg(n),z(n)
が、問題なのでしょうか。
nはhが0から3まで0.2ずつ増えていくので、n=15なのですが、
nはデータの個数で、h<3のときは、計算自体をSTOPさせるようにしたいのですが、
どうすればいいのでしょうか。
さらに、0<h≦1での計算のプログラム、
hがそうでなかったら、1<h≦2の計算のプログラム、
hがそうでなかったら、2<h≦3の計算のプログラム、
hがそうでなかったら、3<hでSTOPさせようと思っているのですが、
その際に、elseifは何回使ってもよいのですか。
『土木情報処理の基礎』という本を教科書に使っています。
これを参考にしているのですが、説明が不足しているような気がします。
ご教授ください。御願いします。
376 :
デフォルトの名無しさん:02/12/01 23:56
>375
うーん。本があまり良くなさそうだね。
まあ Fortran なら、 google れば日本語の解説もあるんじゃない。
そうすれば以下の問題は解決する。
1)PZ has non-integer subscript(s)
→変数型の問題。もしその本が変数の型について
触れてなければ直ちに Fortan と付いた別の本も買う。
なお、 do 10 s=1,number,0.2; h(s)=s* x と
do 10 i=1,number; h(i)= i*0.2 * x が同じように
感じるならば徹底して別の本を読み直す事を
おすすめする。
最初の例の h(i) が変なのはなぜか?
h(i) を計算する右辺は、数学的に同じなハズなのに違うのはなぜか?
勝手に変形してはいけません。
2)An adjustable array ...(以下略)
→これは配列の宣言の話。もしその本が配列の宣言について
いろいろな具体例のみならず間違い例が無ければ
やっぱり別の本が必要。
追伸
ここはプログラム系と云う事なので、 Fortran コンパイラー
に付いての情報もあった方がいいと思います。
377 :
デフォルトの名無しさん:02/12/02 00:30
>376
ご指導ありがとうございます。
1)に関して。暗黙の型宣言でiは実数だからsにしたんですけど、
それだけじゃだめなんですね。
まったく同じものにみえてます、はい。
0.2を1/5にするとか・・・・・・・はぁ。
2)に関して。配列ですか。
配列は、dimensionしか習ってないので、たぶん、これしか使えないんですよね。
きっと。
問題に関してもいくつか不明な点もあるので、先生に聞こうと思ってますが。
追伸でご指摘があったので。
CPad for Salford FTN77
というコンパイラーを使ってます。
実行もしてくれるので、便利かなと。
>377
1)
暗黙の型宣言は使わないほうがいいです
Integer やRealで明示的型宣言を使うようにしましょう
ちなみに,1/5は0です…コンパイラによるけど
2)
parameter N=15
real h(N)
なら動くはずです。f77使わないのでうろ覚えだけど
Fortran77のprogram文内には固定サイズ配列しか
置くことが出来ないのです。
質問の内容を見ていると、いろいろと基本的な概念が理解できて
いないようです。がんばって学んでください
・エラーがでたら,その部分に注目しよう
例えば,
real h(n),x(n),a1(n),px(n),pz(n),xc(n),zc(n),hg(n),z(i)
の行だけでエラーがでませんか?
・値が怪しいときは,値の変化を追いかけよう.例えば
write(*,*) h(i)
の一文をループに入れて,値を確認しよう(こういう行為をデバッグといいます)
・どれを入力にして,どれを出力して,どれを保持するのか?これはプログラミング
の大きな要素です.よーく考えてください.
・フルプログラムをいきなりべた書きするのは止めよう
自分の能力に自信が持てるまでは,少しずつデバッグを繰り返しながらプログラムを
作り上げる癖をつけましょう.この問題なら,
1.変数宣言だけをつくる→テスト
2.変数を初期化するとこまでつくる→テスト
3.配列h(i)に値を入れる部分と配列h(i)を出力する部分を作る.まず
do i=1,2
として,上手く動くか確かめる→テスト.次に,h>3.0でループが
止まる構造を考える→テスト.
4.ループをi=1,2に戻して,if構文を入れる→テスト.
フルループを回す→テスト.
全ての判断要素を入れる→テスト.
慣れた人でも,いきなり全てべた書きできるわけではありません.天才でもない
限りは,このように少しずつ組み上げていきます.
レス番入れ忘れた…
>379は>377さん宛てでふ
381 :
デフォルトの名無しさん:02/12/02 02:08
>380さん。
アリガト!(´▽`)。
少しずつがんばってみます。
けど、提出期限もあったり。あわわわ。
ちなみに、既習事項。
dimension
implisit文
if文
do文
組み込み関数
open及びwrite文
このくらいですかね。
これだけでもできるんですかねぇ。
>381
プログラミングに必要な知識は
変数宣言 integer, real,dimension
演算子 +-*/ **
判断 if elsif else .ge. .eq. ...
繰り返し do do while
入出力 open close read write
たったこんだけです.大規模プログラムには,
ユーザーサブルーチン・関数
が加わります.これで,おしまい.どんなものでも作れます.
これは,どんな言語でも同じです.逆に,これらが理解できないと
何も作れません.
初心者は必要な知識が少なすぎて困惑するのかも知れないなぁ
383 :
デフォルトの名無しさん:02/12/02 03:03
なんとかコンパイルはできました。
しかし!!!
実行できません。
コンパイルはできているのに、実行できないってあるんですか。
どうすればいいんだああああああーーーーーーーーーーーー。
すみません。取り乱してしまいました。
>383
頼むから,>379を読んでください
・まず,実行できないという表現はありえません
・最も簡単なプログラム write(*,*) "test" は実行できますか?
実行できないなら,そもそもリンク作業を行っていません
実行ファイルの作り方から復習してください
・エラーが起きていますか?
それなら,
・0で割った(overflow,ゼロ割)
・配列のサイズを超えたアクセス(segmentation fault,f77で起きるかどうかしらん)
が考えられます.適当な行に write(*,*) "koko" という文を入れて,そこまで実行
されるかどうか確かめてください. エラーが起きた行を捜します
・単に出力がでないという意味なら,無限ループの可能性が高いです
ループに write(*,*) h(i) という文を入れて,ループが予期した通りに動いているかどうか
確かめましょう
なんか釣られている気がしてきた…
386 :
デフォルトの名無しさん:02/12/02 07:41
>>384 OSは、Me,
コンパイラーはCPad for Salford FTN77です。
>>385 いろいろとありがとうございます。
今日、また確認作業をやってみます。
387 :
デフォルトの名無しさん:02/12/02 07:42
>385
僕は多分 Arccos ではまっていると思いますね。
388 :
名無しさんに接続中…:02/12/02 17:11
integer m,m,wasa,seki,sho,amari
real x,y
WRITE(*,*) "n =?"
read(*,*) n
write(*,*) "m =?"
read(*,*) m
wa = m + n
sa = m - n
seki = m * n
sho = m / n
amari = m = n*sho
write(*,*) "m + n = ",wa
write(*,*) "m - n = ",sa
write(*,*) "m * n = ",seki
write(*,*) "m / n = ",sho
write(*,*) "amari = ",amari
c
write(*,*) "x =?"
read(*,*) x
write(*,*) "y =?"
read(*,*) y
write(*,*) "x*y = ",x*y
write(*,*) "x/y = ",x/y
stop
end
こんなのを作ったら、下のようなエラーがでました
次のようなエラーがでました
(0003)のエラーの意味ってなんでしょうか?
■C:\Documents and Settings\Owner\My Documents\fcpad231\Fortran> ftn77 /link 面積.for
[Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998]
Licensed to: FTN77 Personal Edition
Department: Non-commercial use only
0001) integer m,m,wasa,seki,sho,amari
WARNING - M has already been declared with this data type
0003) WRITE(*,*) "n =?"
*** An alternate return specifier is only allowed in a CALL statement
^C
390 :
デフォルトの名無しさん:02/12/02 18:05
よくみてないけど,
integer m,m,wasa,...
↓
integer m,n,wasa,...
これなんだ?>389
amari = m = n*sho
388です。もっとシンプルなのにしてみても同じエラーが出てしまいます。
integer m,n
write(*,*) "m =?"
read(*,*) m
write(*,*) "n =?"
read(*,*) n
wa = m + n
write(*,*) "m + n = ",wa
stop
end
以下のようなエラーです。
■C:\Documents and Settings\Owner\My Documents\fcpad231\Fortran> ftn77 /link ydfg.for
[Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998]
Licensed to: FTN77 Personal Edition
Department: Non-commercial use only
0002) write(*,*) "n =?"
*** An alternate return specifier is only allowed in a CALL statement
0004) write(*,*) "m =?"
*** An alternate return specifier is only allowed in a CALL statement
0007) write(*,*) "m + n = ",wa
0008)
0009)
*** """ found where not expected
*** Invalid input/output list
4 ERRORS [<MAIN@>FTN77 Ver 4.03]
*** Compilation failed
^C
388
write(*,*) "m =?"
write(*,*) "n =?"
を消したら、実行できました。
でも、使うときにわかりにくいなぁ。
395 :
デフォルトの名無しさん:02/12/02 21:14
>write(*,*) "m =?"
Fortranではwrite(*,*) 'm =?'じゃなかった?(もう、覚えてないよー!)
396 :
デフォルトの名無しさん:02/12/02 22:28
>>395 できました。本当にありがとうございました。
398 :
デフォルトの名無しさん:02/12/02 23:05
>write(*,*) "m + n = ",wa
ていうかこれも実行できたのか?
WRITE(6, '(A,F10.0)') 'm+n=', wa
あたりじゃないと苦しくない?
waよりもiwaとかにしたほうが良いだろうけど
399 :
デフォルトの名無しさん:02/12/03 14:04
サブルーチン法で解いてもらいたいのですが・・・
よろしくお願いします!
parameter(N=3)
dimension A(N,N),b(N),x(N)
data a/2,1,4,4,-1,1,6,5,-2/
data b/28,7,21/
do k=1,N-1
do i=k+1,N
p=a(i,k)/a(k,k)
do j=k+1,N
a(i,j)=a(i,j)-p*a(k,j)
end do
b(i)=b(i)-p*b(k)
end do
end do
do i=n,1,-1
temp=0.0
do j=i+1,n
temp=temp+a(i,j)*x(j)
end do
x(i)=(B(i)-temp)/a(i,i)
end do
400 :
デフォルトの名無しさん:02/12/03 15:28
すっかりFortran宿題スレになってしまう予感。
宿題教えてくんが来るまでは大人な雰囲気のすれだったのに。
みんな親切に教えてあげすぎかも。
401 :
デフォルトの名無しさん:02/12/03 17:26
>399
つーか、よく見たらガウスの消去法じゃねぇか
なにをサブルーチンにしたいんだよ
サブルーチンの定義から勉強してこい
403 :
デフォルトの名無しさん:02/12/03 17:38
ガウス消去法の部分をサブルーチン化するんでしょうけど。。。
サブルーチン側で整合配列?使うのかなぁ
404 :
デフォルトの名無しさん:02/12/03 18:12
拡張子を「.for」から「.f90」に変更して
program program1
parameter(N=3)
dimension A(N,N),b(N),x(N)
data a/2,1,4,4,-1,1,6,5,-2/
data b/28,7,21/
call gauss();
print *,(x(i),i=1,N)
contains
subroutine gauss()
do k=1,N-1
do i=k+1,N
・・・
x(i)=(B(i)-temp)/a(i,i)
end do
end subroutine
end program program1
なんちゃって
405 :
デフォルトの名無しさん:02/12/03 19:02
f90にはcontainsがあるんですねぇ。時代は進んでしまった。
でも、a,b,xが大域的配列だとすると、このcontainsは何のために
あるんでしょうか? 'データ晒しあげ'の感がするんですけど。
406 :
デフォルトの名無しさん:02/12/03 21:26
C公開の影に隠れてる Watcom の FORTRAN コンパイラはどうですか?
GNU, Sun, Fujituのコンパイラではすんなり通るソースも Watcom でまともにコンパイルできたこと無いから
速いのかどうかすら分かりません・・・
http://www.openwatcom.org/ inte lのはなぜか FORTRAN95 規格でコンパイルしてしまい,ワーニング出まくるので調べ中です.
407 :
デフォルトの名無しさん:02/12/04 01:12
>405
containsは複雑な入力ルーチンの隔離やmodule内サブルーチンに使いまふ
program main
use UTIL
implicit none
...
call func();
...
end program
module UTIL
real :: grobalVar;
...
contains
subroutine func()
...
end subroutine
end module
>>406 ifcはコンパイルoption付けるとワーニング消えるよ
初めて書き込みします。自分は卒研でfortranを使っているのですが、
まだ経験が浅く根本的によくわかっていなく、色々と勉強をしている
のですが数ヶ月勉強しただけではわからないことが多すぎて頭がおか
しくなりそうで教えていただきたいのですが、LAPACKの使い方がよく
わかりません。
LAPACKのルーチンをすべてコンパイル時にリンクすることは可能なの
ですか?
リンクの仕方もあまりよくわからないバカものなのですが、LAPACKの
うまい使い方を教えて頂けたらうれしいです。
具体的には非対称固有値問題(NEP)ルーチン名は ZGEEVX を使おうと
思っているのですが、なにかアドバイス頂けたらありがたいです。
>>408 そのコンパイルオプションを探してるんですけど,見つからないんです・・・
411 :
デフォルトの名無しさん:02/12/05 00:11
>>409 コンパイラはVisual Fortranですか?それともgccのf77ですか?
Visual Fortranじゃなかったら残念ながら(私には)答えることができません。
あなたが使っているコンパイラに詳しい人がいたらいいんですけど。。。
>LAPACKのルーチンをすべてコンパイル時にリンクすることは可能なの
>ですか?
理解が少し間違っていると思うけど、希望のルーチンはリンクできます。
リンクの仕方には2通りあって、Windowsの場合?、静的なリンク(*.libのファイル
を使う)と動的なリンク(*.dllのファイルを使う)があります。
412 :
デフォルトの名無しさん:02/12/05 00:24
>>409 LAPACKの配布パッケージ内のソースだけで完結しているはず。
ただし、BLASも必要(BLASはLAPACKの配布パッケージにも入っている?)
いきなりルーチンを使うのは無謀だから、まずは、付属の
テストルーチン(ZGEEVXであれば、ZCHKEE.f)の動作確認。
その後、zchkee.fの中から呼び出されるZDRVVXがZGEEVXのドライバ
になっているので、ZDRVVXあたりを見ながら使用法をマスター。
おっと、411さんの回答がありましたね。
ちなみに、圧死もVisualFortranでした。
>>411 返事していただきありがとうございます!
コンパイラはAbsoft Pro Fortran for windows 7.5です。
担当教官がほとんどコンパイラの使い方がわかってない
という最悪な状態なので、なのにいつも結果をだせしか
言いません。LAPACKについても分からないらしくここに
きたしだいです。
例えば自分が使いたいZGEEVXのルーチンの中にCALL文が
ある場合は、そのCALLされているルーチン全部リンクさせなければ
いけないのですか??
>>412 ありがとうございます!
BLASで検索かけたところ blas.lib f77blas.lib cblas.lib
などがありました。BLASという言葉は今日の昼間色々調べていて
知ったばかりです。計算の精度をよくするようなことが書いてあって
ような。programやり始めて3ヶ月ぐらいであんまり専門用語が分からなく
をうしわけないです。
LAPACK利用手引を見ながらやっているんですが、ZDRVVXのルーチンの説明
がありません。なんとか調べてみたいと思います。
動作確認というのはコンパイラによってやり方がことなるのですか?
まったくやり方がわからない素人にでも、簡単に説明できたら教えてください!
>415
>担当教官がほとんどコンパイラの使い方がわかってない
>という最悪な状態
最悪じゃありません 普通です(  ̄ー ̄)
ちなみにそういうときの解決法
1.先輩に聞いてみる(そういう研究室には研究実行部隊がいる)
2.学内で他に使っている人を探す(意外といるもんです)
3.Web検索をかける(←最近はもっぱらこれ)
>動作確認というのはコンパイラによってやり方がことなるのですか?
異なります 説明書を読むしかないでふ うちはVFなので知らない
>>415 プログラム組まされるような学部に在籍しながら
>programやり始めて3ヶ月ぐらい
つーのと
>担当教官がほとんどコンパイラの使い方がわかってない
>という最悪な状態
つーのはどっこいどっこいな気が・・・
>まったくやり方がわからない素人にでも、簡単に説明できたら教えてください!
御願いだからまず図書室にでも行ってそれなりの入門書を真剣に読んでください.
電算機室のUNIX端末でg77かf77かfrtあたりのコマンドあるか試して見てください.
たいてい
g77 source.f -o binary
のようなコマンド引数でコンパイルできます.
>418
一番最悪なのは
担当教官がある言語の使い方しか分からなくてそれを強制される状態
です^^。
しかし、プログラミングの勉強なんか2週間もあれば足りると思うけどなー
ましてやFortran77。
会社だと1〜2週間くらいしか時間くれないよね…
それで出来ない人は無能って感じだし まぁ、危機感の違いかね
fortranの必要な会社って・・・
421 :
デフォルトの名無しさん:02/12/05 02:32
>担当教官がほとんどコンパイラの使い方がわかってない
>という最悪な状態なので、なのにいつも結果をだせしか
>言いません。LAPACKについても分からないらしく.....
キツイかもしれないけど、思うところがあったとしても
「それを言っちゃぁー、オシマイよ!」。
私は、学校の教官です。自分もその中の一人です。
「どうして大学、高専の先生は見てるだけで、何も言わ
ないんだろう?学生とプログラマが直接、接触してしま
うことが問題なのに。一部の先生は見てるはずだけど。。。」
と思うことはあります。(C/C++と違ってFortranの場合、
プログラマは少ないと思いますが)
>421
なんで問題なんすか?
昔はそもそも大学の先生もプログラミングがよく分からなくて(言語の遷移が
早すぎたので仕方ない)、独学で覚えていたけど。いろいろ本も読んだし、
当時のプロの人に聞いたりもした。別に問題があったとは思えないなぁ。
就職関係?
423 :
デフォルトの名無しさん:02/12/05 03:17
>就職関係?
。。。?
教官さんの日本語がよくわからない・・・
>423
学生と会社の接触というと、青田刈りを思い浮かべてしまった
日本語の不自由な人がいるスレ
>担当教官がほとんどコンパイラの使い方がわかってない
それは教官がFORTRANを使いたいという意欲がないだけでしょう。
本当は他の言語を使いたいけれど学ぶ暇が無いか、効率よく学ぶ方法をしらないか、とっつきにくてなかなか他の言語で授業をできない、とか。
そういうときこそ、教官は高級言語に詳しそうな学生に頼るべきである、と思う。
>>426 あんた、ほかのスレッドでも同じようなこと書いて回っているようだが、何が言いたいのかな?
荒らしというわけでもないがどうしようもない暇人か?
不自由感じて不満ならどうして欲しいか説明するこった。
なんかFortranから離れてきてるな
大学では未だFortran77が主流なのかね
研究なら分かるけど、授業はどうなんだろう
アメリカではプログラミング授業の90%以上がC,C++,Javaになったと聞いた
ただ、Cを使って初心者用セミナーなんかやると、言語の基本を教えるなら
BasicやFortranの方がいいと思った(最初の数時間くらいは)
プログラムエントリが自由な言語は初心者には向かない
>>420 そういうところも.....あるといえばある。
ちなみに、55=412
431 :
デフォルトの名無しさん:02/12/05 10:46
>>427 昔は情報系の先生が他学科から要請を受けてfortranを出張講義することが
多かったけど、その当時、学生だった私は「Fortranなんか。。。」という
教官の露骨な態度を感じました(もちろん、情報系の先生がすべてそう、と
いうわけではない)。しかし、私のときの教官には、a=a+1の意味や配列の
概念ぐらいきちんと教えてほしかった、という思いが今でもあります。
421 != 426 だけど、421のことを言っているんでしょうか?
>荒らしというわけでもないがどうしようもない暇人か?
まぁ、そうかもしれませんね。もう書き込みをいっさい止めようかと考え
始めています(といって、あちこちに書き込んでいたわけではない)。
掲示版に書き込むことは結構つらいし。。。
プログラマの方は(一流のプログラマを目指す)新入社員を指導教育される
立場でもあるから、どうしても新入社員の教育という基準から発言しがち
です。でも、掲示版の質問者は全てがプログラマを目指しているわけでは
ありません。(本当を言うと、私を含めて)学校の先生がもっと積極的に発言
したり、質問に回答してくれればな、と思います(でも、無理だろうなぁ。)
>428
僕が扱っている Fortan ソースコードはアメリカの大学で
最近作ったものです。
後、歴史のあるソースだと Fortran を引きずる事が
多いそうです。
もちろん F77 です。抜けられませんね。
まあプログラム言語もさることながらプログラミング書式作法
やプログラムの設計自体にももっと注目されてほしいです。
なんか悪文を読んでいる感じがするソースコードでちょっと辟易。
ソフト開発を生業とはしていない会社の、それでも数値解析などが必要となる
ような部門で、そのアプリを面倒を見ているような部署(=うち)では、
プログラムに関する勉強してきたやつなんてそもそも採用していないものだから、
ごくふつーの理系のお勉強をしてきたやつが入れ替わり担当する。
数値解析系プロは、過去の遺産を引きずっているので必然的にFORTRAN
が多いのだが、まぁ、教養課程でFORTRANくらいは触ったことあるはずだから、
大丈夫だろう、ということでプログラムの開発・メンテナンスの仕事を
与えられる。しかし所詮ド素人なので、滅茶苦茶なコードを書き残して、
しばらくすると他部署へ移動と相成る。
結果として、プログラミングをよく知っていればいるほど
恐ろしくて手が出せなくなる、悪い冗談のような、
かといって廃棄もできないプログラムが受け継がれる。
あああああああかきなおしたい
最近の大学でもFortranで情報処理の授業するんですかねぇ
437 :
デフォルトの名無しさん:02/12/08 14:28
age
438 :
デフォルトの名無しさん:02/12/08 15:40
c言語ってフリーじゃないですよね?
439 :
デフォルトの名無しさん:02/12/08 19:17
正規分布の確率密度を
ある点Xから無限まで積分で
求めるプログラムを教えてください。
できれば、シンプソンと台形公式(2重積分)の2通り
お願いします。
442 :
デフォルトの名無しさん:02/12/12 22:11
age
443 :
デフォルトの名無しさん:02/12/14 01:38
一つ質問です.
FORTRAN 77 で OpenMP を使いたいのですが,
なにか良い書籍かサイトありますでしょうか?
444 :
未熟者m(__)m:02/12/19 10:22
いきなりなんですが、
『F=sin(x)+cos(x)のとき、x=0,45,90,180の値を求めよ』
って問題なんで、こんな感じで作ったのですが
−−−−−−−−
IMPLICIT NONE
REAL A,Y
WRITE(*,*)'A= '
READ(*,*) A
Y=SIN(A)
WRITE(*,*) Y
STOP
END
−−−−−−−−
動きません(T_T)よろしければ訂正もしく新たなプログラム教えてください。
445 :
未熟者m(__)m:02/12/19 10:24
上のものです
書き忘れありました。プログラムはfortran77です
>>444 課題は、Fを求めるんだよね?
上のソースはその課題の一部だな。
ソースを見る限り、degreeとradianを混同させている可能性があり、
デタラメな値を返すことが予想されるが、動かないなんて事はないと思う。
7カラム目から書いてなかったら跳び蹴りモノだが。
448 :
未熟者m(__)m:02/12/20 07:39
なんとか無事計算結果が出ました!!
>>448 結局何が原因で,どうしたら解決したのか
書かないのですか?
450 :
未熟者m(__)m:02/12/20 16:48
角度の部分をラジアンに変えるということを知らずそこをいじったらちゃんと計算しました
こんな感じです↓
−−−−−−−
IMPLICIT NONE
INTEGER DEG
REAL A,C,S,R,X,F,D
WRITE(*,*)'角度は?'
READ(*,*) D
R=3.14159/180.0
DEG=D
X=R*REAL(DEG)
S=SIN(X)
C=COS(X)
F=S+C
WRITE(*,'(2F8.4)') F
END
−−−−−−−
451 :
デフォルトの名無しさん:02/12/21 00:03
突然ですが
visual fortranでcpuの最適化は可能ですか?
cpuの最適化…出来たら面白いな…
453 :
デフォルトの名無しさん:02/12/21 11:09
>>451-452 確かにできたら凄いな(w
「特定のCPUに合わせた最適化」なら
オンライン・マニュアルで「/architecture」を検索しる!
>>452-453 > cpuの最適化…出来たら面白いな…
そう言う研究は、昔からあるよ。
最近は、FPGA が大規模化してきたから、そのうち実用になるかも。
オンライン・マニュアルでは,
/tune オプションを使うと,生成される最適化されたコード形式を指定す
ることができます。特定の実装に合わせてチューニングを行うことで,実
行時性能を向上させることができます。また,特定の目的に合わせてチューニングされたコードは,他の目的では実行速度が低くなることがあります。
とあったのですがこれが何を意味するのかさっぱりわからんのです.
DF コマンド行で実行可能ってあるのですが,DF コマンド行とはなんでしょうか?
456 :
デフォルトの名無しさん:02/12/21 18:50
>>455 # 今手元にVisual Fortranがないのでマニュアルだけ見て説明すると
> DF コマンド行
「DF」はコマンドライン・コンパイラ。
例えばPentium4で実行したときに一番速くなる様にしたければ
コマンド プロンプト(MS-DOSプロンプト)で
C> df /tune:pn4 hoge.f90
の様に「/tune」オプションでCPUの種類を指定してやれば
Pentium4用に最適化してくれる。(他のCPUでも実行はできる)
またそのプログラムをPentium4でしか実行しない場合は
C> df /arch:pn4 /tune:pn4 hoge.f90
の様に「/arch」オプションを使うと、そのCPU特有の機械語命令を使って
最適化してくれる。(互換性のない他のCPUでは実行できない)
Microsoft ビジュアル開発環境なら「Project Settings」ダイアログボックスの
「Fortran」タブにある「Project Options」のところに「/tune:pn4」等と書き加えればいい。
自分が実行したいマシンのCPUが解らない場合はとりあえず
「/tune:host」とすればコンパイルしたマシンに合わせて最適化してくれる(はず)
>>456 どもありがとうございます.
早速実行してみます.
458 :
デフォルトの名無しさん:02/12/23 13:07
>>455 IDEからでもプロジェクトの設定で、
FORTRAN - Code Generation
FORTRAN - Optimizations
で設定できるかと
最適化できたのはいいが1/40計算するのに5500sかかった・・・
こんなんざら?
>>431 >>421 ではなくて、 一行しかいていない 愚痴っぽい
>>426 のことを言っているんですよ。勘違いして余計なことを気にしていますね。余計なこと書かない方がよかったかな。
FORTARANやるんだったらMathematicaやMATLABのほうが使い勝手が良いかなっておもう。
FORTRAN77はソースコードの解読が比較的楽だから、俺は、もしFORTRANで書かれた短いサンプルプログラムを参考にしてプログラムを作れという課題を出されたらすべでCかJavaに書き直す。
461 :
デフォルトの名無しさん:02/12/28 04:09
プログラムド素人なんですけど、
FORTRAN77で書かれたプログラムをFORTRAN90,95用のコンパイラーで
コンパイルするにはどうしたら良いのでしょう?
ちなみにVISUAL FORTRANというコンパイラーをつかってるのですが。
462 :
デフォルトの名無しさん:02/12/28 04:58
463 :
デフォルトの名無しさん:03/01/08 14:28
CプログラムからFortranのサブルーチンを呼んでいるのですが、そのCプログ
ラムと同等(のつもり)のFortranプログラムとの挙動が一致しないんです。厄
介なのは、パラメータによって一致するときとしないときとがあるんです。正
しい結果のときもあるのでCからFortranサブルーチンを呼ぶ方法は大きく間違っ
てはいないと思っているのですが、何か注意すべき点などありますでしょうか?
ヒントをいただけるとありがたいです。コンパイラはgccとg77です。
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
ひろゆきは帰った?wwwww
ニュー速への流民が増えそうですね
2ちゃんねらが全員誹謗中傷行為をやってると勘違いしてる模様。
本当にそうだったらんなコピペされんでも皆消えとるわ。
468 :
デフォルトの名無しさん:03/01/09 08:09
>463
添字が2つ以上の配列を値渡しとアドレス渡ししている差では?
職場、学校、座敷牢から気兼ねなく書き込みでける
ってゆってたのにー
プンスカ!!
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
素朴な疑問ですが、どうしてこの板だけスレストされるのですか?
IPとってる板
qb : 2ch批判要望 削除議論 削除要請 削除整理
live2 : ニュース速報
tmp : ニュース極東 ちくり裏事情 政治思想 Download
厨房! 人権問題 バカニュース 薬・違法
ゴーマニズム ロビー 最悪 少年犯罪
違反の潰し方 ペット苦手 なんでもあり 学歴
>141
博之が取って無くても国が取ってます。ルートサーバー全部傍受されて記録されています。
同時に、国家機関に対してプライバシー等元からありません。
つまり、只の嘘なのです、 裏の利権団体が作り出した虚構 それがこのサイトです。
従って、 残念ですがそういった反社会的な犯罪は
私も自戒しつつ 暴露します。
すいません。
非常に勝手です。
私に力を頂けますでしょうか>皆さん
復活した模様
>>910 変なのが減っていいと思うけどね
チャット状態の板なんて決ってるでしょ
>>548 誤爆キターーーーーーーーーー!!おまいもどんなのか知らないのか?
・圧縮やなんかでdat落ちした分を省いた=若干落ちてます。正解です。
・報告無しで処理された分を省いた=上記例示183の意見に従っています。恣意的なまとめ反対です。
ちなみに名無し★で1年間強活動していました。
・まとめが好きで好きでたまらないまとめ大好きっ子だった=概ね同意です。
http://qb.2ch.net/test/read.cgi/saku/1038125433/8 ・まとめをマメにしてみましょう。
★T氏に確認した時に「コツコツ頑張ってるなぁ。」との お言葉を頂きました。
私はつい先日までリアル中卒2年間引きこもり中3の時酒乱の父の暴力で
リコーン母親家に引き取られました(マジ で頭が悪いので
(なぜか某学士号+国家試験数個持っている罠+未だに司法試験浪人中な罠)
お指導をお待ちしております。m(_ _)m。
>>468 ありがとう。2次元配列を渡してたんだけど、添字の順序が違うのねえ…。
気がつくまで何日も悩んでいました。鬱だ。
ところでここってFortranスレですよね?
fu-n
>>345 逮捕されるような書き込みをする奴は僅かだろうし
荒らしはどうせ回避策をちゃんと取って来るし
2ちゃんねらは飽きっぽいので今までと変わらんと思う
スレタイの日本語、微妙におかしいね。
あげてみたり。
そういうのは厳しくなりそう
P2Pとかに潜るんでしょう
485 :
デフォルトの名無しさん:03/01/11 00:59
>479
ということはアドレス渡しですか?
C<>Fortran の多次元配列渡しで
添字順序が違うとなると、添字順序の
マニュアル最適化は面倒ですね。
486 :
fortrun初心者:03/01/11 08:41
VisualFortranを使ってプログラムを作っているのですが、
txtファイルを読み込んでくれず、エラーが出てしまい
ます。こんなエラーが出てきます.
forrtl:severe (256):unformatted I/0 to unit open
for formatted transfers,unit 2,file d:\E\debug\test.txt
プログラムは、下に書きます。
INTEGER A,B,C,D
OPEN(UNIT=2,FILE='test.txt')
READ(2) A
READ(2) B
READ(2) C
D=A
CLOSE(2)
OPEN(4,FILE='D:REN.TXT')
WRITE(4,*) D
CLOSE(4)
STOP
END
初心者の自分にお教え下さい。宜しくお願い致します。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
489 :
デフォルトの名無しさん:03/01/11 10:35
>486
Visual Fortran のヘルプで Read を引いてみて下さい。
っていうか、それくらいしないとこれから苦労しますよ。
まあ今回1回だけの宿題のつもりなら調べる気は
起きないでしょうが。
IP12!
はぁ。もうテンプレ張るのやめた。
継続には付けないことが多いよ
具体的には「某」というコテハンの人だと思う。
11 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:16 ID:rLfxQ17l
全レスです。
2ちゃんねるも現実ですよ。
あらまぁお二人で(w
↑
こいつ、気合い入ってるな
IP取られてるのになぁ・・
ネタスレを記事にするためとりあえず富山のほうに通報したんだな産経は。
ひろとしハゲワロタ
一定期間のログ取得は当時のガイドラインにも明記されており
その期間はセキュリティーの問題上公開されておりませんでした。
今でもそうですが。
その情報をもっているのはISPしか存在しない。
よって答えは一つしか無い。
最近連投規制厳しすぎてスレ立てもまともにできない(;´д`)
5秒ほど待てって…
そんなことしてたらテンプレに割り込みがイパーイ入っちゃう(´Д⊂グスン
(^^)
そうだね。
(^^)
505 :
デフォルトの名無しさん:03/01/17 01:08
フォートラン77でプログラムが長すぎて動かせないっていうのはあるんですか?
コンパイルでエラーは無いんですが,
動かすと途中の何も問題ない箇所で勝手にエラーが出て止まってしまうんですが…
素人な質問ですいませんけど…
506 :
デフォルトの名無しさん:03/01/17 01:21
>>505 「エラーが出て止まってしまうんですが」とだけいわれても答えようがない。
どんなプログラムなのかとかエラーメッセージの内容、使った処理系など
が解らないと…。
長いってどのくらい?
508 :
デフォルトの名無しさん:03/01/17 01:36
>>506 使った処理系やどんなプログラムというとどういう風に答えれば…
エラーメッセージは
run-time error M6201: MATH
- sqrt:DOMAIN error
・
・ ここらへんはファイル名がとかが表示されてます
・
Incrementally linked image--PC correlation disable
となってます.
ネットで検索してみても,このエラーの意味もよく分からない素人なんで…
たぶん,私の説明内容だと全然分からないかと思いますが…
スイマセンです.
509 :
デフォルトの名無しさん:03/01/17 01:49
>>508 ちゃんとエラーメッセージに原因が書いてあるじゃないの…。
SQRT関数の引数が 0より小さくなってる箇所があって、
実行時エラーで止まってる。
もう一度プログラムを見直した方がいいよ。
510 :
デフォルトの名無しさん:03/01/17 01:56
>>509 ありがとうございます.
そういう意味だったんですか…
COMPAQのFOTRANのページや本を見ながら何のエラーか調べてたんですが,
よく分からなくて…
プログラム見直してみます.
511 :
デフォルトの名無しさん:03/01/17 02:06
>>510 エラーナンバー出てるから,もし電子媒体のマニュアルあるのならば
M6201で検索すればいい.
512 :
デフォルトの名無しさん:03/01/17 02:43
引き算とかで0になって欲しいところが
数値誤差で微妙に負になってるってことがあるね。
あれからSQRT関数のところからたどって行って,
プログラムと格闘した結果,なんとかミスを探し出して,動かすことができました.
いろいろお世話になりました.
>>513 ええ,知ってました.
それと本を見ながらやってたんですが,M6201のエラーが書いてなくて…
もっとFORTRAN勉強せねば・・・
FORTRANは初心者多そうだ(僕も含めて)。
ランタイムエラーでは、引数範囲、ゼロ割、
仮引数の配列サイズ>実引数の配列サイズが主なものかな。
parameter文で記号定数を宣言することのメリットって、
メインプログラムの配列宣言で、配列のサイズに記号定数を使用できること以外に
なにかあるんですか?
イマイチピンとこない。
517 :
デフォルトの名無しさん:03/01/19 11:53
c#とfortranでソフトの開発をしたいのですが、VisualStudio.NETでfortranの開発をするにはどういう設定をしたらいいでしょうか?
518 :
デフォルトの名無しさん:03/01/19 12:17
>>517 本当知らん
ふぉんとしらん
フォートラン
519 :
デフォルトの名無しさん:03/01/19 14:40
>>516 ・物理定数や換算係数などの文字通り「定数」として使う。
S=3.1415926536D0 * D**2 / 4.0D0 → S=PI * D**2 / 4.0D0
・プログラムを書いた本人しか解らない(本人でさえ時間がたつと忘れてしまう)
「魔法の数字」をなくすために使う。
SIZE = 80 * 25 → SIZE = SCRN_WIDTH * SCRN_HEIGHT
>>517 コンパックに頼み込む。(今はHPか)
520 :
デフォルトの名無しさん:03/01/19 15:40
>>516 パラメータの設定を別個のファイルに置いといて、
Include で各関数で読み込むが吉。
521 :
デフォルトの名無しさん:03/01/23 15:45
CをFORTLANに書き換えるソフトってありまつか?
522 :
デフォルトの名無しさん:03/01/23 15:47
↑ FORTRAN の間違い(;´Д`)
フォーミュラートランスレーション
524 :
デフォルトの名無しさん:03/01/23 18:33
525 :
デフォルトの名無しさん:03/01/23 18:57
FORTRAN77の大学の課題です。
Z(x)=Σ[1,∞]1/n^xと定義する。nについての無限和をもっともらしい
上限(理由を議論する)を決めて有限和とすることにより、2≦x≦4
の範囲でZ(x)のグラフを書きなさい。またこのとき数値的に
∫[2,4]1/Z(x)dxをの値を求めよ。
できたところ。以下
real n,x,s,i
write(*,*) 'n=?'
read(*,*) n
write(*,*) 'x=?'
read(*,*) x
s = 0
do 100 i = 1,n,1
s = s + 1/i**x
100 continue
write(*,*) 'ans=',s
stop
end
>>525 FORTRAN77、懐かしいねぇ。ACOS77
おっ?手応えのありそうな問題♪
(^^)
n や i をREALにするのはいかがなものか。
532 :
デフォルトの名無しさん:03/01/23 22:58
暗黙の型宣言じゃないとやです。
533 :
デフォルトの名無しさん:03/01/29 02:31
倉庫行き危機回避age
モジュール副プログラム
形状引き継ぎ配列を引数にもつ副プログラム
をCやFortran77から呼ぶことはできるのでしょうか?
Fujitsu Fortranを使っていますが、このことには触れられて
いないので教えてください
535 :
デフォルトの名無しさん:03/01/31 22:35
>525
計算機固有の問題である桁落ちを考慮して、
逆数の足し算をした方が良いように思われ
536 :
デフォルトの名無しさん:03/02/02 18:56
以前Unixのf77で実行していたプログラムをPCのFujituFortranで実行すると
line 573 an endfile record was detected in a READ statement...というエラーが出て動きません。
読み込みファイルのエラーのようなんですが、全くの素人なものでどうすれば動くか教えてください。
537 :
デフォルトの名無しさん:03/02/02 18:57
538 :
デフォルトの名無しさん:03/02/03 01:49
ファイルからデータを読み込んで変数に格納しようとしたが、もうファイル
の最後で読み込みができないということ。
(例)
HOGE.TXT
--------
10
20
30
PIYO.F
------
INTEGER I,CNT
OPEN(99,FILE='HOGE.TXT')
DO CNT=1,4
READ(99,*) I
END DO
などと書くと、ファイルには3整数しか書いてないのに、4回読み込んでいる
ので、このエラーが起こる。
すでに、動いていたプログラムのようなので、
1。適切な入力ファイルであるか?
2。UNIXとDOSの改行コードの違いのために、そのままファイルを持ってくると
一行と解釈してくれないかもしれない(DOSのFORTRANを使った経験がないので
確かではないですが。)
を確かめてみるとよろしいのではないでしょうか?
>>538 fujitsuFortranてlinuxじゃなかったっけ?使ったことも見たこともないんですが。
まさかvppFortranじゃないよね、PCって書いてあるし…
>>587の人は情報が少なすぎますよ。せめてREAD文周りをさらしてみるとかしないと。
まあ、読ませるファイルがぶっ壊れてる/間違ってる可能性が高いと思われますが。
>>538,539
WindowsのfujitsuFortranですが
改行コードの変え方がわからずどうしようもないので
fortranをはじめからすこし学習することにしました。
ありがとうございました。
541 :
デフォルトの名無しさん:03/02/06 00:44
読み込ませるファイルの改行コードを変えたら?
542 :
デフォルトの名無しさん:03/02/06 19:27
>>540 ブラウザで開いて、テキスト形式で保存するのが手っ取りばやい、
後は、どっちも読めるエディタを使うとか。
仮想メモリについておしえてくださいです!
今fortran90でプログラムしてるんですが、実装以上のメモリを使おうとするとかってにHDD上に仮想メモリとるんですか?
それともエラーになっちゃいますか?
今allocateでたくさん確保しようとしてるので;;;
どうかおねがいします。
>>543 OSが仮想メモリをサポートしていれば普通、仮想メモリを確保しに行くでしょう。
どこまで確保できるかはOSと処理系によると思いますが。
>>544 レスありがとうございます!!
OSかくのわすれてました;;;win2000でpentium4です。
やはり仮想メモリいきますよね;;;
もし仮想メモリにいってほしくなかったらwin2000の設定で仮想メモリ無しにするしかないのかな・・
546 :
デフォルトの名無しさん:03/02/07 11:03
コンパイルが通らんのじゃないのか?
コンパイラは何?
最近Fortran90/95使い始めたけどいいですね、これ。
行列の計算が簡単に書けるし、ちゃんと構造化できる(w
昔習ったFORTRAN77とはえらい違いだ。
でも90/95の普及率ってどんな感じなんだろう。
大学の研究室とかだと、未だにF77が現役なのかな?
548 :
デフォルトの名無しさん:03/02/08 14:13
>>547 フリーの Fortran90/95 のコンパイラってある?
これが無いからあんま普及しないってのはあるのではないかと
思ったり思わなかったり。気軽に試してみる事が出来ないって
のは結構痛い所だと思うんだけど・・・
550 :
デフォルトの名無しさん:03/02/08 18:24
すみません、質問させて下さい。
>>549 のFコンパイラを試してみたのですが、
ダウンロード・解凍して、binディレクトリにPATHを通したのですが
コンパイルしようとすると
Cannot create output file: No such file or directory
と出てコンパイルできません。
MinGW同梱版のほうも試してみたのですが、同じでした。
なにか他に設定がいるのでしょうか?
OSはWindows XP Homeです。
>>550 Linux では使えたんですが・・・
という事でcygwin版をインストールしてみました。
とりあえず、F.exeのあるパスの一個上に tmp というディレクトリを作ってみ
るとそのエラーは出なくなると思います。
# ただ、リンカエラーが出るなぁ、ウチだと・・・
とりあえずこれって c へのトランスレート& gcc でコンパイルをしてる
みたいですねぇ・・・
他に何かフリーのfortran90/95のコンパイラってないんでしょうか?
Mingw版も入れてみたんですが、コレ gcc とか込みなんですね。
どーりでデカいと思った・・・
で、Mingw版の方はpathの設定と tmp ディレクトリの相対位置さえ合ってれば
無事動きました。
ご参考になれば。
>>549 ご指摘の通りtmpディレクトリを作ってみたところ、使えるようになりました。
ありがとうございました。
早速、いくつか小さいプログラムをコンパイルしてみたのですが、
必ず変数宣言が必要だったり、.EQ. などの演算子が使えなかったり、
シングルクォートでくくった文字列が使えなかったりと
全てのFortran90/95のソースがそのままコンパイルできる訳ではないようですね。
とりあえず、自宅でFortran90/95がコンパイルできる環境が手に入ったので
しばらくこれで遊んでみます。
それにしても、スレタイからして、こんな息の長い良スレ(真面目なスレ)に
なるとは思わなかったな(藁
>>554 Simple is best. ってことだな。
フリーのg77をつかっているんですが、型宣言でDoubleとしてるんですが
繁栄されないんです。フリーだからこんなもんなんですか?
558 :
デフォルトの名無しさん:03/02/16 10:02
>>557 どういう状況なのか書かれていないので、一般的な回答しかできないが
1. 書式なしで結果を出力している。(WRITE(*,*) )
→書式を指定して、結果を確認してみる。
2. 単精度の定数を代入している。(a=3.1415926536)
→a=3.1415926536D0 等とする。
3. 実は倍精度変数を使用していない。(変数名の綴り間違い)
→変数名が正しいか確認する。
コンパイラを疑うより先に、まず自分自身を疑え。
559 :
デフォルトの名無しさん:03/02/16 10:20
>>558 > コンパイラを疑うより先に、まず自分自身を疑え。
いい言葉だねぇ。
ついでに、ユーザーには
プログラムのバグを疑うより先に、まず自分の入力データを疑え。
と言いたい。
横レスすまん。
Double?
Double Precision?
>>559 しかし、ユーザーからは、
ユーザーの誤入力を咎めるよりも、まずは誤入力を誘うような設計を何とかしれ。
と切り返される罠。
562 :
デフォルトの名無しさん:03/02/16 13:38
コンパイラー様は神様です。
>>558 implicit none
double precision x,y,amean,gmean
write(*,*) 'input x , y;'
read(*,*) x, y
amean = (x+y) / 2.0D+0
gmean = (x*y)**0.5D+0
write(*,*) 'Artihmetival mean =', amean
write(*,*) 'Geometric mean =', gmean
end
たとえばなんですが、このプログラムでx=4.1,y=6.5 と入力しても
出力が5.3と5.1623638となるんです。
うえのをwrite(*,'(d25.16)') で指定したらいけました。
ごめいわくおかけしました
565 :
デフォルトの名無しさん:03/02/16 22:31
このごろ g77とかf77とかコマンド打ってコンパイルしてるけど、ソース内には
implicit noneだとかdo-end doだとかdo while-end doだとか90の要素満載です。
完全にFORTRAN77で書けっていわれたら泣くだろうなあ。
566 :
デフォルトの名無しさん:03/02/16 23:41
>>561 賛成。
また、データの誤入力を誤入力と指摘できないプログラムは、
そのこと自体がバグだと思うんですね。
Fortranは、ユーザ=プログラマであることが多いので、
この辺りの設計がおざなりになりがちだと思う。で、他の
人間が使い出すと途端に問題が噴出したりして、結局「なんだよ
この使えねえプログラムはよぉ」ってことになるんだよなあ。
567 :
デフォルトの名無しさん:03/02/16 23:41
>>565 同意。77だけではきつい。
最近は制御文のみならず
IF (ASSOCIATED(TARGETOBJECT)) THEN
TEMP => TARGETOBJECT
てなソースを躊躇無く書いている自分に気づく。
どうせ自分しかソース触らないから、まぁいいか
568 :
デフォルトの名無しさん:03/02/17 00:12
>>561 ユーザのデータエラーのみならず、エラー処理あたりって、
意外にいいかげんだったりするんですよね。
統括的なエラー処理の手法(ログシステム、リターンコードの規約などなど)
がまず確立されていて、それから本体のコーディングに入れれば
まだ良いんだろうけど、実際には後付けの場合が多いから、
なんとなくいいかげんになりがち。
結局、ユーザーから文句が来て、デバッガレベルでエラーの原因
を探す羽目に。
「さっきの異常終了の件ですが、データが2カラムずれてます」
すんません。
g77の奴って4倍精度はないんでしょうか?
570 :
デフォルトの名無しさん:03/02/18 20:15
windowsでfortranってできますよね?
571 :
デフォルトの名無しさん:03/02/18 22:42
>>570 出来ます。
FORTRAN77で良ければ g77, Salford, Watcom など
フリーの物も配布されています。
>>569 手元のMinGW GCC 3.2.1 ではサポートされていませんでした。
573 :
デフォルトの名無しさん:03/02/20 10:33
>571さんありがちょ、Fortran90はフリーは無いですよね?
574 :
デフォルトの名無しさん:03/02/20 12:32
free non-commercial unsupported Intel(R) Fortran Compiler 7.0
FORTRANってCAE、流体、熱解析でつかえるんだ。
>574 >575のやつがそうでつか?
579 :
デフォルトの名無しさん:03/02/21 13:47
FILE *fp1;
int *fluid;
fscanf(fp1,"%*s %d",fluid);
上のをFORTRANで書きたいんだけどどうやるんス?
よろしくおながいします
STOP
END
581 :
デフォルトの名無しさん:03/02/23 20:20
IntelのFortran Compiler 7.0 for Linux入れました。Fortran90いい!
getargとかiargcとか使うのに -Vaxlibオプションつけんの面倒だけど
(設定の仕方?)、いい!90はいい。とりあえず型宣言は慣れたから次は
whereとかselsect caseだな(ただだから使えないとかないですよね?)。
77がだめだとは思わないけど、90に慣れたらおそらく離れられなくなりそう。
582 :
デフォルトの名無しさん:03/03/04 14:55
age
何故Fortranなんですか?
584 :
デフォルトの名無しさん:03/03/04 19:49
サブルーチンっていう響きがよいですね。
f2cで作成される*.cソースは、do_fio()等の関数のように、f2cライブラリに依存する内容になってしまいますが、
f2cライブラリをリンクせずに*.cに変換する簡単な方法Orソフトウェアはないのでしょうか?
手で書き直すしかないかと。
>>586 やっぱりそれしかないですか。。。ありがとうございます。
GOTOだらけの上、ノーコメントなソースの変換は鬱になります。。。
588 :
デフォルトの名無しさん:03/03/08 22:19
しかしなんで「おれフォートランできるんだよ」っていうおじさんのかくプログラムは
何のまえぶれもなく1234 continueとかでてくんの?ん、これってdoループの
終端文? それともgo toとのコンビでループさせてんの? それともどっかから
とんでくんのか? だとしたらどっかにdo 1234 i=1,nとかgo to 1234が...ない...
なのでFortranじゃなくてFORTRANができるヒトはいやだ。
589 :
デフォルトの名無しさん:03/03/08 22:35
黙れ青二才
590 :
デフォルトの名無しさん:03/03/08 22:45
その程度のソースも追えないのか?アタマ弱いんじゃねぇか?
>>588 まあ、そういう方々はたいていプログラムを作ることが本業ではなく
「正しい計算結果さえ出ればそれでよし」という考え方でやってますからね。
そういえば昔、学校の先生が
「プログラムはあまり長くなると見難くなるから、メインプログラムが
1000行位になったらサブルーチンを使うといいよ」
って教えてくれたっけ。
あの先生、まだ数値計算の授業教えてるのかなぁ…。
>>588 「本物のプログラマー」気取りだからさ。
>>588 きっと COME FROM文を使ってるんだよ。
>>588 自分も、昔の先輩が組んだソース見て、「なんでこんなに読みにくいプログラムの組み方してる
んでしょうね?」って聞いたら、「昔は、メモリの節約や実行速度の向上を頭に入れて作ってい
たからね」と言われました。
なんだか、いいくるめられたような、だまされたような気分です。
595 :
デフォルトの名無しさん:03/03/09 12:57
596 :
デフォルトの名無しさん:03/03/12 23:55
>>588 IF (A .EQ. B) GOTO 12234
A = C
IF (C .EQ. D) GOTO 4989
C = A
4989 CONTINUE
B = C + A
12234 CONTINUE
A = SUB(5)
みないなソースは日常ですが何か?
GOTOの行き先がGOTOなんて普通です.
あ〜〜〜読みにくいよ!教授!
597 :
デフォルトの名無しさん:03/03/13 04:00
4649 CONTINUE
598 :
デフォルトの名無しさん:03/03/19 19:24
windowsでFortranを使う必要性がでてきたんですけど
何かいいエディターないですか?
色がカラーじゃないと見にくいんです
599 :
デフォルトの名無しさん:03/03/19 22:52
>>598 秀丸でも使ったら?
変色用ファイルダウンロードして
>>599 あんな高いものを使えと言うのですか!?
601 :
デフォルトの名無しさん:03/03/19 23:11
>>600 そんなに高いかなぁ.学生?学生とかフリーじゃなかったっけ?
やなら,Windows用のemacsってあるだろ.あれ使ったら変色するんじゃね?
603 :
デフォルトの名無しさん:03/03/19 23:15
604 :
デフォルトの名無しさん:03/03/19 23:33
gvim もおっけーよん。
au! BufRead,BufNewFile *.f95 let b:fortran_do_enddo=1
au! BufRead,BufNewFile *.f90 let b:fortran_do_enddo=1
なんて設定しておけば f77 以外でも安心。
結構参考になりました
サンクス
607 :
デフォルトの名無しさん:03/04/08 22:44
Visual FortranのIDEのエディタで、コメントなど2バイト文字が
72-73カラム目にかかったとき、文字化けするのは
何とかならないだろうか?
608 :
デフォルトの名無しさん:03/04/09 14:28
Fortran かなつかしぃ。
プログラムカード売ってるお店なんてもうないだろうなぁ
609 :
デフォルトの名無しさん:03/04/09 23:06
「609、お前プログラム組むときは、やっぱりこれ使った方がいいぞ。ほれ。」
ボスはそう言って黄ばんだN○CのFORTRANコーディングシートを棚から引っ張り出し、
僕に渡してくれました。
一月ほど前のことです。
冗談かと思ったのですが、顔が大真面目でした。
610 :
デフォルトの名無しさん:03/04/10 03:51
Fortranの参考書でみたことあるな、穴の開いたカード
あれってどんな使い方するの?
プログラミングに影響するわけ?
>>610 昔のコンピュータはね、高くて巨大でしかも遅かったからみんな、
カードをもって順番に使ってたの。
そのための整理券なんだよ。
とりあえず、こんなんでいい?
俺が使ってたのは、マークシートみたいなやつだったけどな。
613 :
デフォルトの名無しさん:03/04/11 21:47
やーっふぉー、やっふぉ、ふぉーとらんらんらん♪
>>612 消しゴムで修正できると言う甘えがバグを作るんだ。
本物のプログラマは一発で正しいプログラムを書くから、穿孔パンチでいいんだ。
(^^)
616 :
デフォルトの名無しさん:03/04/18 07:12
age
会話がプログラマ板だ
プログラマ板にfortranスレないしな〜
FORTRANプログラマは今や絶滅危惧生物だから、どうすれば生き残れるかが
重大関心事で、レスがプログラマ板風になるのは仕方ないと思われ。
>>619 だったら、プログラマ板に立てればいいんじゃない ?
∧_∧
( ^^ )< ぬるぽ(^^)
∧_∧
( ^^ )< ぬるぽ(^^)
623 :
デフォルトの名無しさん:03/04/26 00:01
>>619 早く絶滅して欲しいと思ってますが、何か?
ホント早く絶滅して欲しい。
こんなクソ言語使わされる身にもなってくれ。
Fortranも使いこなせないとは。。。プッ。
時代は Haskell 98 だよ。
それ以外の言語は糞。
>>626 Fortran95を使うべし。
もしくはF言語。
B,C,D はあるけど、E はあるのー?
631 :
デフォルトの名無しさん:03/04/26 21:17
趣味なら自分の好きな言語を使えるだろうが、
業務だとね.......
せいぜい、密かにじわりとFORTRAN90/95へ移行とか
固定フォーマットで書けば、どうせだれにもわからん
632 :
デフォルトの名無しさん:03/04/28 02:53
Fortranで関数ポインタって使えるんですか?
どーも検索してもロクに引っかからなくって、引っかかるのは
意味不明な記述のみでして…
program test
implicit none ! implicit は諸悪の根源なので無効化
intrinsic dsin ! 組み込み関数は intrinsic 宣言
double precision bar ! 型チェックのため、一応戻り値の型を指定しておくのが良い
external bar ! 自分で定義した関数は external 宣言
call f(dsin) ! 普通に関数に渡す
call f(bar)
stop
end
! 自分で定義した関数
double precision function bar(a)
implicit none
double precision a
bar = dsin(a)
return
end
subroutine f(func)
implicit none
double precision func ! 普通に戻り値の型を指定しておいて、
double precision pi
parameter(pi = 3.141592653589793D+0)
write(*,*) func(pi) ! 普通に呼べばよい
return
end
! 関数でなくサブルーチンの時は戻り値の型の指定は不要
トーシロ質問スマソ 以下の認識あってる?
Fortranは構文が単純ゆえ、自動ベクトル化コンパイラが作りやすい
→数値計算用途では最速プログラムを作りやすい(かけた 人×時間 比較)
→市販のバカ高シミュレータは殆どFortran
→よって、Fortran嫌いなプログラマは多いけど滅びない
>>634 間違ってる。
Fortranner の洗脳を受けた危険な状態である。
これが真実。
昔はみんな Fortran を使っていた。
→ 研究者は時間がもったいないので他の言語を覚えない。
→ 新しく入ってくる学生はその人たちに Fortran を教えられる。
→ よって、Fortran 嫌いなプログラマは多いけど滅びない。
他の言語覚える気ないもん。みんな。
嫌んなるわ。ホンマ。
> Fortranは構文が単純ゆえ、自動ベクトル化コンパイラが作りやすい
C でもある。
> 数値計算用途では最速プログラムを作りやすい(かけた 人×時間 比較)
C で十分。
Fortran は C よりデバッグが面倒だし、
バグの起こりにくいプログラムを作りにくい。
> 市販のバカ高シミュレータは殆どFortran
ソフトが Fortran で書かれていようが、
自分で作るプログラムまで Fortran にする必要もない。
>>633 ありがとうございました!これで少しはFortranと仲良くなれそうです。
あくまで少しですが(w
>>636 あまり仲良くならないほうが(w
ただ、だからといって仕事だと仕方ないしねぇ...。
>>635 大意 了解。 要するに研究者がメンドクサガリなのねw
一部疑問に再質問スマソ。
>> Fortranは構文が単純ゆえ、自動ベクトル化コンパイラが作りやすい
>C でもある。
VectorCとかパソ用の結構最近のしか知らないんですが
スパコンとか数値計算用WS、最近だとクラスタ用とかでは、何処からでてます?
>> 市販のバカ高シミュレータは殆どFortran
>ソフトが Fortran で書かれていようが、
>自分で作るプログラムまで Fortran にする必要もない。
MARK とか STAR-CD 使ってて、モデルを細かくいじるときは、
Fortranでサブルーチン書かされてるけど、あれ、数値解析担当(ジジイ)が
C嫌ってるだけでCでも書ける?
>>638 >スパコンとか数値計算用WS、最近だとクラスタ用とかでは、何処からでてます?
使う機会が無いのであることしか知らない。
スマソ。
>C嫌ってるだけでCでも書ける?
コンパイラさえあればどんな環境でも書ける。
C から Fortran の関数を呼べるし、その逆も出来る。
関数とかの名前が変わることがあるけどね。
前か後ろかにアンダースコア '_' をつけないといけないことがある。
あと、Fortran は参照渡しなんで、
C から使う場合は全部ポインタで受けるべし。
ただ、複素数を使う場合だけは Fortran の方が便利かもね。
それも C++ を駆使すれば何とかなるかな。
>>639 >ただ、複素数を使う場合だけは Fortran の方が便利かもね。
ああ、それ忘れてた。 結構大きい。
>それも C++ を駆使すれば何とかなるかな。
「駆使」しなきゃなんないよね?
特にシミュレータのサブルーチン書きなんか、ジジイと戦うときに
結構大きなマイナスになりそう
#妥協点はFortran90? 、、、今はFortran77を強いられているが、、、(鬱
641 :
デフォルトの名無しさん:03/04/29 12:13
俺の大学では強制fortran90だ!
教授曰く「研究機関ではこれが主流」
642 :
bloom:03/04/29 12:26
>>638 > >> Fortranは構文が単純ゆえ、自動ベクトル化コンパイラが作りやすい
> >C でもある。
>
> VectorCとかパソ用の結構最近のしか知らないんですが
> スパコンとか数値計算用WS、最近だとクラスタ用とかでは、何処からでてます?
知ってる範囲のスパコン用ではFortranコンパイラとC++コンパイラは構文解析の
部分を除けば同一です。それで最適化オプションなんかは同じで、性能も機能も
ほとんど変わらんと思います。そう考えるとどちらのコンパイラも手がけてるところなら
問題ないのかも。
> 大意 了解。 要するに研究者がメンドクサガリなのねw
まあそうなんですけど、大規模計算に限ればHPFのおかげでFortranのほうが生産性は
高いと思います。
>>641 Fortran95で廃止された文法など古い文法を使うと最適化がかかりにくいコンパイラが
最近はあるらしいのでいいんでは?
あ、そういうことではないか。
>>640 最近では complex クラスがサポートされてることが多いので、
そうであれば complex クラスで受ければ何も問題ないです。
C++ ならポインタで受けずとも参照で受ければいいので、
C より使いやすいです。
extern "C" つけないといけませんが、そんなことは瑣末なことです。
ただ、古いコンパイラだと complex がサポートされてないことがあるので、
面倒なのはその時ですね。
まぁ、その時は complex ヘッダを適当なところからパクってきて、
それを使えばいいでしょう。
テンプレート使って実装してあれば、ヘッダファイルだけあれば使ます。
ライセンス関係まずければ自分で実装しないといけませんが、
どうせ実装法を変えようが無いので
適当にプログラミングの癖を変えておけばいいでしょう。
C**** a.F
program test
call cfunc((1D0, 2D0))
stop
end
// b.cpp
#include <iostream>
#include <complex>
using namespace std;
// Fortran での識別子の内部名は C とは違うことがある
#define FC(name) name##_
extern "C" // ここで宣言する関数名は C の命名規約で扱うことの宣言
{
// 本当はちょっと危険な香りのするコードなんですが、
// complex が仮想関数を持ってたり、
// real と imag の定義順が逆だったりという変な実装でなければ
// 大抵大丈夫です。
void FC(cfunc)(complex<double>& comp)
{
cout << comp << endl;
}
}
# コンパイル・リンク・実行
g77 -c a.F
g++ -c b.cpp
g77 a.o b.o -lstdc++
./a
(1,2)
646 :
デフォルトの名無しさん:03/05/03 02:13
Fortranは最速と聞いたけどほんとかな?
たしかに90が出てから並列化がカスタマイズできるよになったけど
他言語はそうはいかないのか?
647 :
デフォルトの名無しさん:03/05/09 22:44
648 :
デフォルトの名無しさん:03/05/10 05:15
>>646 >>634-644あたりの話題が参考になるかと。
>>647 SalfordのFTN77 Personal EditionならWin 2k/XPで使ってます。
どの様な問題でコンパイルできないのかわからないけど、
もう一度、設定等を見直してみては?
Salfordつかったことないから知らんけど
2000、XP上でユーザー名に日本語使ってると
海外産ソフトでトラブリがちかと
650 :
デフォルトの名無しさん:03/05/10 16:35
>>649 なるほど。。。
思いっきりユーザー名日本語だわ。
英語にして試してみます。
サンクス
651 :
デフォルトの名無しさん:03/05/10 16:52
ところで頻繁に出てきてる
77だとか90ってのはどう違うの?
途中に.EQ.が使えないなんてレスが
あったような気がするけど、じゃイコールは
どうすりゃいいの?
.EQ.が使えないのはFじゃネーノ?
653 :
デフォルトの名無しさん:03/05/10 20:18
.LT. <
.LE. <=
.EQ. ==
.NE. /=
.GT. >
.GE. >=
654 :
デフォルトの名無しさん:03/05/10 20:47
657 :
デフォルトの名無しさん:03/05/11 22:09
フォートランって再帰使えんのかよ!?
関数がどうも馴染めん
っつーか再帰使えんならハノイとかどうやって書くんだ?
>657
別に、自分でスタック管理すればハノイの塔くらいはできるだろ。むかしのBasicでもできたし。
660 :
デフォルトの名無しさん:03/05/12 08:48
最近僕はエロいことに興味がなくなってきました。どうしたらいいのでしょう?
661 :
動画直リン:03/05/12 09:13
>>657 Fortran90 だと使えるみたいね。
F言語のexampleより
module hanoi_module
public :: hanoi
contains
recursive subroutine hanoi (number_of_disks, starting_post, goal_post)
integer, intent (in) :: number_of_disks, starting_post, goal_post
integer :: free_post
integer, parameter :: all_posts = 6
if (number_of_disks > 0) then
free_post = all_posts - starting_post - goal_post
call hanoi(number_of_disks - 1, starting_post, free_post)
print *, "Move disk", number_of_disks, &
"from post", starting_post, "to post", goal_post
call hanoi(number_of_disks - 1, free_post, goal_post)
end if
end subroutine hanoi
end module hanoi_module
program test_hanoi
use hanoi_module
integer :: number_of_disks
number_of_disks = 4
call hanoi(number_of_disks, 1, 3)
end program test_hanoi
664 :
デフォルトの名無しさん:03/05/13 02:48
今から20年ほど前に作られたFortranソースコード見たら全部大文字だった・・・・・
読みにくい。秀丸でto lower case 使ってソースを小文字にしても、
このスレのリンクにあったf90コンパイラで動くんだろか。
Javaにリプレースをたくらんでいるのでf2jで全部Javaに変換した方が早いかな?
665 :
デフォルトの名無しさん:03/05/13 20:37
オプションで指定しない限り大文字と小文字の区別は無い.
大文字の中の人も大変だな。
667 :
デフォルトの名無しさん:03/05/17 11:39
: Error: A specification expression object must be a dumm
y argument, a COMMON block object, or an object accessible through host or use a
ssociation [N]
integer::I,N,xG
-----------------^
: Error: An automatic object is invalid in a main program
. [C]
real,dimension(N)::c
-------------------------^
誰かこのエラーの意味をおしえてくれませんか?
669 :
デフォルトの名無しさん:03/05/18 00:33
厨な質問でスマソ。
IF文使った場合には絶対にELSEが必要なのでつか??
>>669 FORTRAN に限らず、IF に対して絶対に ELSE が必要な言語って見たことない。
>>670 ありがとうございますm(__)m
Visual FORTRANでビルドしてもうまく実行しなかったのは書き方悪かったせいか。。
逝ってきます。。
672 :
デフォルトの名無しさん:03/05/18 01:29
数年ぶりにFORTRANを使ったけど、すっかり忘れてしまってた。
FORTRAN95の文法にはびっくーり。時代は進んでしまったのね。
まぁ、用途別に言語使い分けるのが一番だろうね…
オイラも、研究室でのシミュレーション解析にはFortran90
個人的に使う小道具にはC++使ってるし…
時々、構文がごっちゃになって、エラー探す時に困ったりもするが(w
平気でC++のプログラム書いてる途中に、integerとか.and.とか書いてて、
コンパイル時にエラーって起こられ、なぜだ〜って一瞬本気で思った
時は、マジでこりゃあかんって思った(w
674 :
デフォルトの名無しさん:03/05/27 23:57
これからFORTRANを学ぼうという者です。
コンパイラはVisual FORTRANを使います。
本屋に行くとFORTRAN77と90がありますが、どの程度違うものなのでしょうか?
過去の先輩の遺産を引き継ぐことになっているのですが
77と90はどっちを勉強した方がいいのでしょうか?
675 :
デフォルトの名無しさん:03/05/28 00:31
>>674 Fortran90 … 数値計算向けの普通の言語
FORTRAN77 … オブジェクト指向どころか構造化プログラミングも無用の匠の世界
過去の遺産を受け継ぐのならたぶんFORTRAN77だろうから
とりあえず
可能ならば少しずつF90化していきましょう。
幸運にも先輩がFortran90を使って書いていたら
F O R T R A N 7 7 の こ と は 忘 れ な さ い
#途中で書き込んじゃった…
×とりあえず
○とりあえずFORTRAN77を覚えてから
大は小を兼ねる。
というわけで、
C++ から Fortran の関数/サブルーチンを使えばいい。
もちろんその逆も。
なんちゃって。半分本気だけど。俺はそうしてるし。
それはともかく、正直構造体がないのは辛いんで、
Fortran90(または95)覚えた方がいい。
Fortran90 を覚えとけば
FORTRAN77 も読めるんで損はないっしょ。
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
679 :
デフォルトの名無しさん:03/05/29 01:20
緊急age
680 :
デフォルトの名無しさん:03/05/30 12:35
681 :
デフォルトの名無しさん:03/05/30 18:09
>>680 Fortram95から主にFORTRAN77との互換性のために残られている
機能を取り除いたものがF言語。
よってFORTRAN77のソースはそのままでは動かない。
F(Fortran90/95)用に書き直すと以下のようになる。
! Example
!
program example
implicit none
integer :: i, x
do i=1,10
x = 1.0 / real(i)
if (x < 0.5) then
exit
end if
end do
print *, "This program is an example. This program&
& is an example"
end program example
683 :
デフォルトの名無しさん:03/05/31 12:05
d=1.0*cos(cta)+2.0*sin(cta)の計算(倍精度)を1億回繰り返すと
VC++6.0 professional の math.h の sin, cos では25秒
Visual FORTRAN 6.6Bの組込関数 DSIN,DCOSでは16秒
とFORTRANの方が少し速い。
両方ともPentium内部のコプロセッサ使ってると思うけど
どうして差がでるの?
最後の手として、VC++側からFORTRANのDCOS, DSINを無駄なく呼び
出す方法ってありませんか?(そこまでやるか!と我ながら思うけど)
VC++側で
extern "C" {
double& _stdcall DSIN(double& x);
double& _stdcall DCOS(double& x);
}
としただけではリンカエラー
error LNK2001: unresolved external symbol _DSIN@4
error LNK2001: unresolved external symbol _DCOS@4
が出てしまいます.
F90でunterminated block exists って言われてしまいます
どうやったらいいのですか?誰か教えて下さい。
686 :
デフォルトの名無しさん:03/05/31 14:11
>>685 DSIN、DCOSなど数学組込関数がVisual FORTRANのどのライブラリに入って
いるかがわからんのです。
Visual Studio上ではVC++とVisual FORTRANのソースコードを共存させて
コンパイルできますが、DCOSやDSINを呼び出してその値を返す関数副プロ
グラムを記述すると計算時間が30秒と元の木阿弥に。。。
687 :
デフォルトの名無しさん:03/05/31 15:58
あーっ!! 1億回じゃなくて10億回でした。失礼しました。
10億回でこの程度の差ならまァいいか。。。
手元のVisual Fortranで d=1.0*cos(cta)+2.0*sin(cta) の計算式を
/asmfile で出力させたらライブラリ呼ばずにインライン展開してた。
おまけに角度が同じなので FSINCOS命令を使ってsin/cosの値を
同時に計算してる。
数II とかやったことないの ?
1.0 * sin(x) + 2.0 * cos(x) = sqrt(1.0 * 1.0 + 2.0 * 2.0) * sin(x + atan(2.0 / 1.0))
sqrt() と atan() は、定数になるから、sin() の計算と四則演算だけでできるよ。
どなたか私の質問にもお答えを。。。
初めまして。この春から学校で少しだけフォートラン90を習い始めたのですが,急に課題が難しくなって困っています。
どなたか助けてください。
課題は以下
i,j,kを1以上の整数とする。N=i**2+j**2+k**2としたとき,同じNの値を与える(i,j,k)の組み合わせが何通りあるのかを、
1から100までNについてディスプレイに表示するとともに,ファイルに出力するプログラムを作成せよ。
以上ですが
ヒントによるとdoを4回使うらしいのでうすが…いまいちよく分かりません。
どなたか教えてくださいm(__)m
このような質問が駄目でしたらすいません,m(__)m
692 :
デフォルトの名無しさん:03/05/31 20:44
<<688
d=1.0*cos(cta)+2.0*sin(cta)の計算式をloopするだけではFORTRANが計算を
さぼってしまうので正確には別の計算式も含まれているんですが、、、略。
FORTRANで直接インライン展開となると、VC++側から呼び出しても効果
ないかもしれませんね。あとはIntel C++お試し版で。。。
ありがとうございました。
<<689
三角関数の合成公式ですか。なるほど。
<<690
FORTRAN90コンパイラの種類と、エラー発生と直接関係した部分に絞りこんだ
ソースコードを提示しないとレスはつかないような。
693 :
デフォルトの名無しさん:03/05/31 20:48
書き込んでも掲示板に表示されないので再度。かぶってたらごめんなさい。
<<688
d=1.0*cos(cta)+2.0*sin(cta)の計算式をloopするだけではFORTRANが計算を
さぼってしまうので正確には別の計算式も含まれているんですが、、、略。
FORTRANで直接インライン展開となると、VC++側から呼び出しても効果
ないかもしれませんね。あとはIntel C++お試し版で。。。
ありがとうございました。
<<689
三角関数の合成公式ですか。なるほど。
<<690
FORTRAN90コンパイラの種類と、エラー発生に直接関係した部分を絞りこんだ
ソースコードを提示しないとレスはつかないような。
>>693 うむむ、携帯からなんでできるだけ頑張ります
if 〜
^
ここでアンターミネイティッドブロックイグズィストって表示されるんです
そのエラーがでた行を全部消して書き直しても同じエラーが出るんです
695 :
デフォルトの名無しさん:03/05/31 21:54
696 :
デフォルトの名無しさん:03/05/31 22:02
>>694 それでも分かり難いんだが・・・。
IF〜END IFの対応が崩れているんじゃないかな?
697 :
デフォルトの名無しさん:03/06/01 00:38
>>694 696氏が答えているように、
IF 〜 ENDIF
DO 〜 ENDDO
SELECT CASE 〜END SELECT
などのブロック構造となる構文で、
開始と終了の数が一致していないか、
あるいは、ちゃんと入れ子になっていないと考えられる。
こういう場合、エラーメッセージで示される行番号 は
あまり意味が無い。 IF〜の行で表示されるのであれば、
せいぜい、それより手前のIFブロックを
重点的に調べたほうがいい、くらいの意味しかないと
思われ。
>>696>>697 なるほど
以外と簡単なミスかもしれないんですね
ありがとうございました
もいちど確かめてみます
699 :
デフォルトの名無しさん:03/06/02 20:15
ネットでVisual Fortranを勉強するのによいサイトはないでしょうか?
C言語の時は本より「猫でもわかるプログラミング」が理解しやすかったので
似たようなのを期待してしまいます。
700 :
デフォルトの名無しさん:03/06/03 08:48
7 0 0!
>>699 探したけどないね。
リファレンスとか大学あたりのちょっとしたページばかり。
まあ、メジャーなCと比べるのは酷だね。
>>683 FORTRAN と C の速度の違いは
アルゴリズムの微妙な違いか、
さもなくば最適化の違いから、
くるものだと思うよ。
702 :
デフォルトの名無しさん:03/06/08 12:04
FORTRAN は,アセンブリより移植性が高くて書き易いが遅い.
C よりは移植性が低くて書き辛いが速い.
ってことでよろしいか?
移植性は,低いですよね.
「77 準拠!」って謳ったプログラムよりも,
「自分の処理系でなら (はぁと」なプログラムが多いみたいだし.
# 現に,今コンパイルが通らず苦戦中...
あっ,でも,,,
計算に特化した計算機で使うとなれば,
アセンブリじゃ事実上書けないものも出てくるのかな?
それなら,FORTRAN が最も早く書けて速く動くってことになりますね.
配布には向かないようだが...
# 「この(有料)コンパイラでは出来ました.」<--- ゴルァ
>>702-703 一体何が言いたいんだ ?
独り言なら、よそでやってくれ。
> アセンブリじゃ事実上書けないものも出てくるのかな?
なんて書いてるから、電波系の奴か...。
そもそもは、
FORTRAN → 科学計算用
C → UNIX システムプログラミング用
ってだけだろう。
>>702 移植性の高さを測るのにアセンブリ言語を使うなよ!(笑
FORTRAN77 よりは C の方が書きやすいと思うし(構造体があるから)、
FORTRAN は一般的に言って速い部類に入ると思う。
アセンブリ言語は確かに一番速くなる可能性はあるが、
SIMD を使うのでない限り
深い知識のない人が最適化するよりも
コンパイラのする最適化の方が速かったりすることもある。
もしくは、大して変わらなかったり。
移植性が低いプログラムは、ビット演算とかコマンドラインとか使ってるのかな。
これは FORTRAN77 の仕様が少ないのが悪い! と言っておこう。
ソフトウエアネタでなくて悪いのですが、ちょっと質問。
Fortran計算で現在最速のPC組むとしたらCPU何が良いでしょうかね。
後輩がPen4-3.0GHzでも1ケース半日かかるから何とかしてとなきついてきました。
Athlon XP 3200+が早いのか、Xeon3.06をデュアルにしたほうが早いのか・・・
なお、コンパイラはintel FortranかVisual Fortranを使う予定らしいですが、プログラム自体は過去の遺産の手直しで大幅な変更は期間的に出来ないみたいですね。
ちなみに、私はハード購入担当でプログラムはあんまり詳しくないですので、プログラムの中身については聞かないでくださいな。
708 :
デフォルトの名無しさん:03/06/12 03:31
1ケースってなに?
709 :
デフォルトの名無しさん:03/06/12 07:57
同じプロセッサーならクロック数が大きい方が速いよ.
>>703-704 10年前の古代知識で恐縮だが、
いわゆるRISC系プロセッサのレジスタ・リネーミング(ウィンドウ)やら、
遅延分岐コードやら、パイプラインの管理やら、
アセンブラーで書くのがしんどいテーマは、
現在のIntel X86系プロセッサでも存在すると思う。
むしろ、FORTRANをコード・ジェネレータにして、
一部コードをインライン・アセンブラに置き換える、ってのが
10年前のメモリ非共有並列機のプログラミングで一般的だったみたい、な。
並列化に期待してデュアルかな
問題にによるが
713 :
デフォルトの名無しさん:03/06/13 16:29
がんばってクラスタ買え。
並列化コンパイラと一緒に、か?
並列化効率良くないと意味ない罠がありそうだけど。
しぬきでへいれつかりつをあげろ
おれはしにそうだ
FORTRAN75のプログラム例に、
C
6001 CONTINUE
EZ(JEL)=(1.0-2.0*POIS)/YM*(SIGMAX(JEL)+SIGMAY(JEL))
1 -(EPSX+EPSY)
とあるのですが、4行目の「1」の意味がわかりません。
行番号と本文の間のスペースに「1」がかかれています。
似たようなもので行番号と本文の間に「C」が書かれているのもあるのですが、同じ意味なのでしょうか?
この「1」や「C」にはどのような意味があるかわからないでしょうか?
ご存知の方いらっしゃればよろしくお願いします。
717 :
デフォルトの名無しさん:03/06/15 20:02
C
6001 CONTINUE
EZ(JEL)=(1.0-2.0*POIS)/YM*(SIGMAX(JEL)+SIGMAY(JEL))
1 -(EPSX+EPSY)
なぜか書き込むときスペースがきえてしまっていたのでもう一度
C
6001 CONTINUE
EZ(JEL)=(1.0-2.0*POIS)/YM*(SIGMAX(JEL)+SIGMAY(JEL))
1 -(EPSX+EPSY)
です。何度もすみません。
719 :
デフォルトの名無しさん:03/06/15 20:14
>>719 なるほど!とても基本的なことを知らなかったわけですね・・・お恥ずかしい。
的確なアドバイス感謝です!ありがとうございました。
(・∀・)
722 :
デフォルトの名無しさん:03/06/15 22:59
これから FORTRAN 77 をやるのにイイ本を教えてください.
C で言う K&R のようなのがいいです.
ある程度プログラミング言語を分かっている人向けで,
仕様に含まれているか,そうでないかの詳しいところもあるといいです.
図書館に言ってみたところ, 77 の本は乱立していて,選ぶのが難しい状態でした.
完全な初心者でも無いのでなおさらです (要は,中途半端).
C が使えるなら適当な本でも十分分かるような気も。
724 :
デフォルトの名無しさん:03/06/16 00:05
>>722 今更77? 90か95にしたら?
それとも何か理由があるん?
725 :
デフォルトの名無しさん:03/06/16 00:07
無料の90対応のコンパイラがない(´Д`;)
726 :
デフォルトの名無しさん:03/06/16 00:29
>>725 Linuxが使えるならIntel Fortran Compiler for Linuxがある。
Winは
>>549 のFくらいかな。
g95 は完成までまだもうちょっとかかりそうだし。
>>724 >>725さんが代弁してくれました.
Intel のはフリーじゃないっぽい...
というわけで,まだまだ 77 のお世話になってしまいます.
g95 に期待です.
下手に他の言語をやっているので,
初めて読むなら定番の良書だろう,と思っているのもあります.
よほどでなければ,日本語の本がいいです.
しっかりした解説となると, web では寂しいですね.
728 :
デフォルトの名無しさん:03/06/16 05:48
>>727 Windows版は・・・だろ?Linux版ならC++コンパイラとともにFortranコンパイラの非商用版があったはず。
729 :
デフォルトの名無しさん:03/06/16 05:50
730 :
デフォルトの名無しさん:03/06/16 05:53
なんでこんな時間にかぶるかな。。
734 :
デフォルトの名無しさん:03/06/16 19:47
>>727 適当な本で適当に文法を理解しておけば、
あとは別言語からの勘と試行錯誤で何とかなる。
>>735 処理系依存のものは,知らないで使うのと知っていて使うのでは
大きく違うと思うのです.
計算しか行なわないとなれば,処理系依存は少なさそうですが,
上のレスに「77 の仕様が少ない」とか記述がありますので,
やはり便利な構文があったり無かったりするのでしょう (か?).
仕様のみではどのように辛いか等を知りたいのもあります.
とはいえ,まずは図書館に潜って古き良き本を漁ってみます.
# intel へのポインタを示してくださった方,ありがとうございます.
# 時間の関係で,すぐに取りかかれません...(⊃д`)
>>736 上でも言ったけど、ビット演算とコマンドラインが処理系依存筆頭かと。
ビット演算の使用例としては、擬似乱数の MT 法とか。
人によっては end do 禁止! とまで言う人もいるからなぁ。
end do を禁止されると辛いね。
end do 使えないコンパイラを使ったことがないけど、
未だにそんなコンパイラ使ってるところあるのかな?
あとは implicit none はどうだっけ?
あと、include ってどうなんだろ。
教えて詳しい人。
end do使えないコンパイラなんてあるのか、そりゃつらいな…
>あとは implicit none はどうだっけ?
implicit noneはプログラムやサブルーチン内で、宣言した変数以外は
使っちゃダメっていう制限を付加するもの。これが無いと、変数宣言無
くても、暗黙の型宣言により、自動で変数をinteger型、またはreal型と
して扱う。
1つ注意しなければならないのは、containでプログラム内や、モジュール
内に含めたサブルーチンでは、implicit noneを入れても、一つ上の
フォーカス?での変数を、宣言無しで使えるんだよな…。
詳しい事は、ヘルプ読むなり、自分で簡単なプログラムを作って
チェックしてください。
>あと、include ってどうなんだろう。
includeはよくわからん(w
近々、ConpaqからIntelへ製品移管するから、いつまで落とせるかわからん。
欲しい人は、なるべく早めに落としておいた方がいいかも。
>>739 PDF は英語版しかないの?
しょぼーん。
742 :
デフォルトの名無しさん:03/06/19 00:43
743 :
デフォルトの名無しさん:03/06/19 00:47
>>742 そのページワラタ
エロサイトみたいなことするなよ(上の方を反転させてみれば分かる)
744 :
デフォルトの名無しさん:03/06/19 01:03
Ctrl + A を押すともっとすごいことに・・・
ところでIntel Visual Fortran 8.0 (?) は単独でIDEが使えるのでしょうか?
Intel Fortran と VC++ .Net 2003 Std 買おうと思ってたんだけど、
10月まで待った方がいいのかな?
745 :
なんでだろう?:03/06/23 11:11
プログラムのバグ?コンパイラのバグ?(1)
初めてここにお邪魔します。
某社の作成プログラムをCompaq Visual Fortran用にコンバージョンしたときのトラブルを書きます。
Fortran77の環境下であることを、予めお断りしておきます。また、変数名も、コードを特定されるのを
避ける為に変えています。
また、プログラムは、SunのEWS下で動いていました。
dimension a(ndt) , b(ndt)
・
sum = 0.0
do n = 1 , nmx
sum = sum + a(n)*b(n)
end do
上のルーチンを通る前に、a, bの変数を計算する事前処理を行うのですが、入力により、事前処理を
行わずに上のルーチンを通ることがあります。その場合、sumにNaNが入ってしまうことがあります。
これはプログラムの問題でしょうか?それとも、コンパイラの問題でしょうか?
また、これを回避する為のコンパイルオプションがあるでしょうか?
746 :
なんでだろう?:03/06/23 11:12
プログラムのバグ?コンパイラのバグ?(2)
続いて、もう一つ・・・。
ファイルのI/Oですが、まず、あるプログラムで、次のように書き出したとします。
dimension numb(20) , idat(20,10)
・
write(nun) mxdt, ( num(i), i = 1 , mxdt ),
& ( ( idat(n,m), n = 1 , num(m+3) ), m = 1 , 3 )
上のステートメントで作ったファイルを別プログラムで次のように読み込みます。
dimension numb(20) , idat(20,10)
・
read(nun) mxdt, ( num(i), i = 1 , mxdt ),
& ( ( idat(n,m), n = 1 , num(m+3) ), m = 1 , 3 )
すると、変数idatには前プログラムで書き込んだ値と異なる値が出力されたのには驚きました。
どう、考えてもプログラム自体、おかしいところはないと思うのですが?
747 :
デフォルトの名無しさん:03/06/23 23:57
>>745 経験的には、プログラムの問題のほうが圧倒的に可能性が高いだろうね
もともと配列壊したりしてない?
ndt < nmx とか。
デバッグモードで実行してる?
>>745-746 うーん。そのコードだけじゃ、よくわからんね。
もちょっと、前から、変数の構造見ないとなんとも…。
でも、Fortran77環境下といってるのに、Fortran90以降の書式が
混在しているように思えるのは、私だけだろうか…
749 :
なんでだろう?:03/06/24 11:19
>>747-748 この現象に出くわしたのは、2、3年前のことですが、当時の資料を漁ってやっと思い出しました。
結論からいいますと、
>>745のケースについては、a,bをゼロに初期化しているのですが、これを
加算または累積計算していくとsumにNaNが入るのです。
おそらく、コンパイラのレジスタの割り当てか何かにバグがあるのでは?という結論になり、
DOループの中で、IF文を使用することで回避する情けない対策をとりました。
これって、コンパイラのバグではないかと思うのですが、こんな現象に出くわした経験者は
いないかと思い、投稿したのです。
>>747さんの質問のndt < nmxはありません。
また、デバッグモードでの実行は実行メモリが大きすぎて出来ませんでした。
>>748 プログラムは、F77で作成されています。従って、SUNのEWSでもF77環境下で動いていました。
>>746のケースは、私が直接タッチした訳でない(同僚が経験した)のですが、書き込み側の
プログラムを作ったのは私です。
この対策は、同僚が読み込みのフォーマットを少し変えることで切り抜けました。
具体的には、
write(nun) mxdt, ( num(i), i = 1 , mxdt ),
& ( ( idat(n,m), n = 1 , num(m+3) ), m = 1 , 3 )
↓
write(nun) mxdt, ( idum, i = 1 , 3 ),
& ( num(i), i = 1 , 3 ),( idum, i = 7 , mxdt ),
& ( ( idat(n,m), n = 1 , num(m) ), m = 1 , 3 )
これはやはり、コンパイラのバグですよね?
なお、Compaq Visual Fortranのバージョンは6です。
750 :
デフォルトの名無しさん:03/06/24 11:21
751 :
なんでだろう?:03/06/24 11:38
訂正します。
>>749の文の中のwriteはreadの間違いです。お詫びします。
752 :
デフォルトの名無しさん:03/06/24 20:55
753 :
デフォルトの名無しさん:03/06/24 23:03
いわゆるリトルとビックですよね。
だとすると最初の a(n)*b(n) も変な値が a,b に
セットされているかもしれませんね。
つまりある変数で a(n) もしくは b(n) に NaN
が入っていたりとかね。
もうちょっと print デバッグすれば解消しそうだ
754 :
なんでだろう?:03/06/25 13:50
>>752,
>>753 質問したプログラムは、ある某大手会社(誰もが知っている会社です)の研究所から頂いた
プログラムで、現在、ある研究所で動いているプログラムです。
NaNが入る例等は、他のプログラムでも体験しました。
ゴミプログラムでは再現できませんが、共通していることは、プログラム自体大きく、変数が
てんこ盛り、コモンが沢山ということでした。
>>753のprintデバッグのことですが、私も当然、これを行いました。
しかし、doループの中に入れると、NaNが入る現象が消えてノーマルに終了するので、
なかなか判らなかったのです。
これには、相当参りました。原因究明にどれだけの日時を要したことか・・・。
しかも、実行時間が相当かかるのでネ・・・。
>>752のおっしゃるようなバイナリデータの互換性がとれてないということはありえません。
とにかく、根本的理由が判らないまま、うやむやになっています。
755 :
デフォルトの名無しさん:03/06/25 19:05
chmod 755 test.sh
プログラムを自分で書き直したほうが、はやいんとちゃうか?
757 :
なんでだろう?:03/06/25 20:25
>>756 全部で3万ステップ以上あるプログラムを書き直せと・・・(絶句
758 :
デフォルトの名無しさん:03/06/25 21:03
>>757 たかだか3万ステップでしょ。
私は一人で70万ステップ以上のFEMコード&数値計算ライブラリの構築・維持・アップグレードの面倒みてますよ。
759 :
デフォルトの名無しさん:03/06/25 21:12
70万ステップの駄コードと比べられても・・・・
760 :
デフォルトの名無しさん:03/06/25 21:18
761 :
デフォルトの名無しさん:03/06/25 21:36
>>757 デバッガが使えないのなら、
メモリたくさん積んだ速いマシンで
デバッグオプションを最大限付けて
地道に調べるしか無いかな。
/fpe:3 /debug:full /check:all /math_library:check /traceback /link /incremental:no
762 :
デフォルトの名無しさん:03/06/25 22:57
>>754 >共通していることは、プログラム自体大きく、変数が
>てんこ盛り、コモンが沢山ということでした。
やはりメモリ壊してる可能性大、と
COMMONで変数書く順番が違ってたなんてオチだったりして。
1日2000ステップ書けば
1人でも2〜3週間あれば書き直せますな。
765 :
デフォルトの名無しさん:03/06/26 02:10
READ文で、FORMATを行で参照するときに、
READ (8, 100, END = 20) CODE(NUM), DATA(NUM)
ではなく、
I = 100
READ (8, I, END = 20) CODE(NUM), DATA(NUM)
とすることはできますか?
家にコンパイラがないので実際にすることができないんです
766 :
そんな低レベルな話よりも:03/06/26 02:19
767 :
デフォルトの名無しさん:03/06/26 06:19
768 :
なんでだろう?:03/06/26 11:32
>>758-759,
>>764 そんなこと言ったって、何本もありますよ。第一、客先の意向もあるし、会社が「無駄なことすんな」で
許可してくれないでしょう。
>>761 会社の都合もあるしね・・・(苦笑
769 :
デフォルトの名無しさん:03/06/26 11:35
こんなところで質問できるほど余裕があるんだな
770 :
デフォルトの名無しさん:03/06/26 17:23
>>759 そういうことはスキルをつけてから言いな!!
早くF77絶滅しないかなー。
使いまくりです。
基本的なことかもしれませんがお願いします。
Fortran77で1桁目に「'」と書くのはどう言う意味なんでしょうか?
プログラムには
---------------------------------------------
・
・
・
200 CONTINUE
C
RETURN
END
'←ここです
C
C
SUBROUTINE TEST
COMMON/A/ A,B,C,D
-----------------------------------------------
のようになるのです。
追記
これをFortran90のソフトで書くと、
「'」以下のSUBROUTINEが青色に変わらず、無効になってしまいます。
つづりは間違っていないので、「'」なければ当然青色になります。
どなたかご助言ください。お願いいたします。
775 :
デフォルトの名無しさん:03/06/27 13:12
SalfordのFTN77 Personal Edition
にて
CHARACTER F_NAME*20
WRITE(6,*) 'ファイル名を入力してください'
READ(5,*) F_NAME
OPEN(UNIT=1,FILE=F_NAME,STATUS='OLD')
って書くと
WARNING - PRINT * and READ * will be affected by this OPEN statement
って警告が出てまともにファイルから読み込めないんですが
どこかおかしいところありますか?
776 :
デフォルトの名無しさん:03/06/27 18:27
>>773-774 「Fortran90のソフト」とか「青色」とか言われても
超能力者でもない限り、状況がわからん。
おそらくF77の方は「1桁目が空白か数字以外ならその行はコメント」
な処理系なんだろう。
で、F90の方は「'」を文字列の始まりとして認識しているんだろう。
>>775 FTN77 User's Guide (p.102)
> by preconnection; the standard input and output are preconnected to
> units 1 and 2 respectively (units 5 and 6 are respective alternatives).
凡人に用はないです.ROMっててください.
778 :
デフォルトの名無しさん:03/06/27 22:55
二次関数で解の公式を用いて解を求めるまでの軌跡のプログラムでax^2+bx+cのa,b,cを係数とおくにはどうすればいいのですか。調べてみましたが分かりません。教えてください。お願いします。
宿題は自分でやりな、坊や。
common continue go to stop format
>754
print デバッグで消える、というのは嫌っすね。
common で、配列サイズの基底がぐちゃぐちゃ
なのは体験したことがありますが。。。
コンパイラオプション等でも関係しているのかな。
デバッグモードで見てみましょうかね。。。
>753
ああ、後変数初期化なしの挙動はコンパイラ毎に違う
違うんですかね?
常にゼロだとか思わない方がいい気がしますよ。
この場合はオプションで初期化ゼロ設定できたと思います。
ループ入る前に、 a,b 配列を全部出力させないと。。
しるかアホアホ
788 :
デフォルトの名無しさん:03/07/09 16:38
今日の名古屋大学の講義・・・
某教授が企業ではFortrun77が良く使われるっていってんですけど
本当ですか?
うそです
790 :
デフォルトの名無しさん:03/07/09 20:01
791 :
デフォルトの名無しさん:03/07/09 20:42
>>788 Fortran90ならよく使われている。
792 :
デフォルトの名無しさん:03/07/09 22:10
普通は C89 じゃね?
あとは分野によって C++, Java, VB, アセンブリ言語, SQL, Fortran90, ... が使われてる。
そして、新言語覚える気力のない人か
古いコードのメンテをさせられてる人か
Fortran90 使いたいけどコンパイラ買う金がない人が
FORTRAN77, COBOL を使っている。
>>776 遅レスながらありがとうございました。
手元にあるテキストはFORTRAN77のものなのですが、「'」の記載がなくて意味があるのか
コメントとして使っているのかがわからなかったのです。
ありがとうございました。
ソフト名はVisualFortran6でした。説明不足ですみません。
この点も勉強させていただきありがとうございました。
>>788 阪大の某教授も同じ事を言っておられました。
なんでも、企業のシステムにはまだまだFortranで書かれたものが多く、
それをCなどに書き換えるだけでも膨大なコストがかかる。
従って、未だに企業の資産?にはFortranで書かれたものが多いんだそうです。
そこで、Fortranを専門に知っておく必要はないが、文法ぐらいは一通り勉強しておいて損はない。
とのことです。
同じ原理でFortran77のものも結構あるんでしょうね。
僕は講義を受けてただけで、阪大生じゃないんでこれ以上なんともいえないんですけどねw
しかし、本屋にもテキストが置いてないし勉強しにくいです・・
今、他人の作ったvax fortranをVisual Fortranに移植する作業をしていますが
下記の様に文字化けしたソースが含まれていてコンパイル・エラーがでます。
これを作った当時、外部で作業をして来てpc98からRS232C経由でVAXに転送して
いましたので、恐らくその時点での文字化けだと思います。
この文字化けを元に戻す方法がないでしょうか。
どなたか教えてください。
^^^^^^^^^^^^^^\\ソース・ファイル\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2000 FORMAT(1H //1H ,20X,'車・関・& 車・民荷 象娚愨 (%) ' //
00000434
* 1H ,10X, ' 関・ ---> ', F10.2 /
00000435
* 1H ,10X, ' 民荷 ---> ', F10.2 /
^^^^^^^^^^^^^\\ソース・ファイル\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^\\コンパイルの結果\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:\sm.for(454) : Error: Unrecognized token '#22' skipped
2030 FORMAT(1H0,10X,' NO. .ヨ・.ー.ヤ?,2X,'.ユ.カ.
?9X, 00000450
------------------------------------------------^
Error executing df.exe.
sm.obj - 6 error(s), 0 warning(s)
^^^^^^^^^^^^^^\\コンパイルの結果\\^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
文字化けを直すより、ソースを読んで、修正する方が早いんじゃないの?
798 :
デフォルトの名無しさん:03/07/12 05:38
文字コードが違うだけってわけじゃなくて?
>> 798
まさか…、それなりに名の通ってるエディター使ってれば、大抵の文字コードに
対応してるしそんなことは無いんじゃないの?
つーか、ただの文字コードの違いだけなら、普通、それなりのエディターで一度
開いて、確認ぐらいするだろ…。
って、ことで、文字コードの違いでは無いという前提のもので、上に書かれてる
程度のプログラムなら、ソースをざっと眺めれば、そんなに苦労しないで修正
出来ると思うんだけど。つうか、所詮format文なんだし、そのformatを呼び出してる
大元を見れば、すぐ修正できると思うんだが…。
文字化けしてないソースがあるんなら、
もう一度文字化けしないようにコピーすりゃええんでないの?
皆さんありがとう!
「DEC漢字」=JIS漢字みたいです。94×94バイトの領域を使ってます。
797さんや799さんの言う様に、何とかやってみます。
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
フォートランは
(・∀・)イイ!
806 :
デフォルトの名無しさん:03/07/15 23:06
山崎対応age
やっぱ Haskell だろ。
おおフレネリ、あなたのおうちはどこ?
わたしのおうちは、スイスランドよ
きれいなお花で、いっぱいなのよ
やーーっほー、
フォートランランラン、やっほっフォートランランラン、やっほっ
フォートーランランラン、やっほっほ♪
809 :
デフォルトの名無しさん:03/07/24 11:17
>>809 Fortran が隆盛を振るっていた頃は
その程度のものはいくらでもあったんじゃないかと。
(^^)
814 :
デフォルトの名無しさん:03/08/07 21:45
fortranの名に釣られて、まじまじとスレ読んじゃいました.
前半の丁寧な対応もうびっくり!荒らしも入ることができないほど.
こんな私も、「ニューメリカルレシピ」をfortranに翻訳して使ってます.
あれ、もともとfortranが発祥なのにね.
もちろん、’ピリオド’を使うのは 科学技術計算屋だからよ〜ん ぴりおど
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
>814
ニューメリカルレシピをFortran翻訳か…。大変そうだね。
Fortran版ってもう売ってないの?
研究室の先生は持ってるな。
自分のはC版だから、必要な時に借りに行く。
結構ありがたい。
日本語版は C しかないってことじゃないかな?
読み比べてないから分かんないけど、
ソース以外のところは C のとそんなに大きく変わりはないと思うから、
文章はニューメリカルレシピ・イン・シーを読んで、
ソースは Numerical Recipes in Fortran 77 を読むってんじゃあかんのかな?
818 :
デフォルトの名無しさん:03/08/16 13:43
>>816,817
レスサンクス!
817氏の発言だと原著を買えと?高くないですか?もっともそれが一番よい方法と思いますが
>>819さんくす!
思ったほど高くない.むしろ安い!驚きじゃぁ〜〜
↑
さげ違いスマソ
824 :
デフォルトの名無しさん:03/08/19 15:05
インターネット上に、やさしいフォートラン講座というのがありまして、
消費税の計算のプログラムが出ています。
C************消費税の計算******************
WRITE(*,*) '商品の値段?’
REAC(*,*) PRICE
C
VAT = PRICE * 0.05
NPRICE = PRICE + VAT
C
WRITE(*,*) '価格:’,PRICE
WRITE(*,*) '消費税:’,VAT
WRITE(*,*) '消費税込みの価格:’,NPRICE
C
END
では、プログラムを実行して、ためしに商品の値段を”50”円と
入力して、Enterキーを押してください。
DOSプロンプトウィンドウを起動して、コンパイルのコマンドを入力する
とあります。コンパイルのコマンド入力を教えてください。
827 :
デフォルトの名無しさん:03/08/19 15:16
>825
読んでも細かいことは書いてない(?)ので教えてください。
>>824 コンパイラによって違う。
コンパイラのマニュアルを読め。
[c:\unko] f77 消費税.for
>824
//ジョブ名 JOB CLASS=A,MSGCLASS=O,MSFLEVEL=(1,1)
// EXEC FORTCLG
//FORT.SYSIN DD *
FORTRAN ソース プログラム
//GO.FT05001 DD DSN=入力用データセット名,DISP=SHR
//GO.FT05001 DD DSN=出力用データセット名,DISP=(NEW,CATLG),
// UNIT=SYSDA,SPACE=(TRK,(10,10),RLSE)
//
831 :
デフォルトの名無しさん:03/08/19 15:29
爺か?
832 :
デフォルトの名無しさん:03/08/19 19:17
そういや、コンパックフォートランってなくなるらしい
インテルはいってるになるらしい
833 :
デフォルトの名無しさん:03/08/19 19:21
AVではなくその辺を歩いていたら間違いなく女子校生で通用しそうなロリフェース。
にもかかわらず乱れる乱れる。しっかりビラビラ周りを剃りあげたオマンコにバイブが入っていく様子は圧巻です。
3Pシーンでも乱れまくり喘ぎまくりの菜月ちゃんです。
無料ムービーを観てね。
http://66.40.59.78/index.html
834 :
デフォルトの名無しさん:03/08/20 00:32
835 :
デフォルトの名無しさん:03/08/20 23:06
がいしゅつ。。。すまそ
836 :
デフォルトの名無しさん:03/08/21 10:30
会話型プログラミング言語に CRADEか GRADEというのがあるそうですが、どちらが
正しいのですか。わたしはビギナーです。教えてください。
>>836 Fortranで出来なければ、アセンブリー言語でやってみろ。
アセンブリー言語で出来なければ、やる意味がない!
>>836 > 正しいのですか。わたしはビギナーです。教えてください。
また...
> わたしはビギナーです。教えてください。
このフレーズ見ただけで、無いようによらず答える気無くなるよな。
その辺が分かってないんだろな。
あぁ、これ見たら、初心者なんだから、なおさら自分で調べるなり
努力しなさいと言いたくなる。
840 :
デフォルトの名無しさん:03/08/27 20:50
windowsXPで動くfortranのコンパイラを探しています。
だれか教えて下さい。
Cygwin か MinGW 入れて g77 を
現在FORTRAN77からFORTRAN90に移行中です.
program test
call sub
call sub
end program test
subroutine sub
integer(kind=4) :: i=0
i=i+1
write(6,'("i=",i2)') i
end subroutine sub
これをCompaq Digital Tru64 UnixのFORTRAN90コンパイラで
コンパイルして実行すると
i= 1
i= 2
となります.subroutine subにおける,i=0での初期化は
最初にcallされた時しか行われていないようです.
不思議に思いましたが,そのような言語仕様なのでしょうか.
i=i+1の前にi=0を挿入すれば
i= 1
i= 1
となります.
845 :
デフォルトの名無しさん:03/08/28 01:15
Salford FTN77 Personal Editionがダウンロードできないのです。
なぜでしょう?
846 :
デフォルトの名無しさん:03/08/28 02:19
>>844 コンパイラの仕様かな
変数宣言にautomatic属性付けるとどうでしょう。
いまvisualfortranのオンラインマニュアル眺めてたら
/automaticてコンパイルオプションがあったけどこういうの
でもいいのかな?
>844
FORTRAN90の初期値の設定は77のDATA文相当でしょ。
サブルーチンに入るたびに初期化されたら困るじゃん。
補足
77風に書くと
subroutine sub
integer*4 i/0/
i=i+1
write(6,'("i=",i2)') i
end
だよね。
850 :
デフォルトの名無しさん:03/08/28 21:00
>844
私は、Cに移行中です。
フォートランのサブルーチンがCの関数に例えられるけれど、
Cは、fortranみたいに参照渡しじゃないのに正直驚き。
ポインタがそれを解決?
とはいえ、数値計算はやっぱfortranかな?と思います。
なにあれ、powって関数・・・。げんなり、げんなり、えなりかずきっ
>>850 >ポインタがそれを解決?
その通り。
Fortran から入ると
そのポインタの使い方がすんなり受け入れられて、
楽なのやもしれませんね。
C++ だと参照ってやつも使えます。
>>844 integer(kind=4) :: i=0
だとプログラム起動時にiのメモリを確保して,iに0を入れる.
integer(kind=4) :: i
i=0
だとsubが呼ばれると,iのメモリを確保して,i=0を実行し,
subを抜けるとiを開放する.
ってなるんじゃなかった?
855 :
デフォルトの名無しさん:03/08/29 22:45
なんか最近盛り上がってるね.ここ
>>851 サンクス!
Cの勉強は一度K&Rで挫折したので入門書を購入し、ひもときました。
そのあとK&Rを読み返すと”あら不思議・・・”言っていることの意味分かるデないの。
しこしこ、演習プログラムかいていますが、K&Rはおいておいて
今度はC++の入門書にチャレンジしてみようと思います。
ところで、fortranでプログラム書いているお方は「GUI」なんて、どうでもいいのでしょうが
(実際私も実務で使うときはwin2000でdos窓)ちょっとした非線形の解算出なんかで
ウインドウに数値を入れて「ジュドーーン」と表示されるようなことしたいときどうしているのでしょうか?
なんとなく気が付いているのは、F77であってもvisual fortranというくらいだから、CだのC++だの
関係なくできるんでしょうね・・・。やり方知らんけど。
そっちの勉強のほうが先? かな。。。
857 :
デフォルトの名無しさん:03/08/29 23:42
>>848, 848 ほか
わしも知らんかった。
必ず初期化されると思ってた。
>>856 グラフを描いてくれるソフトウェア向けのデータを
出すプログラムを作るのじゃダメかな?
859 :
デフォルトの名無しさん:03/08/30 01:34
>>858 言いたいことがよく分かりません。「きれたコミュニケーション」
>>826 であげられているGUIって「特殊」なもんでしょ?
ビジュアル ビジュアル!
これ簡単にしたい気持ちわかるけど、できん
860 :
デフォルトの名無しさん:03/08/30 02:55
10月ごろに出る新コンパイラって
Intel Fortran Compiler 8.0 = Intel Visual Fortran 8.0 (旧 Compaq Visual Fortran)
なんですか?
それとも別々のプロダクトになるのでしょうか?
教えて>エライ人またはxlsoftの営業
>>861 開発環境というかリンカすら含まれていないのか
863 :
デフォルトの名無しさん:03/08/30 19:05
↑
そりゃないでしょ。(ごめソ 釣りだった?)
コンパイルできれば言うことなし!
みんな使ったことある?インテルf
スゲーハイェー
コンパックの2倍は早い
インテルハイッテルだからこそできること
>>863 なんだそのつっこみどころ満載なレスは
おまいは上のページのQ&Aを見てないのか?
Q5. インテル Fortran コンパイラには、Microsoft Visual C++ .NET スタンダード版2002 または 2003、あるいは Visual Studio .NET プロフェッショナル版2002 または 2003 が必要ですか。
A5. はい。インテル Fortran コンパイラは Microsoft Visual C++ のリンカを使用するために上記ソフトウェアが必要になります。
くっ、これが釣りというものか…
コマンドラインでコンパイルするだけでもVC++.NETがいるのか・・・
まあ、スタンダード版でもOKなのがせめてもの救いか。
866 :
デフォルトの名無しさん:03/08/31 16:04
>>864正直スマンカッタ
VCインスコされていたので、コマンドラインコンパイル時
exe一丁あがりだったもので
インテルF速い あっという間に計算終了の巻
868 :
デフォルトの名無しさん:03/09/05 17:56
FORTRANのプログラムでRAND()を使って1から10までの
乱数を発生させるのってどうやるんですか?かなり初心者
なもので誰か教えていただけませんか?
>868
いたるところにマルチポストかよ。
いい度胸してんな。
>>868 自分なりに考えてどんなコードを書いたかくらい出せ。
そもそも「1から10までの乱数」ってのがあいまい。
実数なのか、整数なのか。
1以上、10未満なのか、1以上、10以下なのか。
#普通は0以上にすると思うが
871 :
デフォルトの名無しさん:03/09/06 12:20
>>868 PROGRAM HAGE
R = RAND()
WRITE(*,*) R
STOP
END
REAL FUNCTION RAND()
WRITE(*,*) '1から10までの適当な実数を入力して下さい。'
READ(*,*) RAND
END
872 :
デフォルトの名無しさん:03/09/07 01:14
教えてください。
WinでCompac Visual FORTRAN6.1を使ってます。
1行が長くなるときって、どうやったら
前の行の連続って認識してくれるんですか?
以前(MacでFortran使用)のときは、
次の行の6文字目に#を打ってたら
よかった気がするのですが。
あと、UNIXでファイル名が'H 100A 0.NA'という風に
ファイル名に空白があるファイルは、
プログラムでopenさせることができるのでしょうか?
873 :
デフォルトの名無しさん:03/09/07 01:48
874 :
デフォルトの名無しさん:03/09/07 01:52
携帯にもウイルスがあるって聞いたんですけど
本当ですか?
もし持ってる人いたら下のアドに送ってくれませんか?
(もうすぐ買い換えるので大丈夫です)
[email protected]
875 :
デフォルトの名無しさん:03/09/07 04:34
>873
お手数かけてすみませんでした。
出直してきます。
読みづらいと言われる FORTRAN ですが,
クヌース先生の文芸的プログラミングのアイデアを使うと
なにかいいことはありますか?
877 :
デフォルトの名無しさん:03/09/13 21:14
salfordのHPが出ないんですけどどうしたの?
878 :
デフォルトの名無しさん:03/09/13 21:40
879 :
デフォルトの名無しさん:03/09/13 21:44
>>879 自分でつくったらいいんじゃないですかね
新たに FORTRAN を覚えることになり,せっかくだから
www22.ocn.ne.jp/~moriyama/notes/robust-programming.html
や
www.star.le.ac.uk/%7Ecgp/prof77.html
を見て,優しい FORTRAN プログラマになろうと思います.
まだ下の英語ページは読んでいないのですが,
レビューしてくださいませんか?
884 :
デフォルトの名無しさん:03/09/21 21:51
>>883 (⊃д`) この厳しさが FORTRAN か...
Fortranって高級(高級言語の高級じゃなくて)というイメージがある。
商用のコンパイラはどれも高いからなぁ。
Fortran90はフリーの処理系がほとんどないし。
手堅く,かつ f77 で動くように作ればいいのでは.
FORTRAN95 に完全に準拠していると嬉しいことを教えてください m(_ _)m
インテルのがあるじゃん
LINUX版はただでつ。Fortran90三昧。
>>887 ・自由書式で書ける
・配列操作が強力
・MODULEを使ってCOMMONブロックとおさらばできる
・DO 〜 END DOが使える
・.EQ., .GT., .LT. の代わりに =, >, < が使える
>>890 少しの馴れで克服できるものは,
あえて新しい仕様に頼らなくてもいいと思うのですが,
もっとツッ込んだことを語ってください.
これはエディタの支援で解決?
> ・自由書式で書ける
> ・DO 〜 END DOが使える
これは馴れ?
> ・MODULEを使ってCOMMONブロックとおさらばできる
> ・.EQ., .GT., .LT. の代わりに =, >, < が使える
これは素直に嬉しい?
> ・配列操作が強力
構造体とPOINTERを使うようになると,77で組む気にならない.
>>893 全廃すると,劇的に良くなくことがあるんですか?
>>895 うちの教授が書いたプログラムを見れば
イヤでも全廃したくなるよ。
>>896 robust に書かない人による悪業を封じ込めるため,ということですか?
implicit none
integer,parameter::m=64,n=16
real,dimension(m,n)::aaa,bbb
…
899 :
デフォルトの名無しさん:03/10/03 00:03
ところで、コーディングしてるときどうしてます?
まさか、デベラッパースチュージオなんて使ってませんよね。
漏れは、秀丸にコマンドラインコンパイルの子プロセス登録して、
f77 hogehoge.f(90でないところがポイント)
で、余計なオブジェクトファイルとおさらば&すばやいコンパイル。&すばやい試行!
というかディベロッパースタジオの使い方がようわからん。デバックとか強力と想像・・・。でも使えない。
いまだにデバッグは
write(*,*) 'oh! no!'
pause
で済ましてます。
こんな数値計算屋によいご教示を。
900 :
デフォルトの名無しさん:03/10/03 01:26
>>899 DEVELOPER STUDIO, 強力です。
デバッグ機能にかぎらず、
かなりのカスタマイズも可能、マクロも組める、VBでアドインも作れる、
SourceSafeの統合などなど利点は多いと思う。
タコなプログラムをデバッグしてると、そのまま無反応になることも多いが.....
欲を言えば、構造体メンバのIntellisenceが効けばなぁ
>900
情報さんくす。
おらにとっては、宝の持ち腐れ。使えるようになりたいと祈るがやる気無し。
でも、同じ考えの人きっといるとおもうなぁ。
902 :
デフォルトの名無しさん:03/10/08 05:07
>>895 マジックナンバー(一目では意味の汲めない生の値)が無くなる。
Fortran 以外の言語を知れば如何に気持ち悪いものかが分かるはず。
903 :
デフォルトの名無しさん:03/10/09 00:56
>901
Visual Studio + Compaq Visual Fortran 使っているけど
デバッグ時に、配列をグラフ表示できるのはとても便利。
UNIX だと X に DDD と gnuplot の組み合わせでそういうことが
出来るらしい。
ただ、統合環境のおかげで、make ファイルの使い方が
ちっとも身に付かないのはちょっぴり後悔。
904 :
デフォルトの名無しさん:03/10/09 17:01
現在compaq visual fortran6.6Bを使っているのですが
デュアルCPUのマシンが新しく入り並列計算を行いたいのですが
やり方がよくわかりません。
オンラインマニュアルをよんでproject settingsとかをいじくったり
してるんですがCPU使用率も50%のままですしどうしたらいいのか・・・
教えてちゃんでもうしわけないですがどなたかおねがいします。
デュアルCPUの生かすには、スレッドを効率よく使ったプログラムを組まなければなりません.
つまり,並列演算できるようにマルチスレッドプログラミングすればデュアルCPUで速度が上がります.
>>905 ありがとうございます。do文とかをコンピュータが計算しやすいように
組まないといけないんですよね。
マニュアル読んでたけどなかなか大変そうですね。
コンパックのコンパイラじゃ
スパコンのコンパイラみたいに簡単に最適化してくれるわけではないみたいですね。
仕方がないのですこしがんばってみます。
このスレ,Fortranで2年ももってるのか…
Fortranマンせー
Intel Visual Fortran まだかなぁ〜
Tru Unix 以外で HPF を使う方法ってありますか?
911 :
デフォルトの名無しさん:03/10/17 16:05
UNIXでf90の出力データがあります。
小数で16×24の表です。
format文を使っているんですが、勝手に改行してしまいます。
何か良い方法はありますか?
・・・
>>911 情報不足.プログラムと実行環境と実行結果を
晒したら誰か答えてくれるかも.
・・・
915 :
デフォルトの名無しさん:03/10/18 12:14
>>905 ということは、自分でスレッド作ったり、スレッド間の同期取らないと
できないってことですか?
916 :
デフォルトの名無しさん:03/10/18 22:22
>911
画面出力?ファイル出力?
もしかしたら UNIX の環境変数で
決まってるんじゃないの?
>>915 compaq visual fortran てopenMP使えないの?
あれなら簡単にマルチスレッドプログラミングができるけど。
私は915じゃないですよ。
openMPとかKAP/Pro Toolsetは使えるでしょうけど
買わなきゃいけないんですよね・・・
しといてよかった、implicit none。
いやあ、今日はINTENTに助けられたなあ。
渡した引数がどこで書き換わっているのかわかんなくて
INTENT(IN)属性を指定してみたらコンパイラにおこられて分かりました。
ふう。
90か・・・77のころがなつかしいな。
GOTO だーい好き。
( ゚д゚)・・・
デバッグモードでコンパイルしてください。
自分でつくったらいいんじゃないですかね
( ゚д゚)・・・
928 :
デフォルトの名無しさん:03/10/27 00:40
>>920 Win32APIそのまんまみたいな感じですね。
通信関係のソフトで、受信の所だけスレッドにして
ポーリングするっての作ったことあるけど、同期させるのが
結構手間でした。同期取る部分でかなりのオーバーヘッドがあったのでは
と思います。まあ多分ここでいっているマルチスレッド化とは
主旨が違うと思いますが・・・
そうですね、ええ。
( ゚д゚)・・・
CYCLE
933 :
デフォルトの名無しさん :03/10/28 23:55
デュアルCPUを生かすにはプログラムを組み直さなくてはいけないそうですが、
組み直してないプログラムを走らせてDUALのXEONの3.2とPen4の3.2で比べたときに、
劇的に差は出るのでしょうか?
2倍速にはならずとも1.5倍ぐらいは期待してるのですが甘いですか?
>>933 プログラム次第ですねー
ベクトル化を丁寧にしていけば1.5倍は難しくないかも
>>933 デュアルCPUのPCは単処理が速くなるのではなく,複数の処理をしても重くならないのです.
だから,CPU×2=2倍の処理速度ではないですよ.
でも,プログラムをがんばれば,1.5倍は可能です.
936 :
デフォルトの名無しさん:03/10/29 12:27
>>934 >>935 やっぱりプログラムを組みなおさなくてはデュアルの意味がないのですね。
プログラムを組みなおす余裕がないので、パソコンの性能で高速化を考えていたのですが、
単処理をするだけならばPen4の最新のほうが速そうですね。
アドバイスありがとうございました。
>>936 シングルスレッドのプログラムのデータを分けて,2つプログラムを起動してそれぞれのCPUに任せるのも手です
ABSOFT PRO FORTRAN 77を使ってるんですが、
プログラム実行時間を出力させるにはどうしたら良いでしょうか?
ETIMEやDTIMEが使えないようなので・・・
( ゚д゚)・・・
こーる しぃぴぃゆぅ_たいむ(じっすう)
>>939 ABSOFTのFORTRAN90ならCALL CPU_TIMEで通るんですが、
77だと通らないんですよ・・
こ〜る しすてむ_くろっく
GO TO 943
CONTINUE
GOTO 1000
STOP
END
IF (n.gt.1000) exit
EQUIVALENCE(945,946)
WRITE(*, 949)
WRITE(*, 950)
951 :
デフォルトの名無しさん:03/11/01 10:20
REWIND (7)
WRITE(952,'(/a/)') 'くそ'
くそ
CALL SYSTEM 'clear'
go to 1
1 :パッキー :01/10/16 15:45
Fortran90をただでコンパイルする方法はないでしょうか?
そろそろ次スレいる?
ここは 990 でもいいんじゃないでしょうか.
G95 が急に完成したら祭になるでしょうけど.
958 CONTINUE ! G95マダー?☆チンチン
カモカモ
IF(G95=='キタ━━(゚∀゚)━━ !!') WRITE(*,*) 'キタ━━(゚∀゚)━━ !!'
ELSE WRITE(*,*) 'マダ━━(゚∀゚)━━ ??'
961 :
デフォルトの名無しさん:03/11/04 23:40
デュアルCPUマシンがあるので並列化コンパイルしたいのですが、
今あるコード(F77)は並列化を考えて組まれていません。
この場合、コード内で繰り返し計算されていて時間を食っている部分だけを、
並列化ライブラリで定義されている関数で書き直せば高速化を図れますか?
また自動並列化ではどれくらいの効率が図れるのでしょうか?
962 :
デフォルトの名無しさん:03/11/04 23:46
糞スレだったのに他にFortranスレがなかったために本スレに。
珍しい現象だから記念カキコ
>>961 そらライブラリのほうが一般的には速いだろう。
自前で並列化する場合だが、「うちのコード」の場合
intelので自動並列化したけど思ったほど速くならなかった。
たしか一割くらいか?
仕方がないから一部分だけopenMPで並列化指示をした。
最終的に6割ほど速くなったと思う。
どうせopenMPなんて(MPIに比べれば)簡単だからやってみたら?
964 :
デフォルトの名無しさん:03/11/05 21:26
intel fortran compiler7.1ってvisual C++6.0にプラグインとして統合できるとありますが、
どういうことでしょうか?
コマンドラインではなく、visual fortranのようにボタンを押してコンパイルという使い方とは
違うことですか?
どなたか教えてください。
VC++6.0のライブラリをリンクできる
966 :
デフォルトの名無しさん:03/11/05 23:50
intel fortran compiler7.1とvisual C++6.0でvisual fortranにはならないのですね。
IFCってFortranのコンパイラをVSで使うためにはカスタマイズのadd-in,macroの
設定でIFCのチェックをするから,そういうことなのでは?
Intel C/C++だとマクロによる設定ではなくて,別に設定ダイアログができる.
二つのプログラムくっつけてビルドしたらこんなんでました。
Text1.obj : error LNK2001: unresolved external symbol _F@8
Debug/Text1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Text1.exe - 2 error(s), 0 warning(s)
どういうことですか?教えてくださいm( )m
969 :
デフォルトの名無しさん:03/11/06 21:09
>>968 暇つぶしだ
数十行のコードならあっぷ汁
たぶんどっかで間違った関数名使ってる
奇怪なコードになる前に、外部関数と変数名を明示的に宣言してimplicit none使え
970 :
超素人です:03/11/06 22:14
ありがたいんですがけっこう長いんであっぷはちょっと・・
学生です。卒業生のやつをうごかしてみたんですがこんなかんじでした。
Fってのがまちがった関数なんすかね?8ってのは何をいみしてるんですか・
971 :
noobie:03/11/06 22:24
@8が何を示しているのかは知らん
とりあえず今わかるところだけ
"f"という関数もしくは変数をどこかで使用している
その"f"を定義していないのでリンカがエラーを吐く
コードを検索して、"f"という名前の関数か変数を使用してないか調べてみ
いまだに implicit none してくれないひとがおりまして・・・
みなさんありがとうございます。Fというのが宣言されてなかったみたいです。
エラーは無くなりましたが結果はでませんでした・・・
forrtl : severe (161) : Program Exseption -array bounds exceeded
Image PC Routine Line Source
Text1.exe 00403E05 Unknown Unknown Unknown
Text1.exe 00402D6B Unknown Unknown Unknown
Text1.exe 00465879 Unknown Unknown Unknown
Text1.exe 0044AD39 Unknown Unknown Unknown
kerne32.dll 77E414C7 Unknown Unknown Unknown
ncrementally linked image -- PC correlation disabled
こんなんです・・わけわからんです m( )m
>>975 array bounds exceededは配列の宣言より大きい値のところに数値を入れると出ます
つまり,
REAL*8 :: a(5)
DO I=1,6
A(I)=I
END DO
I=6の時,A(6)となり,落ちます
このエラーはデバッグでプログラムを走らせるとその場所で止まるので,
すぐに分かります.
C++ から Fortran の関数使う時に
extern "C" を忘れてるとか?
978 :
デフォルトの名無しさん:03/11/07 21:00
危なかった・・・
>>976 その程度の問題なら、必ずしも落ちないんだな。
real*8 :: a(5), b(5)
と宣言して、
a(6) = hoge
とやると、b(1)==hogeになる事が多々ある。
海老コンパイラが糞なだけかもしれんが
いまだにサブルーチン使えない人がおりまして・・・
コンパイラ様は神様です。