1 :
デフォルトの名無しさん :
03/11/09 13:25
2 :
デフォルトの名無しさん :03/11/09 13:26
3 :
デフォルトの名無しさん :03/11/09 13:27
FORTRAN II とか書いてあるから、何をいまさらそんな古い規格について語ることがあるんだ ? って思ったら、2スレ目なわけね。
お助けください・・・fortranで質問です。 1から1000までの素数を求めるプログラムで 配列変数を用いてプログラムを作る方法がわかりません。 do文だけ使用という条件ならわかるのですが、配列変数を用いて プログラムを作る方法がわかりません。 どなたか暇な方教えて下さい(´Д`;)
素人の質問ですが、かまってください * TEST PROGRAM TEST REAL A,B,X,Y,F,Y0 INTEGER N F=X**2-Y A=0. B=1. Y0=1. N=100 CALL RUNGE_KUTTA(X,Y,A,B,N,F,Y0) WRITE(6,*) X,Y END
8 :
デフォルトの名無しさん :03/11/09 23:48
SUBROUTINE RUNGE_KUTTA(X,Y,A,B,N,F,Y0) REAL A,B,X,Y,F,H,K1,K2,K3,K4,Y0 INTEGER I,N EXTERNAL F X=A Y=Y0 H=1/REAL(N) DO 10 I=1,N K1=H*F(X,Y) K2=H*F(X+H/2,Y+K1/2) K3=H*F(X+H/2,Y+K2/2) K4=H*F(X+H,Y+K3) X=X+H Y=Y+(K1+2*(K1+K3)+K4)/6 WRITE(6,100) X,Y 100 FORMAT(' ',F10.5,F10.5) 10 CONTINUE RETURN END
これを走らせると(コンパイルは出来る)、 次のようなエラーメッセージがでます。 Runtime error from program:c:\win32app\salford\backup\renshu~1.exe Access Violation The instruction at address 0373fb83 attempted to read from an illegal location 0373fb83 routine at address 373FB83 [+0000] 00401000 TEST [+005c] \win32app\salford\backup\renshu~1.exeは生成された、実行ファイルです。 どこが悪いか全く分かりません。 できたらアドバイスお願いします。
質問だけでも何なので
>>6 こんなのがあります。
LOGICAL PRIME(1000)
INTEGER LIST(250)
READ(5,*)
L=1
LIST(L)=2
DO 10 I=3,N,2
PRIME(I)=.TRUE.
10 CONTINUE
DO 30 I=3,N,2
IF(PRIME(I)) THEN
L=L+1
DO 20 J=I,N,I
PRIME8J)=.FALSE.
20 CONTINUE
END IF
30 CONTINUE
WRITE(6,200) (LIST(I),I=1,L)
200 FORMAT(' ',10I6)
END
論理型の配列変数を用いて、 エラトステネスの篩を使うやり方です。
12 :
デフォルトの名無しさん :03/11/10 00:48
>>7-9 PROGRAM TEST中の
F=X**2-Y ! 変数 F への代入
は
F(X,Y)=X**2-Y ! 文関数 F の定義
では?
でも文関数の有効範囲はそれを定義したプログラム単位(ここでは PROGRAM TEST)
内だけなので、F() を SUBROUTINE RUNGE_KUTTA() で使うには
FUNCTIONで別に関数定義する必要があると思います。
>>12 早速ありがとうございます。
<変更点>
REAL FUNCTION F(X,Y)
REAL X,Y
F=X**2-Y
RETURN
END
これを別に定義して、
RUNGE_KUTTA(X,Y,A,B,N,F,Y0)
↓
RUNGE_KUTTA(X,Y,A,B,N,,Y0) 文関数の中の変数のFを消去
これでうまく行きました。
サブルーチンの変数に文関数を入れたらまずいですね。
>>10 遅レスですが・・・
無事にプログラムを走らすことができました
ほんとうにありがとうございましたヽ(´ー`)ノ
文関数は実行文ではないので,プログラム単位中では全ての宣言文のあと, 全ての実行文の前に書く。
16 :
デフォルトの名無しさん :03/11/12 11:41
Fortranにプリプロセッサは無いのでしょうか? 環境が変わるたびに書き換えるのは非常に面倒です。
VFの設定にはPreprocessorというカテゴリがありますが
>>17 VFとは 何でしょうか?ひょっとして Visual Fortran ですか?
HP FortranはCプリプロセッサ (cpp) 指令も認識します。 Sun Fortranはfppとcppというソースファイルプリプロセッサをサポートしています。 UNIX系コンパイラでは、拡張子を".F"とすることで、FORTRANのコンパイルの前にCプリプロセッサによって処理される。
21 :
デフォルトの名無しさん :03/11/13 11:43
大学の研究でFortranを使い始めたばかりの者です。 コンパイラはVisual Fortranを使ってます。 私はC言語の経験があるのでプログラムの流れなどは入門書を読めば分かるのですが、 先輩からもらったプログラムを解読するためにはリファレンス的な本が必要です。 何かおすすめがありましたらお願いします。
22 :
デフォルトの名無しさん :03/11/13 14:18
>>22 市販のf90本では富田本かねぇ
彼のwebページも読んでおくべし
本当はbit別冊のf90入門書が良いがもう市販されてない
大文字はやめてくれ〜っ
だれだ〜っ、とてつもなくどでかいコアファイルはきださせたのは〜っ!
26 :
デフォルトの名無しさん :03/11/15 23:11
HPのVisualFortranってコンパイラのバグはどう? IDEにVS使えるから、そろそろ移行しようかと思ってるんだけど。 海老ソフトProFortranのコンパイラ、バグ多くてやってられん。 integer :: a(3) real*4 :: b(3) = hoge a = real( b ) としても、a(1)にしかキャストされた値が代入されない。 a(1:3) = real( b(1:3) ) とすれば問題なし。 配列内の全ての値がキャストされ、a(1:3)に代入される。 subroutine( b ) logical, optional, intent(in) :: b 関数やサブルーチンにのlogical型仮引数をoptional属性つけて宣言した場合、 どうも、present( b )で実引数と結びつけられているか、調べられない。 おかげで、logical型引数にはoptional属性をつけられない。 logical型以外の引数の場合は問題なし。 何故かしらないが、select case構文内で 小文字で、"case default"と書くとコンパイラにしかられる。 仕方なく大文字で、"case DEFAULT"と書いてる。 うぜぇぇぇ。
27 :
デフォルトの名無しさん :03/11/15 23:53
>>26 IDEにVS使えるから,VisualFortranと言っているが,IVFでは要VC.netです.
やっほー、ふぉーとらんらんらん
>>28 > IDEにVS使えるから,VisualFortranと言っているが,IVFでは要VC.netです.
おっ!ということは逆に言えば、VS.NETならVFなしでも動くということですよね?
今までVF買えなくてg77でがんばってきたけど、VS.NETならアカデミック版が生協で簡単に手に入るので買っちゃおうかなぁ。
31 :
デフォルトの名無しさん :03/11/17 00:11
>>30 Visual Fortranを使うためにはVS.NETまたはVC++.NETが必要 と言う意味です。
VS.NETにはVFは入っていないため、VS.NETだけではFortranのソースをコンパイルできません。
詳しくは、下記のURLから
ttp://www.xlsoft.com/jp/products/intel/support/statusupdate_qa.html > Q5. インテル Fortran コンパイラには、Microsoft Visual C++ .NET スタンダード版2002 または 2003、
> あるいは Visual Studio .NET プロフェッショナル版2002 または 2003 が必要ですか。
> A5. はい。インテル Fortran コンパイラは Microsoft Visual C++ のリンカを使用するために
> 上記ソフトウェアが必要になります。
>>31 ねぇねぇ!!
ということはCのライブラリもリンクできるのぉ?
>>31 > Visual Fortranを使うためにはVS.NETまたはVC++.NETが必要 と言う意味です。
ん?そうなんですか?うちの先生は、「Cなんかわからん!」とかいって、Visual Fortranしか入れてなかった気が。
それと31さんが示してくださったのリンク先のQ&Aを読むと、Visual FortranがなくてもVC Tがあれば、
というかVCのリンカがあれば、別にVisual Fortranがなくても(とりあえずコマンドラインからは)使えますよん。
と書いてあるように思えるんですけど。
で、IDEに関しても、
> Q4. IDE を持っていない場合、どうすれば良いですか。
> A4. 弊社では Microsoft Visual C++ スタンダード版および Microsoft Visual Studio プロフェッショナル版を販売しております。あわせてご検討ください。
と書いてあるからには、Visual FortranなしでもVCがあれば、IDEも使える気がするんですが。
35 :
デフォルトの名無しさん :03/11/17 02:09
>>34 > Visual Fortranしか入れてなかった気が。
>>31 で言ってるのは(まだ発売されてない)Intel製VFのことだよ。
いまCompaq (HP) が売ってるVisual FortranはIDE (Developer Studio)と
MS製リンカが付いてるので単体でコンパイルできるしIDEも使えます。
> VCのリンカがあれば、別に・・・
今のIntel Fortran CompilerはCVF(のリンカ)さえあればコマンドラインからは使えるから
IVFもひょっとしたらリンカさえあれば使えるかも知れない。(当然サポート外だろうけど)
> Visual FortranなしでもVCがあれば、IDEも使える気がするんですが。
すまん。言ってることがよく解らん。
VS/VCは単体でもそれだけでIDEやCコンパイラが使えるけど、
Visual Fortran(Fortranコンパイラ)がなければFortranのコンパイルはできない
と言う意味なんだが・・
>>35 >
>>31 で言ってるのは(まだ発売されてない)Intel製VFのことだよ。
うわ、そうでしたか(^^;失礼しました。
ど素人なのですが、教えてもらえますか? y=3x**2+4x+3 うえの式を微分するプログラムは、どうすればいいのですか? 大学に入って、初めてプログラムをするので、まったく分かりません。 教えてください。
>>34 リンカとは,ソースプログラムをコンパイルしてできた中間オブジェクトファイル群を結合して
1つの実行可能なプログラム形式を作成するためのものです
なので,リンカだけがあっても,どうしようもないですよ
39 :
デフォルトの名無しさん :03/11/17 21:03
NAGのライブラリーよこせ.
富田本とやらを読みました。 先輩からもらったプログラムの中で USE DFLIB SECNDS RAN などは入門書に載ってないのですがどうすればいいでしょうか? いろんな関数が載っているリファレンスのような本があればキボンヌです。
FORTRANの自動並列化コンパイラでオープンソースってある?
課題で分からないところがあるのでどなたか知恵を貸してください。 integer*2 k,n,s read(*,*) n s=0 k=1 10 s=s+k k=k+1 if( k .le. n) go to 10 write(*,*) 'n=',n,' s=',s stop end s=1*2+2*3+・・・+n*(n+1) s=1+1/2+1/3+・・・+1/n 上のプログラムを参考にして修正するものです。 凄く初歩的なものですがお願いします。
47 :
デフォルトの名無しさん :03/11/21 04:11
f77か。 この程度は自分でやれよ。 わからないところって、丸投げじゃねーか。 S[n]=1*2+2*3+・・・+n*(n+1) つまり S[n=1] = 2 S[n] = S[n-1] + n*(n+1) [n=2,3...] S=1+1/2+1/3+・・・+1/n つまり S[n=1] = 1 S[n] = S[n-1] + 1/n [n=2,3...] これでもわからないなら、知恵以前の問題。
>46 s を integerのままにしておくなよ。
何でわざわざ,integer*2なんだろう
あ、ここの話題は66でも77でも90でも95でもいいんだっけ
なんでもいいんだろうけど66はちょっといやだな・・・
カードやテープがいるの?
最強のカード? 10 CONTINUE
FORTRAN77で出力されたデータを、グラフ化する事を学ぶにはどうしたらいいのでしょうか? 相性がいいグラフィックソフトがあったりするのでしょうか?
>>55 とりあえずGNUPLOTかな?
個人的にはExcel+VBAもよく使うけど。
使い方はそれぞれのソフトを紹介している本なりWebサイトなりを探せば
いっぱい見つかるよ。
g77ってもっとスピード上がらないのかな? もう見捨てられてる?
58 :
デフォルトの名無しさん :03/11/27 02:07
>>55 おそらくプログラム実行中に出力されるデータを逐一グラフ化するんじゃなさそうだから、
FORTRAN77で出力云々はほとんど関係ないと思う。
出力するデータの形式とデータの種類だけが関係してくる。
グラフ化ソフトで読み込みしづらい様な出力データなら、
プログラムのコードを変更してそれに適した出力データを吐かせるのが普通だと思う。
もしくは、すでにある出力データをそれ用にフォーマットし直すスクリプトを組む方法もある。
手元に適当なソフトがあるならそれ使えばいいんじゃないかな。
安く済ませるならGNU PLOT。
しかし、これいまいち使い勝手がわるいんだよな〜
>>57 最新のCPUへ最適化されたコードを作れないなら、すでに見捨てられてるカモね。
これによってプログラムの実行速度が全然違ってくるし。
g95もβ(?)版は出てるようだけど、用途が用途だけに信頼性がまだ今ひとつ…
LinuxならintelのFortran90が無償で提供されてるからそれ使う手もあるけど、
これは使ったことが無いので良く分からない。
3000行未満程度のコードならあまり変わらないかもしれないけど、
コードがある程度の行数があってこれから大幅に変更するんなら、
早めにF95に移行した方が幸せになれるかも。
"F77に比べれば"格段に構造化しやすくなってます。
>>58 レス有難う
でも僕の書いたソースじゃなくて、僕のいる分野で使われているソースをコンパイルするのに使いたいので
多分g77じゃないとだめっぽいんですよね。
行数はすべて合わせたら数万から十数万行は確実にいってると思います。
>>58 ヽ(`Д´)ノ gnuplot ハイイゾ!
>>56-57 早速ありがとうございます。
>>56 excel,vb共に、持っていますが、vbは全く使ってません。
今まではexcelは一次元データ列ならそのまま扱えるのですが、
txtで開けないから、どういうフォーマットの細工をしたらいいか検討がつきませんでした。
もっと調べてみます。GNUPLOTも勉強してみます。
>>57 最終的には、2,3次元のデータを微小時間ごとに逐一だしたいのですが、
そこまで全く至るための知識不足です。
>グラフ化ソフトで読み込みしづらい様な出力データなら、
>プログラムのコードを変更してそれに適した出力データを吐かせるのが普通だと思う。
>もしくは、すでにある出力データをそれ用にフォーマットし直すスクリプトを組む方法もある。
GNUPLOTで描画するためには、FORTRANで吐かせるデータのFORMATを工夫すればいいだけですか?
62 :
デフォルトの名無しさん :03/11/28 10:29
>>61 EXCELは配列データをテキストで開けますよ
>>62 そのHPでやり方覚えさせてもらいます。ありがとうございます。
>>63 例えば、
write(7,100) ((u(i,j),j=2,n),i=2,n)
100 format(8(1h ,8f10.5/))
だと、エクセルで開くと、
(i,A)セルに、(i,1)〜(i,n)すべてが含まれてしまうんです。
n=9なので、 100 format(8(1h ,8f10.5/)) での、繰り返しは8です。
>>64-65 Excelでデータファイルを開くときに「カンマやタブで区切り区切られたデータ」(CSV)
で開いてない?
区切り文字にスペースを指定するか固定長フィールドのデータとして開くと
きちんと値毎に区切られて開けるよ。
g77 や f77 にて,standard な F77 でないところを指摘してくれる オプションは無いのでしょうか. 別個の構文チェッカがあるのでしょうか. これが妥当なのか知りたいのです: WRITE(UNIT=*, FMT='(A, F3.1, A)') 'It is ', FOO, '.' とする代わりに, WRITE(UNIT=*, FMT='(\'It is \', F3.1, \'.\')') FOO
>>69 サンクスコ.
早速やってみました.後者はダメでした.
みなさんはどうですか?まさか FORMAT 文ではないですよね?
>>68 WRITE(UNIT=*, FMT='("It is ", F3.1, ".")') FOO
これでも同じみたいですね.
>>71 ほんとだ! ftnchek に怒られなかったよヽ(´▽`)ノ
まだ Professional Programmer's Guide to Fortran77 の 3 章を読んでいる
くらいなので,クォートの違いが何なのかは分からず...
"がF90だからじゃねの
Professional Programmer's Guide to Fortran77 (どう略せばいい?) の 4 章によると,ダブルクォートは Standard じゃないみたいです.残念.
75 :
デフォルトの名無しさん :03/12/01 21:35
シングルクオートをトイツにしてエスケープするのもダメ? WRITE(UNIT=*, FMT='(''It is '', F3.1, ''.'')') FOO
>>68 よくわからんが,こうしたいのか?
WRITE(UNIT=*, FMT='(''It is '', F3.1, ''.'')') FOO
75と同じだった.逝ってくる. ''と"が同じにみえた.
リンク中・・・
質問があります。お願いします。 SUBROUTINE内で定義した、 COMMON /CDXYZ/DX(NSP),DY(NSP),DZ(NSP) があります。これは、それまでに定義されてません。 DXP(I)=DX(I)+FX(I)*DT**2/TMASS DYP(I)=DY(I)+FY(I)*DT**2/TMASS DZP(I)=DZ(I)+FZ(I)*DT**2/TMASS なる文が最初に出てきますが、 DX(NSP),DY(NSP),DZ(NSP)は値が入っていないはずです。 この場合、値は全部0になるのでしょうか?
80 :
デフォルトの名無しさん :03/12/04 21:43
値が入っていないとは? それらの配列を初期化していないなら、"基本的には"値は不定だよ いくらcommon文とはいえ、初期化する必要があるなら、するべきだと思う 「いつも0になるから、0で初期化しなくていいや」なんて思わずに
82 :
デフォルトの名無しさん :03/12/06 00:01
>>79 BLOCK DATA で初期化されている可能性がある。
83 :
デフォルトの名無しさん :03/12/06 12:43
>81 :デフォルトの名無しさん :03/12/04 22:47 >値が入っていないとは? >それらの配列を初期化していないなら、"基本的には"値は不定だよ >いくらcommon文とはいえ、初期化する必要があるなら、するべきだと思う >「いつも0になるから、0で初期化しなくていいや」なんて思わずに そのとおり。Fortranは基本的には最初にメモリを静的に確保して、そこで 閉じている処理系。なぜなら大昔はメモリが極端に少ないから、そうするのが 当然だったんだろう。 今は当然違う。スタックを多用するので、特に副プログラム内の変数はコールさ れるたびにアドレスが違っている可能性がある。大昔はそんなことやりたくても できなかった。 だから、大昔のFortranプログラムをコンパイルすると実行時に答えが全く違った り、全く動かないこともある。そのときには、スタックを使わないオプションで コンパイルしたりする。 変数の初期化は、愚直にやった方が後々楽だ。
>>83 単にスタックのないプロセサだったんだろ。
普通、サブプログラム/関数のローカル変数を使いまわしができるスタック方式の方がメモリーには優しいよ。
> だから、大昔のFortranプログラムをコンパイルすると実行時に答えが全く違った
> り、全く動かないこともある。そのときには、スタックを使わないオプションで
> コンパイルしたりする。
ちゃんとデバッグしろよ。
>>75-76 セクション 5.2 「Constants」を読んで,やっと何のことだか分かりました.
文字列リテラル内でシングルクォートを表現するには,
2 つ書けばいいんですね.てっきりパーレンを括っているのかと...
ありがとうございます.
どうでもいい話ですが,2ch や e-mail でも
FORTRANer なら一行 72 文字ですよね?
今まで 80 くらいでやっていたので反省しています.
f77 に完全準拠したコードを書くために ftnchek を使用するにあたって, IMPLICIT NONE だけを許可したいときには,どんなオプションになりますか? # ftnchek -f77 -nof77=implicit-none hoge.f では No string setting allowed for -nof77=implicit-none: ignored と言われ,無視されてしまいます. まさか,-f77= に implicit-none 以外の全てをリスト...?
すみません、どなたかこのプログラムは、どういった物か教えてください。 フォートランには、まだあまり詳しくないもので、お願いします。 PROGRAM IMPLICIT NONE REAL::X INTEGER::I,M INTEGER,DIMENSION(20)::DICE DO I=1,20 DICE(I)=0 DICE(M)=0 END DO CALL SEED(794) DO I=1,20 CALL RANDOM(X) M=INT(20*X)+1 DICE(M)=DICE(M)+1 END DO DO I=1,20 WRITE(*,*)I,DICE(I)/100000. END DO STOP END
>>87 > DICE(M)=0
不定なインデックスのところに 0 を代入.
> CALL SEED(794)
泣くよ?
> WRITE(*,*)I,DICE(I)/100000.
20 回やったのに 100000 で割るのはなぜ?
すみません、訂正です。 PROGRAM IMPLICIT NONE REAL::X INTEGER::I,M INTEGER,DIMENSION(20)::DICE DO I=1,20 DICE(I)=0 DICE(M)=0 END DO CALL SEED(794) DO I=1,100000 CALL RANDOM(X) M=INT(20*X)+1 DICE(M)=DICE(M)+1 END DO DO I=1,20 WRITE(*,*)I,DICE(I)/100000. END DO STOP END
>90 細かいバグは目をつぶって変数名などから想像すると たぶん「20面体のさいころを10万回振ってそれぞれの目の出た確率を出力する」プログラム。
「目の出た*確率*」っていうのは妙だな。 「目の出た割合」か。
93 :
デフォルトの名無しさん :03/12/09 18:47
>> だから、大昔のFortranプログラムをコンパイルすると実行時に答えが全く違った >> り、全く動かないこともある。そのときには、スタックを使わないオプションで >> コンパイルしたりする。 > >ちゃんとデバッグしろよ。 10万行のプログラムをね。あんた、どれくらいの問題をやってる。 20年以上使われるとね、バグが本物になってしまうんだよ。 ここはバグですから直しておきましたと言って、余計なことをするなと 殴られる。
95 :
デフォルトの名無しさん :03/12/10 01:12
すみません。質問です。 fortran90で、目的のファイルが更新されたら 自動的にプログラムを実行させるっていうプログラムは どうやって書いたらいいのでしょうか?
>>90 訂正って,Mは結局不定のままじゃん.
>>95 VFならできなくもないが,Fortranで常駐プログラム作るよりは,Cで組んだ方がいいと思うが.
97 :
デフォルトの名無しさん :03/12/10 19:48
Intel Visual Fortran Compiler 8.0 for Windows 発売age
>>93 オプション変えて、答えが合ってたら安心するんだ...。
まあ、そういうプログラムってことね。(藁
>>95 OS に依存する方法しか無いでしょう (?)
cron.d があるシステムならスクリプト数行!?
100 :
デフォルトの名無しさん :03/12/10 22:25
>オプション変えて、答えが合ってたら安心するんだ...。 > >まあ、そういうプログラムってことね。(藁 それくらいにしとけ。お坊ちゃん。
ありがとうございました
相談があります。 学校での授業でこれからしばらくの間、FORTRANを使う事になったのですが、 それに伴って友人数名でコンパイラを買う事にしました。 ちなみに富士通のやつ。 複数のパソコンにインストール可能ですか? 何か複雑極まりないセキュリティが入ってて、パソ一台にしかインストール出来ないって事はありませんか? 無いとは思うんですが、やはり万が一って事もあるので・・・ 法律的にはダメだって判ってるんですが、やっぱり一人では高くてとてもとても・・・・ アドバイスよろしくお願いします。
Salford FTN77 Personal Edition Compiler これじゃ駄目?
106 :
デフォルトの名無しさん :03/12/12 00:19
ifcはノンコマーシャル版がありますが?
107 :
デフォルトの名無しさん :03/12/12 00:23
>>106 いや103を見るとwindowsで使いたいんじゃないかと。
ifc for windowsに非商用版はないでしょ。
108 :
デフォルトの名無しさん :03/12/12 00:27
winです。 フォートラン90が必要なので・・・・
オンラインでドコにも売ってないってどういう事だゴルァ 全部古い奴だったし・・・・・
112 :
デフォルトの名無しさん :03/12/12 23:22
>>102 ,111
オンラインで売ってる安い奴だとここかな?
http://www.lahey.com/index.html Lahey/Fujitsu Fortran 95 Expressが$249
Essential LF90のEducational Licenseだと$79
あとFedExの送料が$45くらいかかる。
ただ、Essential の方は"古い"文法が使えないのでこっちを買うなら
F言語を使った方がいいかも。
詳細は↓参照
http://cij.jp/lahey/ でもカードが要るから学生さんには買いにくいかな・・・
# 電話orFAXも可、とは書いてあるけど
>>102 90じゃなくちゃ駄目な理由はよく分からんけど
コンパイラ買うなら、その金で良い本買ったほうが良いと思うけどなあ。
授業を担当している先生に、熱心に家でも勉強したいんですって言えば
Fortran90をインストールしたノートパソコンとか貸してくれそうだけど。
どこの研究室でも、ちょい古めのいらないパソコンは転がってるからね。
>>113 > 授業を担当している先生に、熱心に家でも勉強したいんですって言えば
> Fortran90をインストールしたノートパソコンとか貸してくれそうだけど。
「そうか。がんばれよ。学校に来ればいくらでも使えるから。」と言われるに一票。
勉強用ならWin版のコンパイラ買うよりも、古いパソコンにLinuxとIntel Fortran入れた方が安上がりかも。
プログラミングの勉強をするなら Windows なんてやめなさい. 苦労するだけです.
117 :
デフォルトの名無しさん :03/12/13 17:26
>>116 先生、その代わりになるステキなOS名とその訳をお教え願いたいわけですが、
いかがですか?
>>117 たとえば Solaris9 がある.
x86 向けも売られているし,Linux 用バイナリも動くから
Intel の無償コンパイラも走るわけだ.
>>119 77は1桁目にC, *を書くとコメント行、6桁目に文字を書くと継続行、コードは2〜72桁
と言った具合にプログラムを書く位置が決められている。
> ソフトは見つけました。安いトコ。
学生用は定価で8割引か・・・すごいね。
122 :
デフォルトの名無しさん :03/12/13 23:32
とりあえず、即製品を買うのはお薦めできない。 その富士通のコンパイラ、90日間試用できるみたいだから、とりあえずそれ使ってみたら。
Linuxですか・・・ レッドハットあたりだと、まあ直ぐに買えるとして、問題はハードディスクですな。 私はリナックスをダウンロードして組むような知識はありません・・・ パーティション分けして空けてやらないと・・・・ めんどくさい・・・・・ 完全日本語化のディストリビュータってありますか?レッドハットは英語ばっかし・・・ ターボリナックスとかいっぱいあるけど使った事無い・・・ 富士通のは、既に使った事があります。何度も。 VStudioと比べたら凄まじく使い難いけど、ウィンドウを調整したら行けそうです。 それにアカデミックで安いし。 送料込みで25k円弱・・・・うーむ。 インテルって英語版ばっかし・・・・?うわ。英語勉強しなきゃ。まあ単語覚えたら終わりですけど・・・
富士通のコンパイラ、90日間経ったらOSごと再インストールしなおせばまた使えるようになるんじゃない?
>>102 ところで、どんな授業でFortran90を使うんですか?
これから先、自分の研究なりで確実にFortranを使っていく必要があるなら
自宅にもFortranが使える環境があるに越したことはないけど、
「計算機基礎」とかプログラミングの基礎的な講義で使うだけなら、わざわざ
高い製品版を買ったり、新たにOS入れたりする必要はないと思いますよ。
#このスレでこんなことを言うのもナンですが
WindowsでもC/C++やPascalならフリーの処理系がたくさんあるから
これらで勉強すればFortran90でのプログラミングも理解できると思います。
Fortran90なら基本的なことはCやPascalとあまり変わりませんから。
>>124 いけるんですかね・・・・・?OSごと・・・・・
>>125 情報系の演習です。
ですが、将来、目指す研究室(物理系)で使う予定です。入れたら、の話だけど・・・・
CはVSで頑張ってます。
>>127 CD-Rドライブ持っていませんがなにか。
買いなさい。
>>128 最近は大学の計算機でも CD 焼けます.
VisualFortranで電力計算センターの作画ライブラリCalcPS使いたいんですけどうまく使えません。 リンクも設定してるんですけどなんででしょう。ビルドエラー出ちゃうんですよねえ。
>>131 ビルドエラーの内容を示さない時点でネタと見倣されました.
133 :
デフォルトの名無しさん :03/12/15 16:45
Intel Visual Fortran Compiler 8.0 for Windows ってAMDのプロセッサでも動く?
134 :
デフォルトの名無しさん :03/12/16 00:56
>>133 動く。
しばらく前のAthlon搭載PCで、SSEを有効してコンパイルしたらしっかり動いた。
ベクトル化も可能。
>>134 ありがとう。
コンパックだった頃は必要動作環境が、PC/AT互換機ってなってたのが、
インテルになってから、PentiumあるいはXEONってなってたんで心配だったよ。
136 :
デフォルトの名無しさん :03/12/16 23:16
学校名さらしてんじゃねえよ。常識を考えろ。
138 :
デフォルトの名無しさん :03/12/16 23:27
139 :
デフォルトの名無しさん :03/12/18 00:31
FORTRANでいい本ありますか? 初心者です。F90を習いたいです。
140 :
デフォルトの名無しさん :03/12/19 20:40
ポン大かよ・・・
141 :
デフォルトの名無しさん :03/12/19 22:44
>>139 私の知る限り、
>>4 の冨田博之著「Forrtran90プログラミング」(培風館)か
定番(?)戸川隼人先生の「ザ・Fortran 90/95」(サイエンス社)ですかね。
それにしてもFortran90/95の日本語書籍は少ないですね。
一般書店ではFORTRAN関係の本も見かけなくなっちゃったし。
>>136 宿題は自分でやってこそ意味のあるものです。
また来年もがんばってね♪
FORTRANって一般的に何をする言語ですか? 土木屋がよく使ってると聞いたのですが…
数値計算
なるほど…解析とかに使うんですね。 C++ではできないんですか?
ん?禁句とは?できないんですか? すいません。初心者なので。 これから、言語を学ぼうかと思っているんですが、 有限要素法などの解析をやりたいんですけどどちら (C++とFORTRAN)が良いでしょうか?
143 名前:デフォルトの名無しさん[sage] 投稿日:03/12/19 23:07 数値計算 144 名前:初心者[] 投稿日:03/12/19 23:13 なるほど…解析とかに使うんですね。 C++ではできないんですか? 一人上手!
148 :
デフォルトの名無しさん :03/12/20 00:02
148
ありがとうございます。まさに今私が求めているような
答えがありそうです。
>>143 わざわざありがとうございました。
知名度ってのは恐しいものだね >>C++
g95 はどのくらい使えるんでしょう? ちゃんと配列の,要素ごとの足し算ができました. intel のは大きくて使いづらいので,普段は g95 で逝きたいのです. 配列まわりの文には似たような書き方がたくさんありますね. なるべく f77 と f95 でコンパチブルにしたいので,困ったものです.
なぜ、SUN でf77では keta=5 write(text,'(i<keta>)') num ができるのに、 f90ではできんのだ〜。・・・つかわなくて済ますことを考えるか・・・
>>141 ありがとうございます。
ザの方をゲットしました。
155 :
デフォルトの名無しさん :03/12/23 06:24
あーーーー、眠い シミュレーション用にFORTRANでプログラム組んだ人は、 どの程度の行数書きますか〜? あーーーー、分子動力学計算の時は3千行程度で済んだのに... ただいま、13K突破(禿鬱
>>155 眠いところすみません.
1 つのファイルが 13k (行ですよね) にもなってしまうことがあるんですか?
実際にカッコいいシミュレーションプログラムを
組んだことが無いので知らないんです...
FORTRAN では長いプログラムを回避できないのでしょうか?
>>156 合計 13k だろ...。
分割コンパイルくらいできるわ。
>>148 別に FORTRAN の関数を C++ から呼ぶことくらい
いくらでもできるんだがな...。
富士通のコンパイラ買っちった・・・・ で、届いた。
学校で富士通のコンパイラ使ってるけど使いやすいよ。 コンパイルログが細かいし日本語だからデバックしやすい。
>>161 > 日本語だからデバックしやすい。
なんとなく悔しい.
>>160 それなりに使える。
ってか慣れかなぁ・・・・・
visualと比べると、かなり劣る。操作性とか。
166 :
デフォルトの名無しさん :03/12/26 23:16
Fortran90は大文字と小文字を区別しますか? また、キーワードは、大文字限定ですか?
167 :
デフォルトの名無しさん :03/12/27 02:54
>161 デバッ「ク」??
>>168 まぁまぁ.だから日本語じゃないと困ってしまうわけでしょう.
170 :
デフォルトの名無しさん :03/12/28 02:12
Fortranを始めたいのですが、Fortranのプログラムを書くためのソフトってどこ に売ってるのですか?また、何て名前のソフトを買えばいいのですか?値段とか分かる ようでしたら、それも教えて下さい。お願い致します。
独学でFortranを始めたいと思っています。宜しければ、プログラムソフト(フリーの物が あればそれも教えて下さい)と参考にする本を教えて下さい
>>172 ,173
早速教えて頂きありがとうございます。ですが
実際にダウンロードしてみて、ホームページに指定されてた通り
WRITE(*,*) 'TEST'
END
と左から6文字開けて試しに打ってみたのですが、 test と表示されません。
代わりに 「ディレクトリは存在しません」というエラー表示がでてしまいます。
どこが、いけないのでしょうか?もし、宜しければ教えて頂けないでしょうか?
>>175 タビタビ申し訳ありません。 ご説明通りしてはいるのですが、
『コンパイルできません』とのエラーが出てしまいます。なぜでしょうか?
>>175 あっ、すみません、上手くいきました。
教えて下さった皆様どうもありがとうございました。
また、分からない時はどうぞ宜しくお願い致しますm(−−)m
・・・
土木屋はFORTRANオンリーユー。
完全に初心者なら、本買え
>>180 プログラミング初心者なら,FORTRAN から始めるのが適切かどうかから
考えた方がいいんじゃない?
このスレ推薦の「Fortran90プログラミング」は,
初めてプログラミングする人も対象になっていますか >持っている人
うかつにも変な本を買っちゃって,しかもそれで勉強しようと躍起になると
後遺症がひどくなるからね.
182 :
デフォルトの名無しさん :03/12/30 20:57
>>181 Fortran自体、簡単な言語だと思うが・・・
>>182 でも,同じことをするのに方法がたくさんあるなぁと.perl みたいに.
うーん、Fortranを勉強しようっていってるだけで、 他の言語知識が全く無いとは、まだわからないわけであり。 170がもうちょっと話しないと。 それとも別スレに行っちゃったかな? ザ・フォートランの方が易しいと思うぞ。うん。 CASL2勉強してたら、Cやfortranのありがたみが身にしみる・・・ 割り算するのがすっげえめんどくさい・・・・ あ、上のほうで、富士通買った者です。 総合的には使い易いっす。 あえて不満を述べるならば、 エディタ画面に「実行」のショートカットが欲しいのと、 作ったソースの拡張子を、オートで.F90にしてくれない所かな。 WRITEやREADなどを色分けして欲しいなぁ・・・・・
186 :
デフォルトの名無しさん :03/12/31 02:27
>>181 残念ながら、FORTRANの和書に自信をもってお勧めできるものは無い。
他のメジャーな言語なら、初心者・中級者・上級者用と品揃えも豊富だけど、
化石と言われる言語だけあって、ろくに揃っていない。
大型書店でも、初心者用しか揃えていないのが実情だ。
また、このスレ推薦の書籍も、FORTRAN90の機能を全て網羅している訳ではないので、
FORTRAN90らしいmoduleの使い方を覚えられるとは思えないよ。
F90系の書籍は、どれも基本の文法書って感じ。
>うかつにも変な本を買っちゃって,しかもそれで勉強しようと躍起になると
>後遺症がひどくなるからね.
多少わかりにくい書き方でも、それを読み解く能力は必要だと思うぞ。
多かれ少なかれ、誤植や著者の誤認識はあるしな。
>>188 Larry Nyhoff / Sanford Leestma 「入門 Fortran90」
> 「情報処理技術者試験」のプログラミングの選択科目にあるように、
> 科学技術計算用のプログラミング言語として、まだまだ需要は衰
> えておりません。
読んだことないので内容はどうか知らないが、この紹介文見てると
ちょっと躊躇するなぁ。
最近fortran90/95でコード書いてみたりしてるんだけど、 いわゆる中・上級者用のおすすめ書籍とかあるんでしょうか? 洋書で無問題です。 メモリストライドを工夫した高速化とかの基本的なことは知ってるんだけど、 fortranならではって奴は全然知らないもので。
193 :
デフォルトの名無しさん :03/12/31 22:56
194 :
デフォルトの名無しさん :03/12/31 22:58
Fortran.netをはじめたのですが、資料がほとんどありません。 いい本がなにかありませんか?
>>196 多分そうですね。原著で買ってしまうのも手だなぁ。
>>197 すいませんでした。検索してたときはてっきりソース乗せてるだけだと思ってた(汗
ありがとうございます。
・・・・・・・ちょっとしか読めない・・・・・クソ 太平洋戦争で日本が勝ってたら、世界の標準語がじゃぱにーずだったのに・・・・・!
詳説FORTRAN90、この前YahooAuctionに出てたよ。
僕、間違えてましたね。すみません。詳細でなくて、詳解。 Numerical Recipes、手元にあったんで、ぱらぱらみてみた。 アンダスコア で 実数の種類指定できるの知らんかった。 ちょっと勉強になった。3へぇくらい。 PROGRAM TEST IMPLICIT NONE INTEGER,PARAMETER :: SP=4,DP=8 REAL(DP) :: x1,x2,x3 REAL(SP) :: y1,y2,y3 !! 倍精度 ; 単精度 ; 単精度 x1=1.e-2_DP ; x2=1.e-2_SP ; x3=1.e-2 y1=1.e-2_DP ; y2=1.e-2_SP ; y3=1.e-2 WRITE(*,'(1P3E)') x1,x2,x3 WRITE(*,'(1P3E)') y1,y2,y3 WRITE(*,'(1P3F)') y1,y2,y3 STOP END PROGRAM TEST ファイル出力の書式設定で F型 に Pで位どりするときだけ 値が変わるのすっかり忘れてた。いや、もともと知らんかったのか。 うっかりどこかで使ってるかも。怖いよう〜。
家にあるFORTRANの本何冊あるか数えてみました・・・12冊・・・ 会社に確か4冊ぐらいあったから、合計16冊か。 本屋にある本ほとんど買ってしまったからねえ。 古い本だとパンチカードの解説から始まります。 みんなそろってサンプルプログラムはタコ。GO TO文使いまくり・・・
ふぉーとらんらんらん
シェイプアップフォートラン
__,,,,,, ,.-'''"-─ `ー,--─'''''''''''i-、,, ,.-,/ /::::::::::::::::::::::!,, \ ( i:::::::::::::::::::::;ノ ヽ-、,,/''ー'''"7 `''| |:::::::::::::::::::::} ``ー''" ! '、:::::::::::::::::::i '、 `-=''''フ'ー''ヽ、::::::::::/ヽ、-─-、,,-'''ヽ \_/ ヽ--く _,,,..--┴-、 ヽ ``" \>
207 :
デフォルトの名無しさん :04/01/04 22:46
だれか、go to , common , if(a)100,110,100 とかで、わけわからんソースの効率的な読解法 教えてくれ、もう限界だ…(ToT
208 :
デフォルトの名無しさん :04/01/04 23:51
4*4 行列の逆行列の求め方がわからん。鬱
>208 小行列式をといて、余因子をもとめれば(ここまでならサラスの方法でできる) 4*4行列式もすぐに解けると思うんですけど。
210 :
デフォルトの名無しさん :04/01/05 00:24
>>209 手計算は分かるんですけど、それをどうプログラムするか分からないんですよ。
数値計算の宿題が急に出されて。
プログラミング初心者です。すみません。
211 :
デフォルトの名無しさん :04/01/05 01:07
学生なら線形代数の教科書嫁 .or. ぐぐれ
212 :
デフォルトの名無しさん :04/01/05 02:43
>208 逆行列の求め方 余因子展開をプログラムで組むのが難しいなら、 掃きだし法と同じ操作を単位行列に対しても行う のが一番簡単。 原理は簡単 逆行列というのは掃きだし法の操作をすべて掛け合わせてできる行列だから。 ただし、ある程度の精度を出したいなら対角要素にはなるべく大きな値を 持ってくるように行列の入れ替えなどを考慮する。
寝れない。
>>210 それほど難しくない。どっか適当なfortranホムペを一通り真剣に読んできなされ。 私もそうやって勉強したfortran。
改行入ってない(´д`;;) 寝よ…
A B 1 0 … (1) C D 0 1 … (2) ↓ 1 E F 0 … (1)' = (1) / A 0 G H 1 … (2)' = (2) - (1)' * C ↓ 1 E F 0 0 1 I J … (2)'' = (2)' / G ↓ 1 0 K L … (1)'' = (1)' - (2)'' * E 0 1 I J (A B) -1 (K L) (C D) = (I J)
216 :
デフォルトの名無しさん :04/01/05 08:03
Visual Fortran 5.0 で、配列はどれくらいまで取れますか? メモリーは256MBです
余因子展開は,実際に逆行列を求めるときには使わないと思っていました. 意外と使われるんですね.LU やら掃き出し法が主流かと思っていました.
218 :
デフォルトの名無しさん :04/01/05 10:34
>>208 逆行列をFortranでできますよ
だけど、逆行列が忘れてしまいました
詳しく教えてくれれば、逆行列のサンプルプロ考えます
助詞を変だな。
少し本を読んでわかりました。すこしずつプログラム書いてます。ありがとうございます
223 :
デフォルトの名無しさん :04/01/06 04:53
あのお・・・ Visual Fortran 5.0 で、配列はどれくらいまで取れますか? メモリーは256MBです
224 :
デフォルトの名無しさん :04/01/06 06:12
>>223 自分で実際にテストしてみればすぐわかる。
>>223 配列の型による
配列の確保が動的か静的かによる
コードによってはコンパイルオプションによる
仮想メモリの設定による
配列が大きくなるとスワッピングが激しくなるので,
>>223 の忍耐力にもよる
OpenMPを使って、研究室で今まで使ってきたコードを並列化してるんですが、 速くならないとか言う以前にNaNNaN攻撃をくらいます。 !$omp do parallel してるループ内で関数を呼んでるんですが、やっぱこの辺が悪さをしてるんでしょうか…。 で、とりあえずOpenMPでぐぐったんですが出てくるサンプルは単純なものばかり。 どこかに実際にOpenMPを使って配列したコードを公開してたり、実践的な情報を集めたりしてるページを ご存じないでしょうか?
>>226 どんな関数を呼んでるの?
詳しく教えてplz
>>227-228 うおっ!まさに228さんのリンク先に書いてあるような関数を呼び出してました!さっそくじっくり見てみます。
情報ありがとうございました。
230 :
デフォルトの名無しさん :04/01/13 17:49
変数に格納されたものがNaN or INFか、否かの判定はどうればいいのですか?
う〜ん・・・
232 :
デフォルトの名無しさん :04/01/13 23:38
>230 処理系の拡張機能に頼る。 VF だと ISNAN(x) つうのがあるね。
>>232 > 処理系の拡張機能に頼る。
> VF だと ISNAN(x) つうのがあるね。
うわ、isnan()ってVF依存だったんですね。Intel Compilerでも使えてるけど、それは単にportlib使うように
してるから動いてただけか…。
>NaN (Not-a-Number)---数でないものを表すIEEE浮動小数点ビット・パターン。 >DIGITAL Fortran 90は、NaN値を出力ステートメントでは「NaN」で識別します。 >NaNは、signaling NaNまたはquiet NaNにすることができます。 >・quiet NaNは、0./0のような計算の結果として発生し、すべてが1の指数部と最初の仮数ビットが1を持ちます。 >・signaling NaNは、意図的に設定する必要があり(計算の結果ではなく)、すべてが1の指数部と最初の仮数ビットが0で、1つ以上の仮数ビットが1となります。
f(x,y)=exp((x-a)**2+(y-b)**2)において、a,bに任意の値を入力して f(x,y)が最小となるx,yを求めるプログラムの課題を出されたのですが、 全く分かりません。ヒントはニュートン法と数値微分らしいのですが どなたか手順だけでも教えていただけませんか。
>>235 とりあずそのヒントをキーワードにしてググりなさい。
print *,"aとbを入力してぽ" read *,a,b print *,"f(x,y)が最小となるx,yはx=",a,"y=",b,"でふ"
>>230 a=NaNかInfinityとして
if(a/=a)then
write(*,*) "NaNです"
else
b=a*0
if(b/=b) write(*,*) "Infinityです"
end if
とかじゃだめ?
自然数nを代入すればその2,3,4,5,6,7,8,9進数表示を求めるプログラムを教えて 下さい??途中まででもいいんでお願いします。
>>239 ほい。
Objective Caml だけど。
let rec digit n radix =
if(n == 0) then ""
else (digit (n / radix) radix) ^ (string_of_int (n mod radix));;
let rec list_digit n radix last =
if(radix > last) then ""
else (string_of_int radix) ^ ": " ^
(digit n radix) ^ "/ " ^
(list_digit n (radix + 1) last);;
let list2to9_digit n =
list_digit n 2 9;;
≫238 ありがたいんですけど誰かfortranでお願いします。
↑≫239の間違いです
>>239 ほい。
途中までだけど。
PROGRAM HOGE
WRITE(*,*) 'INPUT N:'
READ(*,*) N
DO 100 I=2, 9
CALL NSHIN(I, N)
100 CONTINUE
STOP
END
プログラムの説明簡単に教えて下さい??
>>239 ほい。
LISP だけど。
(defun digit (n radix)
(if (zerop n)
""
(string-concat (digit (floor (/ n radix)) radix)
(write-to-string (mod n radix)) )))
(defun list-digit (n radix last)
(if (> radix last)
""
(string-concat (write-to-string radix) ": "
(digit n radix) "/ "
(list-digit n (1+ radix) last) )))
(defun list-2-9-digit (n)
(list-digit n 2 9))
算数の問題だな。 p 進数の n 桁目をどうやれば求められるか、という。 頭振り絞って考えれ。
≫245さんへ いろいろ詳しいですねぇ!!fortranのプログラムの意味が全く分からない んですけど…。あぁこれができないと留年だぁ。
2^0+2^1+2^3+…2^n乗のようにすれば求められるって分かるんですけど、式 にしろっていわれるとできないんですよね
まず10進数で考えると分かりやすい。
10進数にしたらなおさら分かりにくいような気がするんですけど…
そんなことないって。 得られるべき結果がすぐに分かるから チェックが楽。 先ず、123 から 1 の位を取得してみ。
1の位は3、10の位は2、百の位は1で…。えっと次は…
n = 123 first = ... 1の位を取得するには何を書けばいい?
すいません。分かりません。
全ての整数nについて、手計算!
例えば66の7進数を手計算で求めるにはどうすればよいか。 その手順を細かくノートに書き出してみる。 あとはそれをプログラムに置き換えればいい。 それでも解らなきゃもう一年勉強し直した方が・・・
これでも某国立大学なんですけどねぇ・・・ トホホ
もしかして、mod しらないのかな。
259 :
デフォルトの名無しさん :04/01/17 03:29
どこの大学?
北陸の大学です。まだ1年生なもので・・・
1年で留年とかあるのか。
これは必須の教科なので絶対単位を落としたらダメなんですよねぇ!! っていってもそんな難しい課題じゃないんですけどねぇ…
176 ÷ 10 = 17 ... 6 これ見てピンと来ない?
あぁあぁ。そういうことか!!非常に分かりやすいですねぇ。本当 自分馬鹿だ・・・
本当に難しくないならできるでしょ、 といってみるテスト
でもどうやって他の進数に応用を効かすんですか??
もちーと考えてみ。 適当な数値を紙と鉛筆で実際に変換してみ。
今日はちょっと眠いんで寝て考えます。また掲示板に何か書き込むかも しれないのでヒントをお願いします。ありがとうございました。
とりあえず全部手計算で求めれ。 16 進数:1F 15 進数:21 14 進数:23 13 進数:25 12 進数:27 11 進数:29 10 進数:31 . 9 進数:34 . 8 進数:37 . 7 進数:43 . 6 進数:51 . 5 進数:111 . 4 進数:133 . 3 進数:1011 . 2 進数:11111
>>268 普通に,x を n 進数で表すなら,
割り算の筆算を上下逆に書いて,x を n で割り続ける.
ex. 60(10) を 7 進で.
60/7
8/7 ... 4
1 ... 1
だから下から並べて 114(7) .下に行くほど重いからね.
答えを言ってスマンかった >all
>>245 LISP でやるなら,もっとちゃんと書いてくれないとイメージダウンですw
(defun radix-list (x n)
(labels ((f (x n lst)
(cond ((< x n) (cons x lst))
(t (multiple-value-bind (q r)
(truncate x n)
(f q n (cons r lst)))))))
(f x n '())))
(radix-list 60 7) ===> (1 1 4)
めんどっちくて末尾再帰にしなかったのと、 文字列にしたかったんだぁよ。 あと、truncate は知らなかった。
273 :
デフォルトの名無しさん :04/01/17 16:16
>>239 ほい。
Visual Basic だけど。
Option Explicit
Private Sub Command1_Click()
Dim n As Long
Dim w As Long
Dim i As Long
Dim strn As String
n = Val(Text1.Text)
Text2.Text = ""
For i = 2 To 9
w = n
strn = ""
Do While w > 0
strn = CStr(w Mod i) & strn
w = w \ i
Loop
Text2.Text = Text2.Text & vbCrLf & CStr(i) & ": " & strn
Next i
End Sub
>>273 VBで、
> Option Explicit
ってのはFortranで言うところの
implicit none
と同じでしたっけ?
>>239 ,241,247,248,252,254,257,260,262,264,266,268 さんは
まだ寝てるのかな?明日提出かもね.
まあ lisp でやれば先生も分かってくれるって (w
ところで,Fortran や C では
先に n 進数で何桁になるか計算して,アロケートしないとなりませんよね?
>>275 FORTRAN は知りませんが、C では「ノー」です。
>>276 再帰にしたところで,どこに格納すれば良いのでしょうか.
出力に書き出すのは無しです.
ところで,末尾再帰をループに直すように仕様に定めないのはなぜですか?
278 :
デフォルトの名無しさん :04/01/18 15:50
integer型の範囲がわかってるなら、結果の桁数もわかるじゃん
>>278 あ,なるほど.でもちょっと計算機を意識しすぎというか,何というか.
>>279 動的アロケート無しにスタックを使う,良い例をお示しください m(__)m
in Fortran.
面白い Fortran スレになってきましたね.
281 :
デフォルトの名無しさん :04/01/18 16:27
recursive subroutine print_shinsu( num, base ) integer, intent(in) :: num, base integer :: m if ( num == 0 ) return m = mod( num, base ) call print_shinsu( int( num / base ), base ) write(*,'(i1)') m return end subroutine
失敬 >write(*,'(i1)') m write(*,'(i1)', advance='no') m だわ
fortran 77 compiler (Watcom)が無償配布されたよー
>>280 > in Fortran.
>>276 >FORTRAN は知りませんが
日本語も理解できないのか...。
>>281 出力吐き出しちゃってる(⊃д`)
>>284 誰が書いてもいいではないですか.Fortran スレなんですから.
誰が書いてもいいけど、話の流れぐらい読んでからにしてくれ。
>275 >あ,なるほど.でもちょっと計算機を意識しすぎというか,何というか. それを持ち出すなら、当然、入力された数字列に合わせて、 自然数(n)を格納するメモリ領域を決定する訳だ。 入力した数字(桁数無制限)を、1文字ずつ配列に格納して。。。
Fortran -> Fortran90 以降 FORTRAN -> FORTRAN77 以前
上の90のプログラムの完成系はどんなんですか?
>>289 programでprint_shinsu()を呼ぶだけ
>>290 何度もすいません
print_shinsu()の呼び方を教えてください。
はあ?
次は 「別の××の○○が□□してしまいます.」 と言うのかな.
>>287 > 入力した数字(桁数無制限)を、1文字ずつ配列に格納して。。。
う,,,でもほら,
2 進では 10 進で小さい数でも桁が多くなってしまうではないですか.
と思ったりしましたが,大きさ 64 の配列で十分そうですね...
高速化の妨げになるから動的アロケートを避けるというのが本当なら,
割と仮定が多いプログラムになってしまうのでは,と思っているのですが,
何でも動的アロケートに訴えるのは病気ということでしょうか.
>>295 例えば int を変換する場合、
INT_MAX が 2 進で何桁になるかが分かってれば、
最低でもそれが格納できるだけのサイズのバッファがあれば十分。
これは常に正しく動くという意味で、仮定でもなんでもない。
無駄になる領域はあるかもしれないけど。
動的にアロケートした場合も
16-byte 境界(環境依存)に合わされたりして
若干無駄になる領域はあるけど、
固定長の時よりはまし。
同じinteger型でも、多くの処理系ではinteger(16)=128bitまでだから、 2進数を格納する文字列の長さが128あれば十分。 >ヒープ領域の動的確保 使用する事が問題なんじゃなくて、大きな領域を何度も確保&解放する事が問題なの。 特に数値計算の場合、1ステップに1回だけ動的配列の領域確保&解放をするだけでも、 数十万回も呼ばなければならない事が多々ある。 確保する領域が大きな場合、メモリ使用量がえらい事になる。 一般にdeallocate()によってコード上は解放された領域でも、すぐOS側に返される訳じゃない。 動的配列の確保&解放にともなうオーバーヘッドが気になるなら、動的配列に静的属性をつけて、 可変長の文字列読み込み処理のように、領域を確保&解放する回数をなるべく減らすようにすれば良し。 ただ、何でもかんでもこの方法をとるのは間違い。 ケースバイケースで、「計算機を意識した」処理を汁! (例) subroutine sub( n ) integer, intent(in) :: n integer, :: alloc_sz = 16 integer, save :: sz_array = 0 integer, dimension(:,:), allocatable, save :: array if ( n > sz_array ) then if ( allocated( array ) ) deallocate( array ) sz_array = n + alloc_sz allocate( array( sz_array, sz_array ) ) endif ... end subroutine
流れを遮って申し訳ないないです。 Fortranで多倍長演算をしたいのですが どのライブラリを使ったら良いでしょうか? GNU のMultiple Precisionは、Fortranから使うには不向きなようでして… ご助言いただけると助かります
倍精度や四倍精度だったら プログラム中の変数やパラメータの値を real(16) : : aとか1.0d0みたいに置き換えてあげればいいだけだと思うけど・・・ コンパイラによるのかな??
≫275 返事遅れました。10進数をn進数にするプログラムの話ですが。数学的には求める ことができたのですがプログラムで書くとなると余りの部分をどうやって抽出して書けばいいの か分からないんですけどどうすればいいでしょうか??できればBASICとFORTRANで 説明していただくとありがたいです。馬鹿な質問ばかりしてすいません。…
fortran77でSSF法を書きたい板で書いた者です。
本スレは削除依頼を出してきたので、こちらで質問したいと思います。
FFT(高速フーリエ変換)を使ったスプリットステップフーリエ法を
どうかご教授お願いいたします。
Cのソースはあるのですが
http://photonics.ece.umd.edu/software/ fortran77で記述できなくて困っています
どうかよろしくお願いいたしますm(_ _)m
>>299 記述が正確ではなかった様ですみませんでした。
コンパイラはCygwin 上のgcc(F77)を使っていまして
多倍長整数の演算が主な目的です。
F90が必要であればIntelの評価版を試すつもりではいます。
再度ご助言頂けると大変助かります。
>>303 リンクありがとうございますm(_ _)m
CとFortranの文法比較ができないっていうのと
SSFMが分からないのと半分半分です・・
fortranもCも初心者なもので・・・
Fortran2000(?)は95に比べてどの辺が新しくなってるんですか? というか2000の規格はもう正式に決まったの?
Fortran2000の仕様(ISO/IEC Technical Report)を一部先取りしています。
307 :
デフォルトの名無しさん :04/02/04 20:45
機械工学専攻なんですが、FortranとC++どちらかとらないといけないんですが、 どっちをお勧めしますか?
308 :
デフォルトの名無しさん :04/02/04 20:47
C++覚えれば、Fortranを覚えるのはすぐできると思うから、 ここは難しいほうのC++で・・・。
>>308 C++の前にCをとるのですが、Cも難しいですか?
プログラミングの知識ゼロなんで、なにがどうなのかC++って何をするため
とか全くわからないんです。。
将来的にはFortranとC++ではどちらが役にたちますか?
310 :
デフォルトの名無しさん :04/02/04 21:12
Cは別に難しくないよ。(というと語弊があるかもしれんが) 入門書も氾濫してるし、応用も利きくから、 初めての言語としてはいい選択かと。 >将来的にはFortranとC++ではどちらが役にたちますか? 気にするな。みんなFortranの子孫だw
Fortran。FORTRANはだめだぞよ。
312 :
fortranran :04/02/05 03:55
どなたかCVF6.6からIVF8.0に移行して いろいろ試している人いる? なんか実行速度おそいんだよねぇ PEN4(HT)だから期待してたのに・・・ 最適化レベルを上げようとすると、CVFの時は出なかった エラーが出てLEVEL2どまりです。 まっ会社のお金でかったんだからいいけど
>>309 > C++の前にCをとるのですが、Cも難しいですか?
結局先に C をやるのね.
すぐ数値計算に使うなら Fortran かと思いますが,
たぶん,数値計算するときにはまた覚え直すことになると思うので,
C++ が良いでしょう.
C は計算機の一般的な知識が無いと使いにくいんですが,
C++ は知らなくても良いように高級になっているんです.
とっても計算量が多いプログラムでは,C++ より C が使われるんだそうです.
そうでないものには,ほとんど C++ なんだそうです.y
むしろ,CとC++のちゃんぽんだな
>>312 移行しました。
全く使いこなせてません。
全然最適化されてる気がしません。
ソースレベルで自ら最適化しないといけないのでしょうか。
>>315 IVF8.0はVS6でもイけますか?
それとも.NETおんりー?
Microsoft Visual C++ .NET 2002/2003 スタンダード版かそれ以上がないと使えません。 はっきり言って面倒くさいです。 C++のインストールにすごい時間かかりますし。 上にも書いたように全然使いこなせてないので、.NETがどれだけすごいのかも分かりません。 結局DOS窓からコンパイルしてます。
319 :
デフォルトの名無しさん :04/02/12 08:18
質問ですっ フリーコンパイラ Salford FTN77 Personal Edition Compiler をアンインストするにはどうすればいいのでしょうか? 宜しければ教えてください<(_ _)>
>>319 釣られてみる
[スタート]→[設定(S)]→[コントロール パネル(C)]→[プログラムの追加と削除]
>>319 m9(´∀`)アハハ八八ノヽノヽノヽノ \ / \/ \
一度見たときに無いような気がしてただけで、よく見たらありました; アリガトございました & スイマセンでしたっ><
一度見たときに無いような気がしてただけで、よく見たらありました; アリガトございました & スイマセンでしたっ><
_no
325 :
デフォルトの名無しさん :04/02/13 22:53
最近CPad for Salford FTN77を使い始めたのですが、 メインプログラム、サブルーチンごとにfファイルが分かれている 場合、どのようにコンパイルしたらよいのでしょうか?市販の コンパイラーだとメイクファイルを自動生成できるのですが、 手書きの場合、書き方がわからないのです。 たとえばkota1.f(メインファイル)kota2.f, kota3.f(それぞれサブルーチン)のファイルを 実行するためにはどのような手順を踏めば良いですか? どなたかアドバイスをお願いします。
>>325 FTN77 User's Guide 265ページ 「21. Using MK and MK32」
リンク中・・・
リンク中...
329 :
デフォルトの名無しさん :04/02/15 15:27
どなたか教えてください。 会社の上司からfortranを勉強するようにと 昔のソースコードをもらいました。 その一部に IF ( CHAR(MS) .EQ. 1HS .OR. - CHAR(MS) .EQ. 1HM ) GO TO 1 IF ( CHAR(LCML) .NE. 1H ) のようなソースがあります。 intel visual fortran8.0 の無料体験版を使っているのですが、 上のソースの1HS 1HM 1Hという定数??のところでエラーに なってしまいます。この1HS 1HM 1Hって何の記号なのでしょうか? fortran90ではどのように書けばよいのでしょうか? どなたかアドバイスをお願いいたします。(..)
330 :
デフォルトの名無しさん :04/02/15 18:29
>>329 「ホレリス定数」でぐぐれ。
1HS, 1HM, 1H --> 'S', 'M', ' ' (または "S", "M", " ")
最後の奴はHの後ろにスペースかタブがあるのだろう。
IVFってホレリス定数が使えないの?
IVFのonline helpにはHollerith Constantsは載ってるから使えるっぽいけど. 内容はCVFのhelpと同じこと書いてた.
なんでびじゅある何たらどっとネットが必要なのさintel visual fortran
334 :
デフォルトの名無しさん :04/02/24 21:11
fortranで、400000*400000位、巨大な配列を 扱うには、どうしたら良いのか教えてください ませんでしょうか。
そのサイズはさすがに並列計算すべきかねぇ。
400000*400000 〜 150G 1 つ 8 バイト(倍精度浮動小数)としたら 約 1.2TB にもなるな。
生半可な並列じゃだめポ…
ハードディスクを使わないときつそうね。
>>334 は,4e5 x 4e5 の行列を何に使いたいの?
疎な行列の逆を求めたいとかその類じゃないの?
それにはそれのアルゴリズムがある.
見くびってたらスマソ.でも説明不足は否めない.
生半可なハードディスクじゃだめポ…
341 :
デフォルトの名無しさん :04/02/25 13:11
説明不足ですね。申し訳ありませんでした。 4e5*4e5について逆行列を求めたいのです。 確かにアルゴリズムもあることはあるので あとは、メモリの問題なんですね。皆さま ありがとうございました。
数値計算を舐めすぎ!
343 :
デフォルトの名無しさん :04/02/26 00:58
>>341 なんにもわかってないのにわかったつもりなのは痛いぞ。
ランチョス法だっけ?
地球シミュレータを使うのかな? あれFortranできるし
Lahey Fujitsu Fortran では正常に動くのに、 Compaq Visual Fortran じゃー実行エラーになるんだろう? アドバイスお願いします。 ちなみに、こんな実行エラーです。 forrtl: severe (157): Program Exception - access violation Image PC Routine Line Source sp.exe 0040958A Unknown Unknown Unknown sp.exe 00402226 Unknown Unknown Unknown sp.exe 0040167C Unknown Unknown Unknown sp.exe 0044D9E9 Unknown Unknown Unknown sp.exe 0043ED84 Unknown Unknown Unknown kernel32.dll 77E414C7 Unknown Unknown Unknown
>>346 Lahey Fortran でも -chk オプションを付ければ実行時エラーになる
に一票。
346さん この問題、漏れも興味あり。 Compaq Visual Fortranでの解決策はどうなんだべ?
access violation! access violation! access violation! access violation! access violation!
>>348 > Compaq Visual Fortranでの解決策
/check /traceback で再コンパイル
↓
プログラムを走らせてエラーメッセージから問題を起こしている箇所を特定
↓
ソースを修正
Lahey Fujitsu Fortran では不正常に動いているに一票
access violation! access violation! access violation! access violation! access violation!
access violet No.1〜♪
stack fault?
355 :
デフォルトの名無しさん :04/03/07 22:42
>351 に一票
356 :
デフォルトの名無しさん :04/03/08 23:32
FORTRANでシステムコマンドを実行できるのでしょうか?
357 :
デフォルトの名無しさん :04/03/09 00:19
356> 処理系依存の関数が用意されているかと CVF: SYSTEM, SYSTEMQQ, RUNQQ
358 :
デフォルトの名無しさん :04/03/09 01:09
Intel Fortran ってどうよ?
>>359 ただで90使えるから以前使ってたけど、可無く不可無くってところ
今absoft使ってるけど、比べると速度が70%くらいだった
フリーにしては十分かなー
361 :
デフォルトの名無しさん :04/03/14 19:16
WinXP で Lahey/Fujitsu Fortran 95 Express を使っているのですが この処理系では書式付きで画面に出力すると最初の1文字目が 行送り制御文字にされてしまいます。 これだけで使う分にはこれで良いのですが、他の環境からソースを 持ってきた時に表示がおかしくなってしまいます。 書式を使ったときに1文字目も普通の文字として表示させる方法は ないでしょうか?
362 :
デフォルトの名無しさん :04/03/16 08:41
初心者です。 MacでFortranやりたいんですけど、 お勧めのソフト教えてください。 出来れば値段の高くないやつ・・・
363 :
デフォルトの名無しさん :04/03/18 00:56
>>361 Compaq Fortran 6.6 では コンパイラオプションで
/ccdefault:none を指定するか、
OPEN文で、CARRIAGECONTROL = 'NONE' と指定(当然処理系依存機能)
することによって復帰制御を無効にできる。
Fujitsu Fortranは持ってないのでスマソ
>>362 FORTRAN77 なら GCC を使えばいいよ。タダだし。
最初から入ってる GCC には g77 は含まれてなかった気がするので、
自分でインストールする必要があると思うけど。
>>366 > IBMのFortranは新作だし結構安いと思えるが...
20万で?確かUSでは1000$しなかった気が。
CPad for Salford FTN77 でプログラムを組んでるんですけど, write文で表示されるテキストをカラー表示することはできないんでしょうか??
だからcommonやめろて
370 :
デフォルトの名無しさん :04/04/02 13:56
大学のゼミでFORTRANを使用する事になりました。 PCは今使ってるXP(Visual Studio .NETがインスト済)と サーバが組んであるRed Hat Linux 9.0がインストしてあるのを 持っています。 自宅でもFORTRANを使えるようにしたいのですが 何を入れるのが一番簡単に使える環境に出来るのでしょうか? 出来ればFORTRAN77形式で書いても動く環境がほしいです。 初心者なのでどなたかアドバイスをお願いします。
>>370 > PCは今使ってるXP(Visual Studio .NETがインスト済)と
> サーバが組んであるRed Hat Linux 9.0がインストしてあるのを
> 持っています。
> 自宅でもFORTRANを使えるようにしたいのですが
> 何を入れるのが一番簡単に使える環境に出来るのでしょうか?
自宅のPCがWindowsXPであればCygwinをイントールすれば使えるよ.
一番簡単かどうかは知らない.
>>371 Cygwinはインストしたんだけど
その後が何をすればいいかが;;;
g77とかのインスト方法が今一分からないです;
RHL ならすぐ入るんじゃないすか > g77
77イラネ
>>370 f90を使うなら素直にRedhatにintel fortranの非サポート版をいれとけ
f77も当然サポートしている
RHLのPCの方に intel-ifort8-8.0-40.i386.rpmをインストしました。 これでOKなのかな?
379 :
デフォルトの名無しさん :04/04/06 00:53
>>361 で質問した者ですが、一応自己解決しました。
というかLaheyから新バージョン(v7.1)リリースの通知が来まして
それによるとこのバージョンから新しく追加されたスイッチ
-nconcc を使うとコンソールでの行送り制御を抑制できるようです。
試しに体験版をダウンロードして使ってみたところ、
見事に他の処理系と同じように表示することが出来ました。
要するに表示を他と合わせたかったらバージョンアップしろ
ということらしいです。
まあ、新バージョンはSSE2命令を使った最適化にも対応してるし
そろそろバージョンアップしてもらおうかなぁ・・・
,.-‐''^^'''‐- ..., ; ' ' , .;' uvnuvnuvn ; ; j i ; .,, ノ ,.==- =; ( r| j. ーo 、 ,..of ': ヽT  ̄ i  ̄} 救出費用の45億円(税金)?俺は払わないっつーの( ゚,_ゝ゚)プッ ': . i ! .r _ j / '; | \ 'ー-=ゝ/ 人、 \  ̄ノ -‐  ̄ ' ーイ ̄ー-- 、 ヽ | ;' ヽ
381 :
デフォルトの名無しさん :04/04/19 21:48
Intel Visual Fortran Compiler V8を購入しました。 VC++無しでも,コンパイルできるとの事でしたが, エラーでVC++が必要だと言われてしまいます。 (ifort main.f) main.fをコンパイルしてmain.exeを作成したいだけですが, やはり,VC++が必要なのでしょうか? よろしくお願いします。
Fortranなんか使うのヤメりゃいい。
フォルトラーノ
ヤ〜〜ホ〜〜
フォーート
ラン!ラン!ラン!
388 :
デフォルトの名無しさん :04/04/30 01:29
ヤッホ
Fortranranran
谷保?
fort.777
Yahoo!
>>381 コンパイルできても、リンクできないから実行ファイルできんよ
仕事をFORTRAN使うことになった。 プログラムは基礎はある程度解るが、数学がサッパリ解らん。 どっか中学生レベルの数学を解り易く解説してるサイトないかな。
395 :
デフォルトの名無しさん :04/05/02 19:04
人様のFortran77で書かれているコードを読むハメになったんですが、 インデントがぐちゃぐちゃだったりするんです。でも、vimとかemacs の整形コマンド使っても do 10 i=1,100 do 10 j=1,100 .... 10 continue みたいな do 数字 連発 & 数字 continue で一発抜け、みたいなコードが 思うように整形されないんですよね。 皆さんはどんなエディタもしくは整形ツールを使っていらっしゃいますか? なにか良い知恵がありましたら教えて下さい m(_ _)m。 ちなみにできればUnix系で動く環境がいいです。
>>394 数学ってあなた・・
そのコードは何の計算してるコードよ?
FortranIV3.40GHz
>>395 Real programmer don't use indent. (嘘)というのはおいといて、
その場合だと emacs の fortran mode とかで、do 10 i=1,100 と
do 10 j=1,100 の 2 行を無理矢理同じレベルにして先に進むしか
ないような気がしますね。切ないとこだな。
399 :
デフォルトの名無しさん :04/05/07 22:28
Fortranで数値計算しようと思っているのですが、計算専用ののライブラリを用いれば速くなると聞きました。 こういったライブラリとはプログラムにどのように用いればいいのでしょうか? ライブラリで定義された関数を用いてプログラムを書けばよいということでしょうか? PCは素人でFortranの組み方ぐらいしか知りません。よろしくお願いします。 用いているPCはpen4でコンパイラはIFCです。
>>399 MKL買ってリンクする。使い方はMKLのマニュアルに書いてある。
>>399 そのFortranにライブラリは無いか?
CVFならCXMLとかみたいに
freeの実装じゃだめなの? Atlasとか…
AMD Core Math Libraryはどうよ
404 :
デフォルトの名無しさん :04/05/20 21:49
FORTRANが楽しく学べるサイトってないですか? やはり自分でプログラムを地道にやっていくことでしょうか?
406 :
デフォルトの名無しさん :04/05/26 21:14
IFCとPen4を用いています。 キャッシングのために巨大な配列を作りたいのですが、 巨大な配列を宣言するとsegmentation faultと言うエラーがでます。 何らかの方法で巨大な配列を作る方法はありますか? REAL CACHE(10^8) ぐらいの配列にしたいです。もしくは、 REAL CACHE(10^4, 10^4) という形でもかまいません。
407 :
デフォルトの名無しさん :04/05/28 14:47
>>406 こんなんでどうですか?一応動いたけど。
program ftest
implicit none
real(8), allocatable :: cache(:,:)
allocate(cache(10000,10000))
cache(10000,10000)=1.0d0
print *, cache(10000,10000)
end program ftest
VS.NET 2002 & IVF 8.0 (Fortran) Static Library & (C++) Console Application という構成なのだが… Fortranのサブルーチンに配列を渡す設計なんだけど /check:bounds 付きでコンパイルすると _for_emit_diagnostic が参照できない LNK2019 を吐かれる。 どうにかなんないのかな、これ。 教えて、偉い人。
>>410 ありがとうございます。
上記のスレの方法でLNK2019 は出なくなったんだけど
形状引き継ぎ配列だと ubound(array) で 0 が返されます。
よって計算出来ない状態…助けて下さい…
// C++
extern "C" void FortranSub(int, int[]);
int _tmain(int argc, _TCHAR* argv[])
{
int n = 10;
int a[5] = { 0 };
_tprintf("%d\n", a[0]); // => 0
FortranSub(n, a);
_tprintf("%d\n", a[0]); // => 10
return 0;
}
// Fortran
subroutine FortranSub(n, a)
!DEC$ ATTRIBUTES C, ALIAS : "_FortranSub" :: FortranSub
!DEC$ ATTRIBUTES VALUE :: n
!DEC$ ATTRIBUTES REFERENCE :: a
integer, intent(in) :: n
integer, intent(inout) :: a(:)
print*, lbound(a), ubound(a), size(a) ! => 1 5 5
a = a + n
end subroutine FortranSub
412 :
デフォルトの名無しさん :04/05/30 00:28
>>411 形状引き継ぎ配列の場合、引数は配列先頭のアドレスではなく配列記述子を使って渡されます。
(先頭アドレスだけでは配列の上/下限、範囲などの情報が伝わらないため)
詳しくは「ユーザーズ・ガイド Vol I」の「配列と Fortran 配列記述子の処理」等を参照して下さい。
>>412 ありがとうございます。
上記forum内を検索して、Descriptorについて言及しているスレを発見しました。
それに従って、CVFサンプルのDESCRIPTを眺めてはいたのですが…
va_listが出てきた時点で閉じてしまいました。
でもこの方法でやるしか無いようですね。
ざっと見たところこんな感じでしょうか。
extern "C" {
struct Descriptor {..};
void FortranSub(int, struct Descriptor*);
}
// _tmain
int n;
int a[size];
struct Descriptor* dp;
// ここで記述子割り当て処理
// その後実行
FortranSub(n, dp);
実際に作ったらまた書きます。
こんなことやってる人あまり居ないとは思うんですが、参考になれば…
414 :
デフォルトの名無しさん :04/05/30 20:46
416 :
デフォルトの名無しさん :04/05/31 18:23
>>411 形状引継ぎ配列として渡さないのが一番じゃないの?
だって、f90の仕様では形状引継ぎ配列はinterfaceでプロトタイプ宣言みたいに
書いてやらないとダメじゃん。C++側でinterfaceが用意できないんだから
無理なんじゃないの?諦めて整合配列にしなよ。
CVF6.6BとIVF8.0では多少記述子が異なりましたが
なんとかできました。
>>410 >>412 >>414-416 いろいろありがとうございました。
#include <stdarg.h>
enum { DP_ROWORDER, DP_COLUMNORDER, DP_MAXRANK = 7 };
typedef struct {
int number;
int distance;
int lbound;
} DPTRIPLET;
typedef struct {
int address;
int size;
int offset;
int bit;
int rank;
int reserved;
DPTRIPLET dim[DP_MAXRANK];
} DESCRIPTOR, *LPDESCRIPTOR;
void AssignDescriptor(LPDESCRIPTOR dp, void *address, const int size, const int order, const int rank, ...) { dp->address = (int)address; dp->size = size; dp->offset = 0; dp->bit = 1; dp->rank = rank; dp->reserved = 0; int inc = 1, index = 0; if (order) { inc = -1; index = rank - 1; } va_list vl; int distance = size; va_start(vl, rank); for (int i = 0; i < rank; i++) { int number = va_arg(vl, int); dp->dim[index].number = number; dp->dim[index].distance = distance; dp->dim[index].lbound = 1; distance *= number; index += inc; } va_end(vl); } extern "C" void FortranSub(LPDESCRIPTOR); で、いけました。改行大杉言われたのでちょっと詰めました。
419 :
デフォルトの名無しさん :04/06/01 23:19
自然数の各桁の数字の和を求めるにはどのようにしたらいいのでしょうか。 教えてください。
420 :
デフォルトの名無しさん :04/06/02 00:10
>>419 #include <stdio.h>
int main()
{
int i, n, total=0;
char tmp[11];
printf("input num:\n");
scanf("%d", &n);
sprintf(tmp, "%010d", n);
for (i=0;i<10;i++) total = total + tmp[i] - '0';
printf("%d --> %d\n", n, total);
return 0;
}
fortran90でお願いします。
program hoge implicit none interface function foo(n) integer, ml_external :: foo integer, intent(in) :: n end function foo end interface integer :: n, m print *, "input n" read *, n print *, foo(n) end program hoge #include <stdio.h> int foo(int* n) { int i, total=0; char tmp[11]; sprintf(tmp, "%010d", *n); for (i=0;i<10;i++) total += tmp[i] - '0'; return total; }
423 :
デフォルトの名無しさん :04/06/02 02:41
>>419 文字列変数に数字を書き込んで、後はそれぞれの桁の文字のアスキーコードを
数字に変換して足し合わせてます。
program nnumber
implicit none
integer :: n, i, isum
character(20) :: cn
write(6,*) 'input natural number'
read(5,*) n
write(cn,*) n
isum=0
do i=1, len(cn)
if( cn(i:i).ne.'' ) then
isum=isum+(ichar(cn(i:i))-48)
endif
enddo
write(6,*) 'result=', isum
end program
>>423 character(20) :: cn
write(cn,*) n
if( cn(i:i).ne.'' ) then
isum=isum+(ichar(cn(i:i))-48)
のそれぞれのやってることの意味がよくわかりません。
初心者ですみません。おしえてください。
425 :
デフォルトの名無しさん :04/06/02 16:38
>>424 character(20) :: cn
20文字分の文字列変数 cn を定義。
write(cn,*) n
整数を文字列に変換します。これ知ってると便利です。
普通、 cn の場所にはファイルのUNIT番号が入るんですが、
文字列変数を指定することもできます。こうすれば、なんでも(多分)文字列に
変換できます。ファイル名に連番を付けて作成することもこれを使うと楽です。
if( cn(i:i).ne.'' ) then
文字列変数の i 番目の文字が空白だったら読み飛ばしの意味です。
あんまり意味ないかもしれません。ここは適当に書いてます。
isum=isum+(ichar(cn(i:i))-48)
ichar()組み込み関数で文字列 cn の中の i 番目の文字のアスキーコードを
取得します。アスキーコードでは、"0"が48, "1"が49, "2"が50
のように順番に数字キャラクタとコードが対応してるので、アスキーコード値から
48を引くことで文字列型から整数値への変換をしてます。
文字から整数へ変換する組み込み関数が見つからなかったので、自前でやってます。
program test implicit none integer(kind=4) :: num integer(kind=4) :: i integer(kind=4) :: keta=0 integer(kind=4) :: isum=0 read(5,*) num if(num<=0) stop do if(num/(10**keta)>0) then keta=keta+1 else exit endif enddo do i=keta-1,0,-1 isum=isum+num/(10**i) num=mod(num,10**i) enddo print *,isum end program test
>>425 大変大変勉強になりました。ありがとうございました。
>>425 > 文字から整数へ変換する組み込み関数が見つからなかったので
こんなときこそ内部ファイルを使って
program hoge
implicit none
integer(kind=SELECTED_INT_KIND(9)) :: n
integer, dimension(10) :: a
integer :: m
character(len=10) :: str
read *, n
write(str, "(I10.10)") n
read(str, "(10I1)") a
m = sum(a)
print *, m
end program hoge
program test implicit none character(len=100) :: cnum integer :: i integer :: iwa=0 read(5,'(a)') cnum write(cnum,'(a)') adjustl(cnum) do i=1,len_trim(cnum) iwa=iwa+ichar(cnum(i:i))-ichar('0') enddo print *,iwa end program test
このスレは勉強になるな〜!
431 :
デフォルトの名無しさん :04/06/02 17:55
コンパイルはできたのですが、実行がされません 以下のようなメッセージが出てきました。 list in: end of file apparent state: unit 10 named inpdt last format: list io lately reading direct formatetd externalIO Aborted (core dumped) どうすればいいのか.......
>>431 読み込むファイルの中身がおかしいか、読み込むデータと
プログラム側のread文が正しく対応してないかのどちらかだと思われ。
デバッガでトレースすれば?
>>419 氏
10 で割っていくのが最短のような気がしますが...
9876 ==>
mod(9876,10) + mod(987,10) + mod(98,10) + 9
勘違いでしたらごめんなさい.
でも、全部文字列で扱って、最後の足し算のところで整数の結果にすれば 何百桁の自然数でもオケーなので、割り算するより強力だね。 実用上は意味無いだろうけど。
フォートラン始めたばっかの初心者ですが、 *10**40 など、ある実数に大きな数字をかけるとへんてこな答えが出るか NAN となってしまいます。 *10**10とかくらいからおかしくなってきます。 これはどうすれば良いんでしょうか? コンパイラはGnu Fortran 77です。
>>436 単精度・倍精度・浮動小数点などについて調べてみてください。
比較する演算子は, <,>,= よりも .gt. 等の方が エディタの色付けの恩恵があって見やすいと思ってしまう orz
>>436 質問の仕方がなんだかアレですね。
・目的は何なのか?
・何を解決したいのか?
・解決しようとする過程で、自分が詰っている箇所の詳細な説明。
を丁寧に説明すれば助けてもらえると思います。
>437,439 すいません。ちゃんと書きます。(^ ^;; 以下の式でf(500)を求めようとするとエラーが出てしまいます。 それで、部分部分に細かく分けて試したところ、*10**40等を含む部分の結果がおかしいのです。 そのためexp(...)=1となってしまい、/0 になってしまうようです。 (関数電卓で計算すると約3.27E+62になるはずです) そこを*10**9くらいにすると、それに応じた正常な結果がでるので、どうしたもんかと。。。 ちなみに、コンパイラはGnu Fortran77です。 double precision f,h,c,k integer t,x1 f(x) = 8*pi*h*c*(10**45) /x /(exp(h*c/(k*t*x*10**(-9)))-1) pi = 3.1415 h = 6.6261*(10**(-34)) c = 2.9979*(10**8) k = 1.3807*(10**(-23)) t = 200 x1 = 500 write(*,*) f(x1)
整数は整数であると見抜ける人でないと(FORTRANを使うのは)難しい。
10 という整数定数を 45 乗することになっちゃうので、 その段階で整数の桁あふれが起こってるんでしょう。 倍精度浮動小数点型の定数の表現を調べること。 h=6.6261d-34 あと g77 使ってる環境なら ftncheck もあると思うので、 使えるようになっときましょう。 さらについでにいうと、t とか x1 とかは integer では なく double precision にすべきだと思う。これはモデル の段階での話だけど。
>>440 単位系も大きすぎる気がする。原子単位系とか使ったら良くないか?
444 :
デフォルトの名無しさん :04/06/04 19:57
IFCを使っているのですが、実数の値が ????????????????? となる時があるのですが、これは実数がNaNになっているのですか? それともINFになっているのですか? isnan文で判定できなくて困っています。 さらに、 ++++++++++++++ なる時もあるのですが、これは何ですか?
自己レス IFCでは、 +++++++++++++++++ 正の無限大 ----------------- 負の無限大 ???????????????????? 非数 らしいです。 質問変更 変数が無限大かちゃんとした値かを 判定できる関数ってないのですか?
>>445 今ifcが手元にないので分からないけど、ひょっとして
xが無限大だと「x+1.eq.x」が真になったりとかしない?
448 :
デフォルトの名無しさん :04/06/05 00:17
fortran77ソース読み込んでフローチャート描いてくれるツールないかね?
さすがにフローチャートまではしらないなあ。 call tree くらいだったら前出の ftnchek で 出してくれるけど…
フローチャートって、役に立ったことが無い。
プログラミングの知識が構造化以前で止まっている上司に プログラムの内容を説明するときに役立ちます。 イベントドリブンなプログラムを 「フローチャート書いて説明しろ」 なんて言われてもねぇ・・・(泣
do i=1,10 do j=1,10 write(1,*)x(i,j) end do end do テキストファイルに i 行 j 列の表として出力する方法はありませんか?
>>453 出来たファイルをawkで整形しる
$ awk '{if(NR%10==0)print;else printf"%s ",$1}' 1.txt
>>453 do j=1,10
write(*,*)(x(i,j),i=1,10)
end do
なんかまた宿題スレみたいになってきたな…
457 :
デフォルトの名無しさん :04/06/05 14:42
>450 解析・構図(FORTRAN 用) はちゃんとしたフローチャートじゃないんだよね・・ テキスト出力だし。やっぱしないのかねぇ。。
>>454 良いもの教えてくれてありがとう御座います。
awk使ってみます。
>>455 それだと倍精度実数からなる要素の場合みたいに
データが長いと、途中で勝手に改行されちゃいませんか?
459 :
デフォルトの名無しさん :04/06/05 18:01
またまた内部ファイルを使ってもいいんなら、こんなんでどうですか? program main implicit none integer i,j; character(len=1024) :: ch integer, parameter :: n=10 real(8) :: x(n,n) do i=1, n write(ch,*) (x(i,j),j=1,n) write(*,*) trim(ch) enddo end program main
>>458 勝手に改行は書式が*の問題だろ
書式を指定尻
nmax=10
do j=1,nmax
write(1,'(<nmax>f10.6)')(x(i,j),i=1,nmax)
end do
461 :
デフォルトの名無しさん :04/06/07 22:49
ブレネリ あなたのお家はどこ 私のお家はスゐッツランドよ 綺麗なおすぎのピーコなのよ ヤーッ ホーッ Fortranranran ヤホ Fortranranran
さむい
なつい
FORTRANが滅亡してしまえば勉強しなくてすむのに
ベクトル化や並列処理を考えたら、まだまだ存在価値はあるんじゃ? 言語仕様が簡単だから、最適化もやたらと効きそうだし
言語仕様が簡単ですか...混沌としてて鬱ですよ. ガイドラインキボンヌですよ. しかも,リストとかツリーってどうやって作るの? fortran77 で.
>>466 そうっすか?C++と比べると、かなりストレートな言語だと思うけど
Fortranも正直使いたくないんだが、使う分には許容出来なくもない。 問題なのは未だにFORmula TRANslaterとして、モジュール化もへったくれも無 いコードをこのクソ言語で書かれるとどーしよーもない事なんだよな。 ま、Cでポインタ覚えたてのアホが書くコードも、C++でtemplate覚えたての カスが書くコードも一緒か。
>>469 がいいことを言った.
ftnchkek みたいな使い方で,望ましくないコーディングも教えてくれる
やつがあればいいのにね w
MATLABって、どのあたりがFortranと関わりがあるんでせうか? 最近授業で習い始めて、「Fortranから派生した」みたいなことを聞いたんですが、、
473 :
デフォルトの名無しさん :04/06/17 13:01
最近フォートラン始めたんですがこれってマック剥けコンパイラありますか?
ってか前に出てますね。ごめんなさい。
自己レス. リストとかツリーを使おうと考えるからいけないんですね. Fortran には Fortran の考え方がある,と. また,紙に書いて煮詰まったものしかコードに表せないのも, Fortran の仕様ですね.
ツリーだろうとハッシュテーブルだろうと、ある程度機能をわりきれば、
Fortran77の制限内でも案外楽に実装できるぞ。
メモリ空間なんて所詮一次元の配列だし(暴論)、
その配列の添字がポインタの代わり、
ポインタのポインタが使いたかったら、その添字を値とする整数配列を作る。
>>466 がんばれ
>>476 うほっ.別の意味で教育に良い言語ですね.
ちょっと試してみます.
とある subroutine の中で, IMPLICIT REAL*8(A-H,O-Z) common /hoge/ arr(10) data arr(1) /'Yo'/ と宣言された変数がありました.これを g77 でコンパイルすると data arr(1)/'Yo'/ ^ Type disagreement between expressions at (?) and (^) と言われます.しかし,文字列を Hollerith 定数にするとコンパイルが通ります. なぜなのでしょうか?できれば Hollerith 定数は避けたいのです. arr はなぜか実数として宣言されています. common の前で character と宣言してもコンパイルが通りませんでした.
479 :
デフォルトの名無しさん :04/06/23 18:57
どなたかフォートランでパスカルの三角形の逆三角形を作れる方いらっしゃいませんか? どうかよろしくおねがいします。
480 :
デフォルトの名無しさん :04/06/23 21:31
>>479 パスカルの三角形(
>>4 )を求めて、メモリに保存して、逆から出力していけばええんで内科医
と、思ったのですが。 どうやったらピラミット型に…?
>>484 宿題の文面を晒さないと何がしたいのかさっぱり分からないよ.
1 2 1
1 1
1
やっほー♪ふぉーとらんらんらん♪ てのはガイシュツ?
>>484 逆じゃない三角形は作れるの?
まず普通にできてから,逆を考えた方がいいかもよ.
出力は write (fmt='()') で整形しないといけないよ.
>>484 program joke
write(6,'("1 2 1")')
write(6,'(" 1 1")')
write(6,'(" 1")')
stop
end
1 みなさんすいません… Fortran77で、こういった三角形をつくれというものでした。 1 1 また、これをピラミッド型にしろともいわれました。 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1
つまり四角錐にしろと言うのか。難問だ
もとのプログラムはこれです integer k(8,8) n=8 k(1,1)=1 do 1 i=2,n-1 k(i,1)=1 k(i,i)=1 do 2 j=2,1 k(i+1,j)=k(i,j-1)+k(i,j) 2 continue 1 continue do 3 i=1,n-1 write(*,5) 3 continue 5 format (' ',714) stop end です。
>491 言葉が足りずすいませんでした! こういった形です。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1
494 :
デフォルトの名無しさん :04/06/26 15:22
::::::1 :::::1 1 ::::1 2 1 :::1 3 3 1 ::1 4 6 4 1 :1 5 10 10 5 1 1 6 15 20 15 6
714?
>>492 配列のインデックスが逆になっている (C 言語みたいな) ところが多いですね.
修正しないと直角三角形にもなりませんよ.
ところで
>>484 ではありませんが,
きれいに三角形を出してみようとしました.
ところが,fortran の経験がほとんど無く,文字列を操作して
write() に与える fmt 文字列を作ることさえできません.
adjustl() とか trim() は fortran77 にありますか?これが無いと話になりません.
Professional Programmer's Guide to Fortran77 には書いてないのですが...?
497 :
デフォルトの名無しさん :04/06/26 23:37
FORTRANでは配列の外にアクセスするのってOKなんですか? dimension XX(120) XX(0)=0. XX(300)=1.5 みたいな代入があって、これが通るのが信じられません。単にコーディングミス かとも思ったのですが、作者も用途も全然別なのに古いプログラムでは結構見ます。 そしてなぜかまともに動いています。(理解に苦しみますが) -fbounds-check等をつけてコンパイルすると当然動きません。 C等ならまず駄目だと思いますがFORTRANは仕様としてOKなのでしょうか?
とりあえず大きくても 5 桁だと決めないと大変ですね...
write() が勝手に改行しないようにするために,fmt='(I5$)' のようにドルを
付けましたが,これが fortran77 か何を見れば分かるのか教えてください.
気軽に仕様を調べられないと,すごくストレスを感じますよね.
>>492 _____|_____|_____|_____|____1
_____|_____|_____|____1|_____|____1
_____|_____|____1|_____|____2|_____|____1
_____|____1|_____|____3|_____|____3|_____|____1
____1|_____|____4|_____|____6|_____|____4|_____|____1
アンダーバーは空白,縦棒は本当は出力しません,
ということで,等幅フォントで見てください.
どういう順番で出力すればできるか気付いてもらえるかと思います.
500 :
デフォルトの名無しさん :04/06/27 02:24
>>496 ADJUSTL, TRIM, 書式末の'$'はFORTRAN77の仕様ではないよ。
大抵の処理系はサポートしてると思うけど。
>>484 FORTRAN90で書いても結構面倒だったよ.
>>497 普通にプログラムでは、配列の外にアクセスするのってOKではないでしょう。
FORTRANでは配列は先頭アドレスからいくらでアクセスするから、エラーチェックをかけなければ走らないということは
ないでふ。real*8だとして
XX(300)にアクセス=XXの先頭アドレス+8bit*300にアクセス
>>492 の様に結果が配列に格納されているとして
IW=6
DO 10 I=1,N,1
WRITE(FMT, '(2H(T,I2,1H,,I2,1HI,I2,1H))') (N-I)*IW/2+1, I, IW
WRITE(*, FMT) (K1(I,J), J=1,I,1)
10 CONTINUE
>>499 (・∀・)イイ!! ケド、改行の抑止の valid な方法はどこだろう?
例が少ないのは仕方がないのでしょうが,用語を覚えるまで実際に書けないです.
「手元の処理系で動くから」って,悪名高い BASIC のマネか知らん.
>>500 ですよね...
文字列処理がこんなに貧弱なのに,fortran で処理系を書かれる方も
いらっしゃるそうですね.
出力の整形ルールだって,今からでも C の printf 作ろうよ,って思います.
>>503 すごい...write が低機能なんじゃなくて,私が低いんですね.
しかも配列のインデックスの順番がわざとだったとは orz
>>502 thanks. 結構業界では有名なプログラムだったのでひょっとしたら、と思いまして。
>>492 はちゃんと動かんぞ。
>>503 折れのコンパイラ (Compac cfal for Alpha Linux) では駄目だった。何故だろう?
f90: Error: ***.f90, line **: This format specifier must be of type INTEGER. [FMT]
WRITE(*, FMT) K(I, 1:I)
---------------^
ということで自分で書いてみた。
INTEGER, PARAMETER :: N=12, IW=6, M=N*IW
INTEGER :: I, K(0:N) = 0
CHARACTER*M :: S = REPEAT(' ',M)
K(1) = 1
DO I = 1, N
K(1:I) = K(1:I) + K(0:I-1)
LL = (N-I)*IW/2+1
WRITE(*,'(A,20I6)') S(0:LL),K(1:I)
END DO
ちょこちょことイタいミスしてるな(はづかし 改訂版 INTEGER, PARAMETER :: IW=6, MAX=30, MS=(MAX-1)*IW/2+1 INTEGER :: I, N INTEGER :: K(0:MAX) = 0 CHARACTER*MS :: S = REPEAT(' ',MS) write(*,*) "Pascal's triangle. Enter N:" read(*,*) N K(1) = 1 DO I = 1, N K(1:I) = K(1:I) + K(0:I-1) WRITE(*,'(A,50I6)') S(1: (N-I)*IW/2+1), K(1:I) END DO
>>496 テキトーに書いてみた。
parameter (nmax=20)
integer*4 iv(nmax),ivp(nmax)
character cfmt*17
open(61,file='output.txt',RECL=256)
len = 6
isp = len*nmax/2
do 10 k = 1, nmax
cfmt='(0000x,0000i0000)'
ni = k
do 20 i = 1, ni
iv(1)=1
iv(ni)=1
if ((i.ge.2).and.(i.le.ni-1)) then
iv(i) = ivp(i-1) + ivp(i)
end if
20 continue
do 30 i = 1, ni
ivp(i) = iv(i)
30 continue
isp = (len*nmax/2) - (k-1)*len/2
write(cfmt(2:5),'(i4)') isp
write(cfmt(8:11),'(i4)') ni
write(cfmt(13:16),'(i4)') len
write(61,cfmt) (iv(i),i=1,ni)
10 continue
close(61)
stop
end
>折れのコンパイラ (Compac cfal for Alpha Linux) では駄目だった。何故だろう? >f90: Error: ***.f90, line **: This format specifier must be of type INTEGER. [FMT] >WRITE(*, FMT) K(I, 1:I) >---------------^ すいません。FMT を character で宣言していなかったせいでした。 character*11 FMT を入れたら動きました。(はづかし
てことは、これでいいんだな。 INTEGER, PARAMETER :: IW=6, MAX=30 INTEGER :: I, N INTEGER :: K(0:MAX) = 0 CHARACTER*11 :: FMT write(*,*) "Pascal's triangle. Enter N:" read(*,*) N K(1) = 1 DO I = 1, N K(1:I) = K(1:I) + K(0:I-1) WRITE(FMT, '(2H(T,I2,1H,,I2,1HI,I2,1H))') (N-I)*IW/2+1, I, IW WRITE(*, FMT) K(1:I) END DO END
g77 だったらこんな感じかな。 parameter (max=30, iw=6) integer c(0:max), d(0:max) character*11 FMT data c /(max+1)*0/ write(*,*) "Pascal's triangle. Enter N:" read(*,*) N c(1) = 1 do i = 1, N do j = 0, i d(j) = c(j) end do do j = 1, i c(j) = d(j) + d(j-1) end do WRITE(FMT, '(2H(T,I2,1H,,I2,1HI,I2,1H))') (N-i)*iw/2+1,i,iw write(*,FMT) (c(j), j=1,i) end do stop end
スレ違いだが Python だったらこんな感じだな。 import Numeric iw = 6 N = input("Pascal's triangle. Enter N: ") c = Numeric.zeros(N); c[1] = 1 for i in range(2,N+1): c[1:i] = c[1:i] + c[0:i-1] bln = ' '*((N-i)*iw/2+1) fmt = ('%' + str(iw) + 'd')*(i-1) print bln + fmt % tuple(c[1:i])
>>502 私は
>>497 ではありませんが,ちょっと 1995 年頃に書かれたプログラムを
コンパイルする過程で,大量の warning に出逢いました.
out of definition range です.
わざわざ dimension を使っておきながら,越えた範囲に堂々とアクセスしているんです.
しかも,そのプログラムは bug fix 済みな感じで使われています.
目的が知りたいです.
浅学の私では,dimension の数字を増やせば済むのでは,と考えてしまいます.
515 :
479です :04/07/04 11:52
みなさんこんなにたくさんの御返事ありがとうございます!
516 :
デフォルトの名無しさん :04/07/08 21:56
結局
>>497 が言うようなプログラムが
堂々と出回っている理由を知る者はいないのですか... orz
517 :
デフォルトの名無しさん :04/07/08 23:04
>>516 サブルーチンで引数として長さが不定の配列をもらうとき、今だと
subroutine sub(a, ...)
dimension a(*)
…
みたいに宣言するよね。
でも、これが正式な規格となる前(FORTRAN77以前?)は、
dimension a(1)
や、
>>497 みたいに、適当な配列サイズの宣言をしてコンパイラを騙す
「テクニック」があったそうな。
もちろん、今となっては過去の遺物。
>>497 EQUIVALENCE で他の配列に重ねていないか?
>>517 過去の遺物とは言え、fortran90コンパイラでコンパイルしてもエラーにはならなくない?
自分の場合、全てのsubroutine, functionに対してinterfaceを宣言したヘッダファイルを
includeしてバグを回避してたりする
>>517 そうだったんですか!ありがとうございます.
使うときは,ちゃんとそれなりの大きさで定義済みだから
正しく動いていたんですね.
今度 dimension a(*) だと意識しながら読んでみようと思います.
! あれを書いている人のコンパイラは warning を出さないのだろうか...
521 :
名無しさん@そうだ選挙に行こう :04/07/11 10:14
Linux用intelFORTRANコンパイラの導入方法と使用方法教えてください
524 :
デフォルトの名無しさん :04/07/12 11:50
fortran90でライフゲームができるプログラムを教えてください。
卒研くらい自分でやれ。
>>524 program hoge
use DFPORT
integer :: r
r = system('lifegame.exe')
end program
>>524 まずは簡単そうなライフゲームをのソースコードを探して,
Fortran90 に書き直してみるとか?
0,1なら八桁で遺伝的アルゴリズムが上手く機能すると聞いたことがある
529 :
デフォルトの名無しさん :04/07/13 19:12
>>522 fedoracore1です。
おながいします。
>>529 man gzip
man tar
man rpm
助けてください、課題レポートなんですけど どうやってもわからないんです -------- 150までの任意の整数値Nをあたえ、以下を求めるプログラムを作成する ・N番目に小さい素数 ・N番目までの素数の和 ・N番目までの素数の逆数の和 -------------- というもので”エラトステンスのふるい”を使うことや、 大体、素数の個数を170ぐらい出せばいいと言う事は思いつくんですけど プログラムに書き表すことができません。 手の空いている方がいらっしゃいましたら、 何卒手助けをお願いいたします……(´Д`;)
"エラトステンス"ってのは始めて見た。typoなのか「表記のゆれ」なのか判らんけど。 「エラストテネス」か「エラトステネス」で検索してみそ。きっとヒントが見つかるから。
>>533 小さい方からN個の素数が分かれば後は簡単.
150までなら、素数のデータベースを作ればいいだら
>>533 Fortran90で書いたら,60行位で終わった.
夏休みの課題だとすれば短過ぎるか.
コメントと空行は除き、継続行はまとめて1行とカウントするルールで 何行で書けますか?
>>539 空行を抜いたら57行だった.ただし,150と言わず何個でも
対応出来るようにde/allocateしている.150に制限して,
飾りのprintを外すともう少し短くなるか.
FORTRAN77でも 充分な大きさの配列を用意して ふるいにかけて素数だけ集めて Nを入力して 和を計算して ・・・ と、だらだらやっても50行程度で終わるな。 サブルーチンに分けたりするともうちょっとかかるかもしれないが。
>>533 のど素人でございます
>>534 様
ご指摘の通りエラトステネスです
期限が迫りテンパっておりました申し訳ないです
>>手助けをしてくださった方々
本当にありがとうございます
ぢつは上の課題というのは再履修に与えられた課題でありまして
……これが出来なければ4年目の情報処理となってしまうわけでして
無理を承知でお願いいたします。プログラム文を教えていただけないでしょうか
助けてください
「必死だな」と罵られても構いません、むしろ罵ってくださいませ
もう必死です(;´Д`)
必死だな. まあ,わからないんだったら,もう一年やってもいいんじゃない.
>>542 本当に必死なら、どんな物でもいいから自分でつくったプログラムを
晒して下さい。
多少なりとも自分で考えた上でプログラムの間違いを指摘して欲しい、
と言うのであれば協力もしてやろう。
だが、授業内容を理解していないのに課題を人に丸投げするような奴は
単位取れなくて当然だ。
間違えた昨年度だ
>>541 subroutine 2つとfunction 1つを使っていた.
それらをprogramに押し込んだら34行になった.
>>547 ソースをうp plz
program test implicit none integer :: n integer,dimension(:),allocatable :: iprime !自然数を入力 read(*,*) n allocate(iprime(n)) !分割してサブルーチンを作ると読み易い call get_nprime(iprime) !できた素数配列を処理 !やることはN番目の素数,N個の素数の和,N個の素数の逆数の和の表示 call work(iprime) deallocate(iprime) !れぽーと提出おめでとう! end program test 多分講義はFORTRAN77でやっていると思うから,講義と全く触れて いないプログラミングをしている時点でレポートとして認められない と思う.
9行ででけたー (Fortran95 固定形式) integer::Il(1:11)=(/0,(lI,lI=2,11,1)/) do1l1=3,2,-1 1 forall(ll=l1*2:11:l1)I ll(ll)=0 do11lI=2,11,1 Il(l1)=Il(lI) 11 If(Il(lI)/=0)l1=l1+1 read*,l1 print*,l1,Il(l1),sum(Il(1:l1:1),1),sum(1./Il(1:l1:1),1) end 10行に見えるのは継続行があるためです。 どこかは自分で探しましょう。 また、このままではN=5までしか計算できません。 どこを直せばよいかは自分で探しましょう。
さあ,お次は 7 行プログラミングかな?
さすがに7行はつらいな。 っていうか、配列の宣言と入出力、END文書いたら残り3行しかない。 マルチステートメント使ってもいいなら書けるけど。
; は無し?
554 :
デフォルトの名無しさん :04/07/24 14:31
WindowsXP proでVisual Fortran6.1Aを使ってどのプログラムを実行しても Loaded 'ntdll.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found. The thread 0x940 has exited with code 0 (0x0). という警告がでます。dllが壊れてるんでしょうか?直し方が分かる方教えてください。
554 自己レス。 実行ボタン以外の場所を押してました。情けない・・・・・
CASE1 ------------------------- open(1,file='hogehoge') do i = 1, 60*60 : : 何か計算しつつ、ファイルへ書き出し : : end do close(1) ---------------------- とするのと、 CASE2 ---------------------- do i = 1, 60*60 : : 何か計算。 : : end do open(1,file='hogehoge') do i = 1, 60*60 ファイルへ書き出し end do close(1) ----------------------------- とするのでは、明らかに速度が違います。 CASE2のほうが速くなるんですが、この理由って何でしょうか? ただの気のせいでしょうか?
今回の件と関係あるかどうかは知らないけど、 CPUの計算速度 >>> ファイル等入出力の速度 なので一般的に入出力はなるべくまとめた方が速くなります。
558 :
デフォルトの名無しさん :04/07/31 23:25
至急、質問があります。 FFT(高速フーリエ変換)のプログラムを作ってます。 今まで処理データ数が16000個くらいで、順調に計算できていました。 しかし、データ数を70000個くらいに増やすと、出力ファイルに 『*』印がたくさん出てきます。 ちなみに言語はフォートランで出力はCSV形式で出力してます。 これはフォーマットの設定が悪いんでしょうか?
559 :
デフォルトの名無しさん :04/08/01 00:00
560 :
デフォルトの名無しさん :04/08/01 07:07
ブレネリ あなたのお家はどこ しらねーよ ボケッ 良いこのみんなはこういう無慈悲なことを言っちゃいけないぞ
561 :
デフォルトの名無しさん :04/08/01 10:39
やーふぉー FORTHらんらんらん
562 :
デフォルトの名無しさん :04/08/06 19:06
Salford Software のFortran95コンパイラ FTN95 Personal Edition が
非商用・個人利用に限り無料で利用できるようになりました。
ttp://www.silverfrost.com/32/ftn95/ftn95_personal_edition.asp ・Win32ネイティブ及び.NET managed code が出力可能
・IDE、デバッガ、C++コンパイラなどが付属
・Visual Studio .NET 2002/2003 のIDEでも利用可能
・動作環境は98/NT4SP6/2000/XP (98の場合は.NETデバッグ不可)
これでコンパイルした実行ファイルを実行すると、強制的にバナーが表示されますが
それ以外に機能的な制限はないようです。
ただし
> If you with to use FTN95PE on an educational establishment's
> equipment then you must buy an academic licence.
とのことなので、学校の先生は注意が必要です。
>>562 ifc が強力すぎて,なんかパッとしないね.
564 :
デフォルトの名無しさん :04/08/08 18:25
Windows上で使えるフリーのFortran90/95はほとんど無かったから これはこれで良さそうな気がする。 ifc (IVF)は製品版と期間制限付きの体験版しかないし。 しかし、Fortranで .NETするメリットってあるのかね?
>>564 windows となると,minGW + g77 でも fortran77 までか...
もうちょいですね.
minGW で gcc だと IDE (統合開発環境) が使えますが,g77 でも使えるんですか?
触れておきながら使ったことないんですが w
> しかし、Fortranで .NETするメリットってあるのかね?
数値計算プログラムのインターフェース???
.NET である必要はないけど.
"すれ立てるまでもない質問はここで" の方でも 質問したんですが,どうやらアソコではレスもらえなさそうなので, こちらにも書きます. マルチっぽくなってしまい,申し訳ありません. 質問は fortran77 (g77) についてなのですが, C でいうと struct pos{ double x; double y; double z; }; struct pos pos[64]; みたいなかんじの構造体の配列は使えますか. もし使えるのなら宣言の方法まで教えていただけるとうれしいです. よろしくおねがいします.
レスありがとうございました g90 の登場が待ち遠しいですね.
>>571 intel のすごくいいやつがあるよ.無料の.
そういえば以前のレスで コンパイラごとにコマンドの実行速度を 比較したページがありましたね. gnu よりも intel の方が3倍くらい早かった記憶がします. そこで intel をダウンロードしようと思ったんですけど, non-commercial 版なのに会社を書けといわれてしまいました う〜ん学生なんですけど学校の名前書いちゃっていいんですかね?
>>573 もう登録したかも知れないけど「personal」とか「personal use」でいいんじゃない?
まあ、別に学校名で登録しても問題ないと思うけど。
MATLABのFFTSHIFTに相当する機能をFORTRANで簡単に やるには、どうしたらいいんですか?
576 :
ダメ名無し :04/09/08 19:07
かなり初歩的な質問で恐縮なのですが、 値をTAB区切りで出力するにはどうしたらよいのでしょうか? テキストファイルをエクセルファイルに変換したいのですが・・・
VFなら、C文字列使えるから、\tでいけるが、ほかはしらね。 おとなしく、カンマ区切りテキストにすれば。
タブはCHAR(9)でだめ?
別にスペースでもエクセルでセル分割できるよ。 ファイルから開くで、種類をテキストファイルとしてみ。
580 :
ダメ名無し :04/09/08 20:45
わ!ほんとだ!解決しました! ありがとうございます〜!!! もっとはやくここにくるんだった _| ̄|○ ほんとありがとうございます!
581 :
デフォルトの名無しさん :04/09/08 20:58
しょうもない質問ですがどなたか教えてください。 メモリー512MBで1024×1024の配列の計算を行なおうとすると、 上手くいきません。512×512ならできるんですが。 やっぱり、メモリーを1GBとかにしないとだめですか? ちなみに、計算内容は速度u,vをフーリエ変換してエネルギースペクトル を出すというものなんですけど。。。
そんな質問で答えられるやつはネ申
583 :
デフォルトの名無しさん :04/09/09 00:18
以下のスタイルのプログラムを書いたとき メモリーは変数xとyの1024*2個分を消費されるのでしょうか それとも メモリーは共有され1024個分だけ消費されるのでしょうか? 数十万の配列サイズを設定するので、なるべくメモリ消費は避けたいので うまく共有したいのです。 アドバイスください 詳しい人。 program main integer :: x(1024) call sub(x) ・ ・ end program main ・ ・ subroutine sub(y) integer :: y(1024) ・ ・ return end subroutine sub
>>583 subroutineへの受け渡しは配列の先頭アドレスとサイズですよ
585 :
デフォルトの名無しさん :04/09/09 08:59
>>584 さん ありがとうございます
ってことはsubroutineとで同じ物理メモリ領域を共有してるってことでいいんですよね?
586 :
デフォルトの名無しさん :04/09/09 13:55
ポインタ 使うってのはどうなんかな?
>581 スタックが溢れてるね。 自動変数だとスタック領域が足りなくなるので グローバル変数を使うしかない。 てか、最近のVCとかではスタックとかデータ領域とかって どうやって指定するの?9801のころは気にしながらプログラミング しなきゃならなかったから。
>>587 CVFならコンパイル時に/4Naオプションを付けると
すべての局所変数が静的に割り付けられる。
個別に指定するときは変数宣言時にSAVEかSTATIC
属性を付ける。
めもりは動的に確保してもいいんだが
590 :
デフォルトの名無しさん :04/09/10 16:11:47
長年UNIX上でFortran使ってるせいか、Windows上のVisual Fortranが使いにくくて たまらないんですが。なんであんなワークスペースファイルなどのいらないファイル を作るんだろ。
>>590 同意。それと、いろいろごちゃごちゃウィンドウがあって、肝心のコード見るためのウィンドウが狭い。
漏れも結局Windows上でもEmacs(Meadowだけど)使ってます。
595 :
デフォルトの名無しさん :04/09/11 13:44:56
Windows上のVisual Fortranで数値計算ライブラリをコンパイルする方法ってないですかね? もともとはソースコードが沢山入っててLinuxやUnix上ならMakeユーティリティで一発と いう奴なんですが。
普通にソースをプロジェクトにくわえれいいんでないかい。 fortranの場合、訛りがあることがあるから、ソースの修正が必要かもしれんが
597 :
581 :04/09/11 18:05:50
>>587 ,588
ありがとうございます。とりあえず無駄な配列を省いて
何とかできました。ただ、もうメモリの限界っぽいです。
金たまったら1Gにします。
>>595 そういう状況では、うちではcygwinのGNU make + Visual Fortranのコンパイラという組み合わせで対処してます。
>>590 おれも昔はそうだったが、IDE環境も良いもんだよ。デバッグも楽だし。
Intel版のVisual Fortranでetime関数を使いたいのですが、やり方がうまく行きません。 ライブラリ・リファレンスをビルド時にオプションで指定しなければならないようなんですが、 どうしたらよいのでしょうか?
601 :
デフォルトの名無しさん :04/09/16 17:32:52
FORTRANの基礎的な事は分かったのですが 数学的に難しい計算をするときにやり方が分かりません。 例えば2次元フーリエ変換はどのようにすればいいのでしょうか?
602 :
601 :04/09/16 17:33:49
コンパイラはVISUAL FORTRANを使ってます。
>>600 もうちょっと具体的に、どんなエラーが出るとか書いてくれないと答え難いんだが。
ETIMEを使っているプログラムまたはサブルーチンの先頭に
USE IFPORT
を追加すれば特に追加のライブラリを指定しなくてもコンパイルできるはずです。
「未解決の外部シンボル_ETIMEが…」とエラーが出る場合は
プロパティ ページの Fortran --> Compatibility で
Use PowerStaion Portability Library が Yes になっているか確認して下さい。
デフォルトでは Yes ですが No になっていると ETIME を含むライブラリが
リンカに渡されません。(コマンドラインでは /fpscomp:nolibs)
>601 にマジレス 別段FORTRANに限った話ではないが 1. 数学的に難しい計算を、自分でプログラムにする。 2. 数学的に難しい計算を、人にプログラムしてもらう。 2-1. 新たに書いてもらう 2-2. すでに書いてあるものを探してきて利用する 2-2-1. 買ってくる 2-2-2. フリーの物を使う 3. あきらめる
605 :
デフォルトの名無しさん :04/09/17 01:47:13
>601 にマジレス FORTRANの基礎的なことがわかったら 数学の基礎的なことも勉強しておく。 でないと、間違ってプログラム使っても気づかなかったりする
フーリエ変換は簡単なようで奥が深い
>>603 ありがとうございます。
早速ためしてみます。
今仕事でFORTRANのプログラムで演算処理させてるんですけど、時間が 50分くらいかかってしまって、とてもじゃないけどこまめに修正できない状態 です。で、新しいPCを入れて半分以下に短縮させたいんですが、どのくらいの マシンを入れたら効果的でしょうか?プログラムは繰り返しの部分はサブルーチンで 記述されています。 現在、Cerelon2.66GHz+Visual Fortran 6.0+WindowsXP Proで動かしています。 これをXeon2.8GHz+Visual Fortran8.0に変更したら約半分くらいになるでしょうか? また、Itanium1.3Gくらいにしたら1/10くらいになるでしょうか? それならそれぞれ30万、150万近くでも金をかける価値があるのですが... 多くの人が理解できるように、OSはWindowsでプログラムの改良については、 下手にいじくると結果に保証が持てないので、行わない前提で良いアドバイス をご教授いただけたらと思います。
読みにくい文章ですいません。 あと、XEONを入れる場合は、Xeon2.8G×2です。 Visual Fortran6.0でもデュアルPCを活かして処理できるのであれば それで行きたいです。 以上、よろしくお願いします。
半分とか1/10とかって…CPU変えるだけでそこまで上げるのはキツくね? とりあえずプロファイル取ってみてボトルネックだけでも直した方が速くなる んじゃないのかねぇ。
>>611 やっぱそうですか。
デュアルCPUを使って、マルチスレッドのコンパイラを使えば約2倍になって
くれるのかな、と思ったのですが。
>609 十年ほどじっと待ってみるのもよいかと。 しかし、経験的には611の言うようにプログラム見直したほうがよいかと。 ただし、経験的にはこれを行うと(もとのプログラムのほうにバグがあり。 思わずこれを直してしまったという事象も含めて)新たにバグを埋め込む 可能性も非常に高いということも否定できない。
バージョン管理システムは必須だぜ!
>>609 要するに、「プログラムを変更しないで計算時間を速くさせるにはどうしたらいいか?」
ということなんですね?どういう種類のプログラムで50分かかるのか分かりませんが、
メモリが足りなくてスワップしまくりで50分なら、メモリの追加で計算時間が1/100に
なるかもしれませんね。
>>613-615 アドバイスさんくすこです。
ところで、今日、こんなページを見つけまして、
ttp://www.v-t.jp/techinfo/faq/answer/nt/nt_a05.html 言われた通りにしてみたら15分程度になりました。
気になるのが、
・ Math LibraryをFastに変更します。但し、演算速度よりも演算精度が重要な場合はAccurateを選択します。
のところなんですが、このときの演算精度ってどの程度のものなのでしょうか?
計算結果は、10^3〜10^7の範囲で合っていれば問題は無いのですが。
>>615 メモリ不足は無いと思います。PCには1GB積んでますし、一番大きい
行列が1400×1400程度ですので...
>>616 CVF6.6 のマニュアルによると
> /math_library:fast
> ia32 システムでは,/math_library:fast は,数学ルーチンに対する
> 引数を検証しないことで性能を向上させます。 /math_library:fast
> を使用すると,予期しない例外値が生じる原因の追跡が困難にな
> ります。 ia32 システムでは,/math_library:fast は計算された浮動
> 小数点値の精度に影響を与えません。
ただし、コンパイラのバージョンによって違いがあるかも知れない。
#選択項目がFast/AccurateではなくFast/Checkになってるし
ちなみにCVF6.6 では精度と計算速度に影響するオプションは
Enable Floating-Point Consistency
>>617 ということは、引数に変な値を入れない保証があればFastにしても問題
無いってことですね。
過去ログ読んでみましたが、1400×1400くらいの配列を作っていては、
1GB積んでいてもメモリがスワップしているようですね。
なので、なるべく固定できるものは固定する方が良いのでしょうか?
会社が新PCを購入することも検討してくれているので、40万くらい出すの
ならどのように使うのが一番効果が高いか悩んでいるところなのですが...
(金の割に性能がイマイチだったら肩身が狭いので...)
勉強になるな。 大学の研究でやってるのが一回の計算がパラメータによっては50時間くらいかかる。 予算の時期的な都合で大型計算機使えないし上にかかれてる事試してみよう。
でも
>>616 の通りにして50分→15分っていうのは
ただ単に今までデバッグ版で使ってただけじゃ…
Optimization LevelをMaximamにはしないのかい(ny
FujitsuのFortran&C(v2.1)でプログラムをビルドすると、 Fatal error LINK.1070:Cannot open object input file -- No such file or directory "c0x32.obj" と出てビルド処理が中断されてしまいます。 マニュアルもなくて対処法が分からないのですが、これは何が問題なんでしょうか。
>>622 c0x32.objがなくてリンクができないってことが問題なんでしょうね.
>>622 No such file or directory "c0x32.obj"
>>623 >>624 どうもありがとうございます。
ズバリc0x32.objがないのが問題なのですね・・。
このc0x32.objというファイルをどこからか探してきて、
Fortran&Cのフォルダのどこかにコピーすれば動くでしょうか。
何度か再インストールしても同じエラーが出続けて参ります。
探したところFortran&Cのlibフォルダ内にありました>c0x32.obj 設定ができてないのかもしれませんが、まだ解決してません。 いろいろいじってみます。もし正常に動作したらまた報告します(いりませんかね・・ スレを汚して申し訳ありませんでした。失礼します。
正常に動きました。この使い方で合っているかどうか分かりませんが、 libフォルダ内の全ファイルとソースファイルを同じ場所に置いてやって ビルドするとリンクまで正常に行えました。役に立たない報告かもしれませんが。 どうもありがとうございました。
環境変数でPATHが通ってないんじゃないの?
>>628 たぶんどこかでlibフォルダにPATHを通す必要があるんだと思いますが、
どこで設定するのか分かりません。翻訳オプションという項目があって、
ここっぽいのですが、ヘルプを呼んでもそれらしいことも書いてなくて、
お手上げです。ソースファイルと一緒にlibフォルダ内のファイルを一緒に
置いてやれば動くので、とりあえずこのまま使用しています。
630 :
しろうと :04/09/27 23:56:48
現在Salford FTN77 Personal Edition Fortran 77 Compilerを使っているのですが、これでグラフの作成もできると聞きました。どのように操作するのかご存知の方いらっしゃいませんか?
631 :
デフォルトの名無しさん :04/09/28 22:56:16
>>630 FTN77 Library Reference P.45〜
632 :
しろうと :04/09/28 23:01:32
>>631 ありがとうございます。がんばって読んでみます。
>>383 それを使ってIVF8.1の試用版をやったら動きました。サンクスコ。
VC6.0なんかは入っていないほうがいいみたいです。
(PATHの設定でなんとかなるのかもしれないけど。)
複素数の虚数部分を取り出す関数を教えてください。
636 :
デフォルトの名無しさん :04/10/01 21:20:55
age
>>635 IMAG()
が使えなければ
(a - CONJG(a) )/2
で定義する。
サンクス。 IMAGで検索したら分かった。 日本語で調べるときは「虚数部」じゃなくて「虚部」なんだな…
AMDのプロセッサにもっとも最適化されているコンパイラって何ですか?
>>639 AMD Core Math Libraryをリンク
ヤーッ ホーッ FORうわなにをするやめ亜wせdrftgyふじこlp;@
ヾ / < 仮面ライダー1000が> ,. -ヤ'''カー、 /Y⌒Y⌒Y⌒Y⌒Yヾ ー―ァ /r⌒|:::|⌒ヾ _ノ オ{( |0| )} オオオォォォォ!!!!! __,ヽ,ヾ,_|V|,_ノ、/ ,r-,,= ,゛==ゝ_ViV_ノ~i/ 〃 `ー―-、 / /⌒`//´⌒c/^^^ )))))))))) ,,―イ {ー''"~{ {~゛`ー`/'`'~/ー--―' )) ,./ゝ_/∧ゝ_ノ ノ ー''" |ロ ロ | 人,_,人,_,人,_,人,_,人,_,人_,人,_,人 < 華麗にスイス民謡をを阻止!> Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒
643 :
デフォルトの名無しさん :04/10/05 22:53:26
遺伝的アルゴリズムのサブルーチンがおいてあるとこってないですかねぇ???
>>643 遺伝的アルゴリズムを利用したサブルーチンは探せば、いっぱいある。
ただ、あくまでアルゴリズムなので、
>>643 がそのまま流用できるソースはないかと。
646 :
デフォルトの名無しさん :04/10/07 08:42:41
プログラムのどこの処理で時間がかかってるか知りたいけど それを解説したサイトってないですかね? 例えばただの計算、IF文、乱数の発生などをそれぞれの処理ごとに時間を計った例とか。
647 :
デフォルトの名無しさん :04/10/07 19:32:25
前任者から引き継いだコードがメインの部分に延々と全ての処理を書いているんです。 どうみても分かりにくいです。 前任者はITの鬼という評判なのでが、なにかこの書き方のメリットはあるのでしょうか? 私はもう書き直そうかと思っているのですが。
Staticオプションを付けるとどう変わるのでつか?
649 :
デフォルトの名無しさん :04/10/08 06:07:26
>>647 メリットは色々あるが、主なものを挙げると
1.サブルーチンの呼び出し/復帰がない分、処理速度が向上する(ような気分になれる)
2.万が一ソースが流出した場合でも、処理の流れがわかり辛いので機密保持に役立つ
3.サブルーチンの名前を考える手間が省ける
「ITの鬼」というより鬼門な人だな。
まあ、世間一般の評判というのは必ずしも実力で決まるもんじゃ無いから・・・
>>646 $ g77-3.4 -pg hoge.f
$ ./a.out # ここで gmon.out が作られる
$ gprof a.out
すると,ズラーっと役に立ちそうな情報が出てきます.
プログラムというのは 最適化をかけない場合と 極限まで最適化をかけた場合では おおよそどのぐらい計算速度に差が出るのでしょうか。 4倍くらいにはなりますか?
implicit none の無いソースを受け継いだ。 動かない。でかい。資料は六法全書のような厚さ。 いったいどうしろと・・・・・・やるしかないか・・・。
653 :
デフォルトの名無しさん :04/10/09 03:12:09
数字を文字列に変換する関数は何でしょうか?
1.dat 2.dat 3.dat ...
というファイルを次々に出力したいのですがやり方が分かりません。
また、
>>635 も私ですが必要な命令の調べ方も教えてくれるとうれしいです。
Visual Fortranをもっています。
>>653 > 数字を文字列に変換する関数は何でしょうか?
> 1.dat 2.dat 3.dat ...
> というファイルを次々に出力したいのですがやり方が分かりません。
こんなんどうですか?
implicit none
character*1 A
integer d
write(unit=6,fmt=*)"A= ",A
d = 5
write(unit=A,fmt="(i1)" )d
write(unit=6,fmt=*)"d= ",d
write(unit=6,fmt=*)"A= ",A
関数の方は知りません。そんなんあるのかな?
655 :
デフォルトの名無しさん :04/10/09 08:50:29
Cとfortranはどっちが速いの?
>>655 アルゴリズムも同じとして,,,
高度なコンパイルが出来るコンパイラがある fortran の方が速いらしい.
だから,どうしても fortran でないとできない問題もあるんだって.
実際に見たわけじゃないけど.
個人で問題になるのは完成までの時間の方だと思うし,
だいたい fortran を使ってたら出来るものも出来無い (俺が問題) よ.
>>653 VFなら、ENCODEという数字を文字列に変換する関数があるが、拡張子をつけて、
ファイル名を作るなら、
>>654 のようにwriteで文字列に書き込んだほうが簡単かも。
implicit none
character*1 fnm1
character*5 fnm2
integer i
integer ide(9)
101 format(i1.1)
do i=1,4
encode(1,101',fnm1) i
open(ide(i),file=fnm1//'.dat')
end do
do i=5,9
write(fnm2,'(i1.1,a4,)'
) i,'.dat'
open(ide(i),file=fnm2)
end do
>>653 >必要な命令の調べ方も教えてくれるとうれしいです。
マニュアルに組み込み手続きの一覧が載っていると思うので
それを概要だけでも眺めてみると良いかと。
先に処理系のマニュアルを見ると,移植性のないコードを書きそうだけれども, Fortran では普通なのかな?
>>659 まともなマニュアルなら、標準と独自拡張ぐらいちゃんとわけて書いてあると思われ。
Visual Fortran のマニュアルも拡張部分は色分けされて書かれてますよ。 FORTRAN 77はともかく、F90/95は処理系のマニュアル以外に ろくな日本語の参考書が無いからなぁ…
662 :
若葉マーク :04/10/12 15:53:44
微分が式の中に入ってる時のprogram上での式の書き方がわからないです。 オイラーとかで展開していくのか、何かコマンドみたいなのがあるのか教えて下さい。 下の式では(∂f/∂s)の表現の仕方がわかりません。 f=(k-h)ln(s'/s) dt=r・(∂f/∂s) k,hは既知です。sは変数です。 print,readで入力します。 誰かお時間ある方・・・教えて下さい
663 :
デフォルトの名無しさん :04/10/12 16:02:35
windowsで使えるフリーのコンパイラを教えてください
>>662 勘違いがありましたらすみません.
read で読んだ式を処理するのですか?
とても難しい問題だと思います.
(GNU bc のソースコードを見てみてください)
また,一般にプログラムには,用意された演算しか書けません.
+, -, *, /, ^ などの演算子の他は (計算機で言う) 関数しか使えません.
「数値計算」について調べてみてください.
微積分などを加減算だけでやる方法の学問といった感じです.
方法はいろいろあります.
解析的な答えを出したいときは,数式処理ができるプログラムを
使用します.数値ではなく記号を扱うので「記号処理」などと呼ばれます.
>>663 g77 を使うなら,cygwin 以外にもありますよ.
MinGW や DJGPP というプロジェクトがあります.
DJGPP にあるプログラムを持ってくれば Unix なコマンド群も
あるから作業しやすいかも.
環境をインストーラでサッサと作ってしまうなら MinGW でしょうか.
666 :
若葉マーク :04/10/12 21:18:24
>>664 の方
有難うございます。
dos画面でsの値をとりあえず手入力してdtの値を一つ一つ計算してもらいたいです。
「数値計算」で調べてみてそれでも駄目ならまた戻ってこようかと思います…
では
レポート厨うざい
>>666 元の関数 f を変形しないのならば,
function f(...) を定義して,
eps=1e-6
dt = r * (f(s+eps,...) - f(s, ...)) / eps
とやればいいと思います.微分の定義そのままです.
変形するなら,df/ds を手で求めてその導関数を使えばいいだけのことです.
PGI fortran win版でdtime命令使うと、0.00000となって経過時間が取得できないのですが、 何をすればよいのでしょうか?
671 :
デフォルトの名無しさん :04/10/13 17:33:32
64ビットXeon用のFortranコンパイラは無いのかなー。
>>670 スタート個所と終了個所で合計2回呼ばないといけないとか
ある配列変数の値をファイルに出力するoutputという名のサブルーチンがありまして、 ソースファイルに call output --------------------A call subfunc という様に並び、subfuncの中身は subroutine subfunc common変数をまとめたファイルのinclude 局所配列変数の宣言 call output --------------------B やりたい計算処理 というように並んでいます。 AとBの値は同じになるはずなのですが、Aは数値でBは!!!!!!!!(非数表示)となってしまいます。 皆様の経験上、この原因としてどのようなミスが考えられますでしょうか?
>>673 fortran90にして、全てのサブルーチンとファンクションの interface を書いておけば
そういうのは無くなるよ。commonも使わないほうがいい
俺もcommonによるバグを最後まで取りきれずに、結局全部 引数渡しにした事があったっけな・・・。 学部の頃はモジュールなんて知らなかったよ。 個人的にはimplicit noneとinterfaceが強制されない仕様が気に入らない。 どうして自由形式になった時に変更されなかったんだろ?
>>672 以下のように2回呼んでいるのですが、
program dtimetest
real dtime
real st,ed,j
real dtime_array(2)
integer i
st = dtime(dtime_array)
do i=1,5000000
j = j + j*j
enddo
ed = dtime(dtime_array)
print *,' elapse=', ed,' user=', dtime_array(1),' system=',dtime_array(2)
stop
end
>>676 dtimeってのはよく知らないけど,system_clockとおなじなら,
ed-stにしないと意味がないような.
>>677 ed-stでやってみたけど、0.00000となった。
ユーザーズ・ガイドのsystem_clockの例を試したけど、
ビルド後の最初の実行時は、経過時間が表示されたが、2回目以降の実行時は
0.00000の表示になった。プログラムを変更しないで、もう一度ビルドした後、
実行すると、経過時間が表示されるが、再度実行すると0.00000の表示になる。
ちなみに、timeコマンドで
time a
とすると、実行時間が正しく表示される。
なんでだろう?
>674 >675 返答ありがとうございます。 なぜ、commonは使わないほうがいいのでしょうか?
>>678 PGI Fortran ってのは知らないけどググったら、こんなん出た。関係あるかい?
ttp://scs.ictp.it/manuals/pgi/pgf77_ref/f77ref08.htm >The routines dtime and etime are only available in a SYSVR4 environment.
>These routines are not available in all environments simply because
>there is no standard mechanism to resolve the resolution of the
>value returned by the times() function.
>679 ・COMMON は グローバル変数のようなものだから、 どこのルーチンで何をされるかわからない。 バグの原因。メンテナンスが困難。 ・COMMON は グローバル「変数」というか グローバル「メモリ」。 変数並びの部分はルーチン間の整合性をコンパイラが担保してくれない。 整合を取るのはプログラマの責任。 バグの原因。メンテナンスが困難。 ・COMMON変数が多くなると、どれがローカル変数でどれがCOMMON変数だか よくわからなくなる。(せめてIMPLICIT NONE であればまだ救われるが...) バグの原因。メンテナンスが困難。 ってなかんじかな
変数のスコープが細かくないのは,Fortran のアプローチなのかな. C で言うブロックを作って,狭い範囲だけで名前を使いたかったりするんだけれど. これができないおかげで速いコンパイラが作れるということなんでしょうか?
>>680 どうもありがとうございました。
NT環境だからなのか?
PGI Fortran winXP環境で、プログラム内で経過時間を測定する
まともな方法を誰か教えてください。
>>682 > C で言うブロックを作って,狭い範囲だけで名前を使いたかったりするんだけれど.
> これができないおかげで速いコンパイラが作れるということなんでしょうか?
狭い範囲で名前付けられるならむしろその方が速いコンパイラ作れそうな気がするなぁ。
デバッガって話題になりました? gdbはFortranに対応ということですが,どうにも情報が少ない気が... idbはintelにバンドルされている以上Fortranに対応していると思うのですが,こちらもあまり情報がありませんよね... 静的なツールに関しても詳しい方いらっしゃったらお願いします.
>681 ありがとうございます。
>>685 なんとなく,フリーソフトウェアの開発している人って,速度より可搬性,移植性を
優先するから Fortran 使ってなさそう...
機能は限られるものの, C でやるように gdb できるみたいですから,それでいいのでは?
gcc, g77 のオプションも gcc が基本ですから.
INTELのFORTRAN(Windows版) の開発環境(VS.NETでしたっけ?)の 使い心地って、どうなんでしょうか?
>>688 ええと,おっしゃるとおりだとは思うんですが, gdbに関するドキュメントってほとんどCのデバッグについてですよね?
Fortranをターゲットにしたドキュメントってないのかなあ?と思ったわけです.
691 :
デフォルトの名無しさん :04/10/17 14:45:05
簡単な解析(固有値解析等)をしたいのですが、FortranとC++で したらどちらを使用した方が良いでしょうか? また、Fortranはどのような目的で使用するものなのでしょうか?
692 :
デフォルトの名無しさん :04/10/17 15:28:11
コンパイルすると Error: Illegal character in statement label field [.]. といるメッセージが出てしますのですが、これは何を意味しているのでしょうか? お願いします。
>>691 C++ で,ライブラリを使うのがベストかと.
Fortran は環境が特殊な場合以外は,強制されるまで使わなくていいと思う.
なんというか,マゾっぽかった (´Д`)
>>692 ifc かな?
f90 からサポートされる free format で書いているのに,
f77 としてコンパイルされているのでは?
ファイル末尾を .f90 にするかコンパイラオプションを使いましょう.
>>691 簡単な解析ならどちらでもいいが、その程度の計算でオブジェクト指向の恩恵はほとんど受けられないと
思われ。CじゃなkてC++にしたいのは何故?
>>695 >>691 じゃないけど,C99 に沿って書かないと言語仕様の制限がキツくないですか?
STL があるだけでも幸せなプログラミングが出来ますし.
やっぱり複素数が無いと.
数値以外のデータには std::list を使いたいものです.
697 :
いなむらきよし :04/10/19 18:33:17
FORTRANのコードをカードにパンチしてた頃が懐かしいキケー!
698 :
デフォルトの名無しさん :04/10/20 17:51:05
今日、初めて「Compaq Visual Fortran」を使い、簡単なプログラムを書いたんですけど、
エラーが出て困っています。
助けて下さい。
状況は
http://www.mcmd.ne.jp/mc/1st/vfhowto.files/frame.htm のHPを参考に開いて、参考書に載っている簡単なプログラムを書いたんですけど
、何をやっても一つのエラーが出てきます。
しかし、以下の方法で開くと、エラーは出ません。
@「Developer Studio」を開き、file→new(新規作成)をする
A「fortran console application」を選択し、プロジェクト名と場所を指定する
Bここで「OK」ボタンを押さずに、Filesタグを押し、file nameを指定し、OKボタンを押す
C最後に、プログラムを書いても、エラーは出ません。
参考にしたHPとはBの過程が違うだけです。
どうしてですか!?
よろしくお願いします!
何と言うエラーメッセージが出るのか教えてもらわないと対処できないよ。 何も「一つのエラー」とかわざわざ曖昧にぼかさなくても... エラーメッセージはエラーの内容を伝えるために存在してるんだろうに。
700 :
デフォルトの名無しさん :04/10/21 00:29:00
>699 699さん、返事が遅くなり、ごめんなさい。 以下にエラーメッセージを載せます。 よろしくお願いします。 Compiling Fortran... D:\研究2004\FORTRAN\練習\sample\sample.for f90: Severe: Invalid argument ... file is 'D:\?????Q?O?O?S\FORTRAN\?u?K\sample\sample.for' Error executing df.exe. sample.obj - 1 error(s), 0 warning(s)
フォルダに日本語使ってるのが悪い。 2バイト文字イクナイ!
702 :
デフォルトの名無しさん :04/10/21 01:18:39
>701 701さん、ありがとう御座います!!! フォルダを直したら、問題が解決しました。 感謝です! 早速、プログラムを書いてみます(^^)
703 :
デフォルトの名無しさん :04/10/21 20:58:36
教科書に載っていたプログラムで解らないことがあったので、教えてください! 質問1. 変数の宣言で、 complex*16 xin(2,0:ndata),y(0:ndata),ww(2,0:ndata+1) と書かれているのですが、*16とは何を意味しているのですか!? 質問2. 変数に値を代入する所で、 pow1=1.0do のように数字の後にdoという文字がありました。 これは何を意味していのですか? よろしくお願いします。
1.倍精度 2.倍精度(doじゃなくてd0)
705 :
703 :04/10/21 21:26:56
704さん、ありがとうございます。 そのキーワードを参考に、もう一度勉強してみます。
リテラルに d0 を付けるのはなぜ? 式に double precision があればコンパイル時に直してくれるような. 変数は double precision 以上しか使いませんよね.最近.
>>706 組み込み関数の「個別名」が嫌いなんで、
例えば、 πが欲しい時なんか 4*atan(1.0d0) ってしてまつ。
atan(1.0)のままだと単精度。
>>706 d0を付けて明示的に倍精度にしないと定数はデフォルトの
realのサイズ(たいてい単精度)になるから。
double precision a, b, c
c = 0.0
a = c + 0.123456789
b = c + 0.123456789d0
write(*,*) a, b
コンパイラのオプションで倍精度をデフォルトにできる場合も
あるけど、古いプログラムを使い回してたりすると COMMON
ブロックのサイズがずれてきて…
>>707 そうですね.忘れていました.orz
>>708 桁が多い実数が,コンパイル時に丸められる可能性もあるんですね.
結局,今どきの実数は全部 `d' を付けておかないとなりませんね.
! 他の言語でも大抵 `e' と `d' はサポートするからいいか...
/Opか/Qprecオプション付けたらいーんでネーノ? Intel Visual Fortranの場合だけど。
711 :
デフォルトの名無しさん :04/10/23 07:20:25
これからfortran勉強する価値はあるの? fortranの他の言語に対する利点て何?
無い 資産が利点になるかどうかは微妙. 他の言語から呼べればいいんだし.
>>711 数値計算に限れば、Cで開発するくらいならFortran90/95使ったほうがはるかにまし。
>>713 呼べないとしたら、今すぐ手放すことをお勧めします。
716 :
デフォルトの名無しさん :04/10/23 21:37:32
>>714 どこらへんがましか、教えていただけませんか?
私的には C/C++ と変わらないように感じるのですが。。。
ちなみに FORTRAN 初心者です。
>>716 >>714 じゃないが、配列機能が最強なところとか?
Fortran90/95の多次元配列の扱いやすさは他言語の比じゃないよ。そのお陰で
より数式に近い形で書けるし。
あと、Cに比べてある程度ハードウェアを覆い隠してくれるのでコーディングしやすい
っていうのもあるね。
しかし、Fortranの文法に古臭さを感じるのも事実・・・。
>>717 これって、C++ の演算子オーバーロードとか使えば
C++ でもあまり変わらないってことありませんか?
fortran は数値計算用だから, 昔から言語の方でそういう仕組みが用意してあったということですね. ちゃんとした C++ 用行列ライブラリもいっぱいあって使いやすいです. C だけでは辛いのは同意.あれは OS を書く言語です.
C++はCを基礎に作られたSM用具です。ゆめゆめ手を出さぬよう...
>>720 > C++はCを基礎に作られたSM用具です。ゆめゆめ手を出さぬよう...
それは分かるが、節度をもって使えば便利だと思うよ。
>>720 > C++はCを基礎に作られたSM用具です。ゆめゆめ手を出さぬよう...
漏れは使いたくないのに強制されるんだよぅ...
C++は必要なものだけを使えばCより使いやすいと思う。 最近までは数値計算の分野ではオブジェクト指向プログラミング の恩恵が少ないと思っていたけど、オートマトンの様に内部状態 を持つモデルの構築をやり始めるとその必要性を感じてきました。
>>723 内部状態!? ならば lisp でクロージャを使うんだ!
C++初心者がOOPを駆使して作ったプログラムはFortranの何倍も遅い場合がある。 コンストラクタとデストラクタが死ぬほど呼び出されてるのも気にせず組んだりするから。 その点、Fotranは良いアルゴリズムさえ用いれば、初心者でもプロでもそれほど実行スピードに 違いは無い(例外はもちろんあるが)。
>>725 > その点、Fotranは良いアルゴリズムさえ用いれば、初心者でもプロでもそれほど実行スピードに
この言語仕様で良いアルゴリズムが組めれば上級 w
>>724 クロージャがどういったものかは分からないけど、C++もboostにありますね。
仮にそこまで勉強して実装したとしても、他の院生や学部生には扱えない罠。
僕の所属している研究室(音声信号関連)では、学生が20人もいるのにどういう訳かCを
扱える人間が一人もいません・・・全員f90コンパイラでFORTRAN77つかってます。(; ;)
728 :
デフォルトの名無しさん :04/10/25 17:35:04
FORTRANのプログラミングってもうフリーソフトでないんですか? サイトに行ってもライセンス取得しないとだめみたいで・・・。
GCC には Pascal やら Ada も入ってるんだよね. ちょっとやってみる人や,やらされる学生はこれでいいのに.
732 :
デフォルトの名無しさん :04/10/25 21:30:28
733 :
732 :04/10/25 21:41:53
>>562 の使い方いまいちわかりません。
教えていただけないでしょうか?
>>733 何がわからないのか
何を教えてほしいのか
が全然わかりません。
>>733 たぶん,統合開発環境が初心者にやさしいとは限らないのでしょう.
いろいろありすぎますからね.
私も最近のボタンをポチポチやる開発には嫌気がさして出来ません.
g77 で hellow, world! から始めた方がいいと思います.
そういうサイトがあるのかは知りません.
>>733 >
>>562 の使い方いまいちわかりません。
1.
>>562 をクリックします。
2. IEのアドレス欄に半角の「h」を書き込み、その後ろに562の3行目
(
ttp:// 〜)をコピペして「移動」を押します。
3. 出てきたページの第一段落の最後、
「You can download FTN95 Personal Edition (FTN95PE) here.」
の「here」の部分をクリックします。
4. ダイアログが出てくるので「ftn95_personal.exe」を適当な場所に
保存します。
5. 保存できたら「ftn95_personal.exe」を実行し、プログラムを
インストールします。
6. 飽きたら「コントロールパネル」の「アプリケーションの追加と削除」
から「Salford FTN95 x.xx」を選択し、アンインストールします。
737 :
デフォルトの名無しさん :04/10/30 14:56:45
xの初期値、終了値、増分を読み込んで exp(x)とlog(x)の値を求めるプログラムを作成したいのですが、 実行結果が x= 0.1 exp(x)= 1.105171 log(x)= -2.3025851 x= 0.2 exp(x)= 1.2214028 log(x)= -1.609438 x= 0.3 exp(x)= 1.3498588 log(x)= -1.2039728 x= 0.4 exp(x)= 1.4918247 log(x)= -0.9162907 x= 0.5 exp(x)= 1.6487212 log(x)= -0.6931472 x= 0.6 exp(x)= 1.8221189 log(x)= -0.5108256 x= 0.70000004 exp(x)= 2.0137526 log(x)= -0.35667487 x= 0.8 exp(x)= 2.2255408 log(x)= -0.22314353 x= 0.90000003 exp(x)= 2.4596033 log(x)= -0.10536048 x= 1.0 exp(x)= 2.7182817 log(x)= 0.0E+0 このようになってしまいました。 xの値の誤差をどうやって消すのか教えてください。
738 :
737 :04/10/30 14:59:05
すいません。自分が作った物を張り忘れました。 real a,b,c,x,y,z write(*,*)'xの初期値、終了値、増分を入力して下さい。' read(*,*)a,b,c write(*,*)"初期値:",a,"終了値:",b,"増分:",c if(a>b) then write(*,*)'もう一度初期値と終了値を入力し直して下さい' stop else write(*,*)" x exp(x) log(x)" do x=a,b,c y=exp(x) z=log(x) write(*,*)"x=",x,"exp(x)=",y,"log(x)=",z end do end if end どこを修正すればいいか教えてください。 お願いします。
739 :
デフォルトの名無しさん :04/10/30 16:47:58
b
>>738 >write(*,*)"x=",x,"exp(x)=",y,"log(x)=",z
に書式指定付けて、xの小数点以下の桁数を短くすれば?
realのdo変数って廃止予定事項だったような。
>>738 これは慣用句だ:
do
if(x.ge.100.0) exit
...
x=x+1.0
end do
743 :
デフォルトの名無しさん :04/11/01 12:07:50
xの値を0〜360度まで可変し(10度刻み)、sin(x)の値を求める。 但し、2次元配列にxとsin(x)の値を収めて、その中身を出力する事。 xとsin(x)の値は一列に並べ、データ個数分の行数(37行)を出力する事。 という問題が解りません。何方か御教授お願いします。
for を使え
>>743 --
program hoge
implicit none
real(8) :: array(2,37)
integer :: i
do i = 1, 37
array(1, i) = real(i - 1)*10.0
array(2, i) = sin(array(1, i))
print *, array(1, i), array(2, i)
end do
end program hoge
--
コンパイルしてないけど,こんな感じかな.
それとも,
>但し、2次元配列にxとsin(x)の値を収めて、その中身を出力する事。
>xとsin(x)の値は一列に並べ、データ個数分の行数(37行)を出力する事。
という問題の意図がわからないというのであれば,私も分かりません.
こんな感じにすると、いかにもFortranっぽい。 program hage implicit none real, parameter :: PI = 3.14 real, dimension(0:36, 2) :: a integer :: i a(:,1) = (/(i*1.0, i=0,360,10)/) a(:,2) = sin(a(:,1) * PI / 180.0) print "(2F10.5)", (a(i,1:2), i=0,36) end program hage
747 :
デフォルトの名無しさん :04/11/02 03:44:47
if文を使ったソースで解らないことがありました。 それは、 if(abs(y(i,in)) .lt. 1.0d-5) then dr(i,in)=1 else dr(i,in)=1/abs(y(i,in))*y(i,in) end if の部分で、 1行目 y(i,in)) .lt. 1.0d-5の後半部分の1.0d-5の意味が解りません。 1-5という事ですか? dは倍数精度で使われると調べたのですが・・・。 是非、教えていただけませんか? 宜しくお願いします!! .
10の-5乗
単精度 →1.0E-5 倍精度 →1.0D-5 4倍精度→1.0Q-5
750 :
デフォルトの名無しさん :04/11/02 14:55:36
751 :
747 :04/11/02 20:42:07
749さん、ありがとうございました。 勉強のし直しです。 また、よろしくお願いします。
・・・。
753 :
747 :04/11/03 11:56:17
748さん、失礼しました。本当にごめんなさい!! ありがとう御座いました。 1.0d-5とは10の-5乗という意味なんですか? 749さんの説明と違いますよね? これは、何か意味のある事なんですか? それとも、どちらも正しいことを言っているのかなー??
754 :
747 :04/11/03 12:08:38
何度もすみません。 748さん、749さんの説明の意図がようやく解りました。 ありがとう御座いました。 また何かあったら相談にのってください。 では、失礼します。
当然ながら、748も749もどちらも正しい。
756 :
デフォルトの名無しさん :04/11/04 17:11:31
fortranを勉強できるサイトを教えてください
>>759 おお『入門Fortran90実践プログラミング』の人ですね。
この本が絶版と知って吃驚してます。
FORALLとDO〜END DOは最適化すれば同じでしょうか?
763 :
デフォルトの名無しさん :04/11/07 12:05:18
fortranでのファイルの読み書きがわかりません。 書き込みだけでもいいので教えてください。 Cの経験はあります。
Visual Fortran(~o~)
open(unit=10,file='unko.txt') write(10,*)'うるせーバカ'
Fortran 90ってC99みたいに可変長配列をサポートしていましたっけ? 当方使っているコンパイラはHP Fortran90とFortran Power Station 4.0 ですが、両方ともコンパイルが通って(一見)きちんと実行できますが・・・。 ↓たとえばこんな感じです。 SUBROUTINE SUB(n) INTEGER n REAL ary(n) INTEGER i DO i=1,n ary(i) = i END DO WRITE(*,*) SIZE(ary) END SUBROUTINE SUB
>>767 Fortran 90ならサポートしてるよ >自動割付け配列
「自動割付け配列」って、ヒープじゃなくてスタックに確保するのかな? 割付けに失敗した時のエラー処理とかもできないよね。 やっぱり、デカイ配列を動的に確保したい時はallocate文を使うほうが無難?
>>769 どこに割り当てられるかは処理系依存だろうけど
どちらにしろ、大きな配列を確保しようとすると
エラーになる可能性がありますね。
エラー処理の方法は私もわかりません(ないのかな?)
エラーで強制終了させたくなかったら、ALLOCATEを使って
ちゃんと確保できたか調べるのが無難みたいですね。
>>767 ありがとうございます。良く見たらマニュアルにも書いてありました。
(かなり簡単な説明でしたが。)
あまり大きな配列でなければ、allocate()、deallocate()を使わなくて済む分便利かもしれませんね。
773 :
デフォルトの名無しさん :04/11/09 12:38:24
FORTRAN77の問題お願いしてもよろしいですか?
775 :
デフォルトの名無しさん :04/11/09 12:47:58
マルチってなんですか?素人なんでまったく知らないんです
いちいち断らずに質問書けばいいじゃないか。 答えたい人は答えるだろ。
777 :
デフォルトの名無しさん :04/11/09 13:07:30
FORTRAN77でお願いします。 ある数xとyのそれぞれの約数xとyの最大公約数と最小公倍数を計算しなさい 関数副プログラム、サブルーチン副プログラムのどちらかを用いること。
>
>>777 とあるテキストの演習問題と全く同じ文体ですね。
780 :
デフォルトの名無しさん :04/11/09 13:31:26
マルチではなくて、あっちには間違えてカキコしちゃったんです
あっちで一言間違ったと書けば何も問題無かったであろうに。 合掌。
謝罪と保障を要(ry 検索エンジンで調べても答が見付かりそう。
783 :
デフォルトの名無しさん :04/11/09 13:48:31
Fortran70から77になっているぞ。
784 :
デフォルトの名無しさん :04/11/09 17:32:27
fortranでOOPする方法を教えてください
>>784 とりあえずモジュール内にprivate属性の変数とサブルーチンを書いておけば、少なくとも
データの隠蔽は実現できます。
>>784 そして、get_hoge と set_hoge を大量に書けよ!
>>784 OOP な言語から Fortran を呼びなさいってこった.
Fortran++がいいよ!
791 :
デフォルトの名無しさん :04/11/15 12:31:27
fortranをこれから学ぶ価値ってあるの
>>791 可能性: 技術的な理由 <<<<<<... (越えられない壁) ...<<<<< 人的な理由
特殊な用途では必要かも知れませんが,そんな時はどうせ特殊なわけで,
fortran をかじった程度の経験では無きに等しいのでしょうね.
というわけで目的なしに学ぶ価値は無しだと思います.
プログラミング全般に言えそうですが > 目的無しに学ぶ
>>792 私の場合、まさに人的な理由ですね・・・。
・過去の資産がすべてFortran
・プログラミングを教える時間に余裕が無い
・ゼロからコーディングする人がいない
・教授がFortranしか知らない
(なんだか愚痴っぽくなってしまった。)
開発環境がPC/WSの場合で、C/C++に対する決定的な
アドバンテージをどなたか教えてください。
>>793 別の高級な言語で書いて,単純で計算量の多いところだけ
Fortran や C で書くと,設計がしっかりしていなくても
動くものが早く (not 速く) 作れますよ.
書くのが大変だと作る前からしっかり設計しないとならなくて大変です.
何も作れません.
って,私のスキルの場合です w
795 :
デフォルトの名無しさん :04/11/18 15:55:17
Cよりfortranの方が速いって本当ですか? どこかにベンチマーク結果とかあるのでしょうか?
うちのがっこうのぱそこんでつかえるもの C Pascal Fortran
>>795 それは「自動車より電車の方が速いって本当ですか?」
と聞いているようなもんだぞ。
使用するコンパイラやプログラムなどの前提条件によって
結果が変わってくるから、答えようがない。
program ... integer v real m v=func(m) write(*,*) v ...(1) stop end integer function func(a) real a ...(途中の処理)... write(*,*) func ...(2) return end というプログラムで(1)と(2)の出力が違ってしまいます。 なぜですか? えろい人おしえてくだちい
じゃないか。
>>798 主プログラムに関数FUNC の宣言がない。
↓
頭文字が"F"の関数FUNCは主プログラムでは実数を返す関数と仮定される。
↓
「v=funv(m)」で呼ばれた関数FUNCが整数値を返す。
↓
主プログラムは戻ってきた値をむりやり実数として読み込む。
(当然、その値はでたらめなものになる)
↓
出力が違ってくる(運が良いとエラーになる)
↓
(゚д゚)マズー
すみません、プログラマ板に書いてしまいました。こっちのほうが適切なようなので、こちらに書かせていただきます。 以下のプログラでは、配列Aの部分配列(スライス)をポインタPと結合しています。 このとき、ポインタの添字の下限値 lbound(P)が1、上限値 ubound(P) が 4 になってしまうんだけど、なんとかポインタPの下限値を結合先Aと一致させる方法はありませんか?ポインタの下限値と上限値をそれぞれ 0 と 3にしたいのです。 program main integer,dimension(0:3,0:3,0:3,0:10),target :: A integer,dimension(:,:,:),pointer :: P p => A(:,:,:,2) print *, lbound(P), ubound(P) print *, lbound(A), ubound(A) end program main 添字の偶奇が本質的なコードを書いているので、ポインタ結合で偶奇がズレてしまうのは、致命的なのです。方法がなければ、cppで対応するしかないのですが、cppはバグの温床となるので、なるべく Fortran の機能範囲内で書きたいと思っています。助言ください。 ちなみに、以下のように、配列A全体を結合させると、結合先と添字の下限値が一致しますが、目的はこのようなコードではありません。 program main integer,dimension(0:3,0:3,0:3),target :: A integer,dimension(:,:,:),pointer :: P p => A print *, lbound(P), ubound(P) print *, lbound(A), ubound(A) end program main
COMMONとDIMENSIONの概要がわからないのですが、 どなたか教えていただけませんか?
common禁止。module使え
>>801 事故フォロー。
できたー。関数を2枚ラッパにつかった。
805 :
tsuru :04/11/22 00:03:55
Salford FTN77でプログラムを実行していたところ 途中で Floating point stack fault at address 〜 という見たことも無い文章がでてきてプログラムが異常終了してしまいました。 今まではちゃんと動いていただけに原因がわかりません。 Googleで調べてみたところ、 はっきりとしたことはわかりませんがメモリーを超過したということなんでしょうか? どなたか教えて下さい!!
806 :
デフォルトの名無しさん :04/11/22 00:57:10
>>805 それだけの情報じゃよくわからんが、
多分関数の呼び出し側と関数の型があってないんだろう。
今までも「ちゃんと動いてた」んじゃなくて
「たまたま実行時エラーがでなかっただけ」の可能性が高い。
FTN77にはデバッガが付属してるから、それでデバッグしろ。
1./BREAK オプションを付けてコンパイルすると
コンパイル正常終了後デバッガが起動するので
「GO」のボタンを押してプログラムを実行する。
2.エラーの発生した箇所で止まるので、
その前後の部分をよく見てデバッグする。
807 :
デフォルトの名無しさん :04/11/22 09:10:20
808 :
デフォルトの名無しさん :04/11/22 17:13:32
integer N, M parameter(N = 4) parameter(M = 5) real a(N, M), pivot, w integer k ! pivot integer i ! row integer j ! column C data ((a(i, j), j=1,M), i=1,N) * /11, 13, 17, 19, 279, * 23, 29, 31, 37, 547, * 41, 43, 47, 53, 817, * 59, 61, 67, 71, 1133 / C write(*, *) "多元連立一次方程式の係数行列と右辺" call matprint(a, n, m) C do k = 1, N pivot=a(k,k) write(*, *) write(*, *) "PIVOT:", k, ",", a(k, k) do j = 1, M a(k, j) = a(k, j) / pivot end do call matprint(a, n, m)
809 :
デフォルトの名無しさん :04/11/22 17:14:04
C do i = 1, N if(i /= k) then w = a(i, k) do j = 1, M a(i, j) = a(i, j) - w * a(k, j) end do end if end do write(*, *) call matprint(a, n, m) end do end C subroutine matprint(matrix, n, m) real matrix(n, m) integer n, m, i, j C do i = 1, n write(*, 600) (matrix(i, j), j= 1, M) end do 600 format(1h , 10(G15.7:)) end
810 :
デフォルトの名無しさん :04/11/22 17:15:57
>>808 >>809 のプログラム(808の続きが809です)を次の様に改良せよ。
1.PIVOTが0になると、割り算が出来ないので、
「0」で割らないようにする。
2.PIVOTより下の要素を計算しないようにせよ。
また、PIVOTがほぼ0(10のマイナス20剰ぐらい)になって
しまう数値の例を試し、正しくプログラムが動くことを確認せよ。
どういう根拠で正しく動いたと言えるのか説明せよ。
という課題が解りません。どのように改良すればいいか教えてください。
宜しくお願いします。
レポート厨うざい。
812 :
810 :04/11/22 17:22:54
ちなみにPIVOTより下の要素を計算しないようにせよ。というのは a(1,1) a(2,1),a(2,2) a(3,1),a(3,2)a(3,3) a(4,1),a(4,2)a(4,3)a(4,4) の値は計算しないようにすると言う意味です。 何方かどうか宜しくお願いします。
ある意味すごいな。
>>810 冬休み前の宿題か?
それにしても固定形式なのにF90風の文法を
多用していて中途半端な書き方だな。
ここまでするなら完全に自由形式で書くか
互換性重視でF77準拠の固定形式で書くか
どちらかにした方が良いのに。
>>814 下手な煽りだな
中途半端な煽りなら止めとけばいいのに
>>810 奥村先生の「C言語による最新アルゴリズム事典」を参考にすると良いかも。
俺は似たような問題(学校の課題ではないけど)を解くのに
中身のプログラムをそのままFortranに直して使った。
>>810 Fortranより算数の勉強からはじめてください
818 :
デフォルトの名無しさん :04/11/25 22:17:52
age
お勧めのコンパイラってなんでしょう?
>>819 何をしたいのか書いてくれないとネタカキコしかできませんよ.
824 :
デフォルトの名無しさん :04/11/30 17:21:14
fortranでメールサーバはかけますか?
書けないことも無いが、お勧めしない。
fortranって・・50年も前の言語なの?wwwwww
>>826 古いものを笑ってはいけない。
FORTRAN は私も笑うけど、Lisp を笑ったらあかん。
>>823 その通りですね、すみません。
昨年研究室で買ったアスロン64FX−51のマシンを
使ってCFDの計算がしたいのです。OSはwindows2000が入ってます。
829 :
デフォルトの名無しさん :04/12/01 03:25:57
FORTRANは古いがFortranは古くない. そういや最初のLispはFORTRANで書かれたらしい.
>>830 うそーん。FORTRANで構文解析なんて、いくらS式がparseしやすいっていったって無理だろう。
C++ beta2005じゃだめなのかぁああああ!visual fortran
初期のフォートランて、間にスペースがなくても大丈夫だったんだよね。クレージーな言語だとオモタネ
>>833-834 す、すげーぜ…。俺なんかわかりやすいフォーマットの入力データ読むときのFORMATでも右往左往してる。
_| ̄|○
まあ、昔はどのコンピュータでも汎用的に使える言語が
FORTRANくらいしかなかったからね。
今なら迷わずC言語で書くようなプログラムもFORTRANで
つくってたんだよ。
>>835 最新のコンパイラでも固定形式で書くと
空白を無視したり、73桁目以降を読み捨てたりしてくれる
とってもステキな言語です(泣
838 :
デフォルトの名無しさん :04/12/02 05:21:17
f77とf90の違いを教えてください
>>837 > 今なら迷わずC言語で書く
今なら C++ で書くのが普通だろ。
Fortranで書くメリットはデバッグのしやすさが一番かな。 C/C++で書いたときに出る例外エラーはつきとめるのがFortranと比べると遥かにややこしいと思う。
>>840 Fortran ではデバッグの段階まで書くこともできない私は OTZ
みなさん,どの言語でも同じ期間に完成させられるという
前提に立っているように感じます.
842 :
デフォルトの名無しさん :04/12/03 19:46:54
複素数aの実部と虚部をキーボードから入力し、偏角θを求めるプログラムの作り方を教えて下さい。 おねがいします。
>>842 read(*,*)ar,ai
write(*,*) atan(ai/ar)
end
バグあり。デバッグは任せる。
844 :
デフォルトの名無しさん :04/12/03 21:53:12
FORTRAN 77, Fortran 90, Fortran 95 の中で、どれを一番勉強すべきでしょうか? 77 と 90 でずいぶん言語仕様が違うようなので選択に困っています。 よろしくお願い致します。
>>844 Fortran90はFORTRAN77のすべての仕様を含んでいる。
Fortran95はFortran90のほぼすべての仕様を含んでいる。
(一部古い機能が廃止されているが、今となってはほとんど使わない機能ばかりだ)
よってこれから勉強するのなら、Fortran95が良い。
>>838 f90 = 数値計算向けの手続き型言語
f77 = 縄文式スパゲッティ製造器
全部。 ひとつしかやりたくないんなら、C++とか他のやったほうが良い。
>>845 ありがとうございます。
大変参考になりました。
cygwin g77じゃ わけのわからんメモリ関係のエラー? FTN95じゃstackoverfllow しっかし・・・visual fortran?なら動く・・・ なぜ?
>>848 たぶんVisual Fortranでも /check:all オプションを付けてコンパイルすると
実行時エラーがDELL。
FTN95 コマンドプロンプトからなら動いた・・・ Plato3で作ったexeはoverflowするのに・・・orz 意味わからん・・・orz
852 :
デフォルトの名無しさん :04/12/06 00:58:48
こういう場合ってどうなるの? subroutinの中の話だけど if (条件) goto 10 文 文 文 10 continue
条件が満たされてなければ、文文文がただ実行されるだけでは?
条件がTrueならば? スルーするってこと? とんだ先のcontinueには意味ないってこと? 実際には↓みたいになってるからさっぱりわからん(TT) 昔の人はすごいな〜 if (条件) goto10 ごちゃごちゃ if (条件) goto20 ごちゃごちゃ 20 continue ごちゃごちゃ 10 continue
>>854 if (条件1) go to 10
文1
if (条件) go to 20
文2
20 continue
文3
10 continue
1. 条件1が .TRUE. なら何もしない。
2. 条件1が .FALSE. で
2-1. 条件2が .TRUE. なら文1、文3の順で実行される。
2-2. 条件2が .FALSE. なら文1、文2、文3の順で実行される。
> とんだ先のcontinueには意味ないってこと?
入門書読んで出直してこい。
856 :
デフォルトの名無しさん :04/12/06 12:11:18
データの個数をキーボードから入力し、その個数分だけ整数を入力。 入力された整数を1次元配列に格納し、値が小さいものから順に(flagを使って)出力。 というプログラムってどうやって作るんですか?誰か教えてください。
>>856 Fortranとは関係ない。
プログラミング初心者は素直にアルゴリズムから勉強しろ。
>>856 program hage
integer :: n, i, a0, a(1073741824), flag
print *, "データの個数を入力しろ."; read *, n
print *, n, "個の整数を小さい順に入力しろ."; read *, a(1:n)
a0 = a(1)
do i = 1, n
flag = a(i)
if (flag < a0) then
print *, "入力データが不正だ!気分が悪いので終了する."
stop
end if
print *, flag
a0 = flag
end do
end program hage
859 :
デフォルトの名無しさん :04/12/08 11:43:29
fortran中級者向けのホームページを教えてください
数字を入力したら三桁ごとにコンマうつプログラムを作りたいのだけども、 誰かたすけて(例 12,345,678)fortranをつかっています。 character(100) x,z(1:100),v,k,kk integer y,s,w,i,a,b,amari write(6,*) '正の整数を入力してください。' read(5,*) x k=adjustl(x) x=adjustr(x) y=len_trim(k) if(y<3) then write(6,*) y write(6,*) '3桁以内なのでプログラムを終了します。' else a=103 b=101 w=y/3 amari=mod(y,3) kk=k(1:amari) s=100-y-w+2
do i=1,w a=a-3 b=b-3 z(i)(b-1:a)=','//x(b:a) if(i==1)then v(b-1:100)=z(i)(b-1:a) else v(b-1:100)=z(i)//z(i-1) end if end do end if write(6,*) trim(trim(kk)//trim(v(s:100))) end 配列の使い方とかおかしいかも知れません。 大分考えましたが解決できないのでお力を貸して頂きたいです。
>>861 難しく考えすぎだと思います.
文字列をコピーする方法を考えてください (後ろからの方がいいです).
で,3 文字コピーするごとに ',' を入れればいいんじゃないでしょうか.
もっと簡単な方法もあるかも知れませんが.
864 :
デフォルトの名無しさん :04/12/11 08:16:53
>>861 数値を文字列に変換する方法がある。
FORTRAN66のENCODE/DECODE文。
FORTRAN77の内部ファイル。
Fortran90のTRANSFER文。
内部ファイルでのやり方を書いておこう。
CHARACTER*5 buff
....
n = 1
WRITE(buff(1:1), '(i1)') n
WRITE(buff(5:5), '(i1)') 2 * n
こうするとbuff = '1 2' となる。
あとは、
>>863 の言うように、MOD(n, 10**k) で1桁ずつ切り出して
文字列に書き出して、3文字毎に','を書き出せばよい。
補足:
パソコン、WSでよく使われるASCII CODEを用いた文字−数字変換は、
EBCDICが普通だったメインフレーム、スパコンでは使えなかった。
>>864 焦点がずれてるよ.
861は最初から文字列で数字を入力させてるんだから,内部ファイルとか関係ないし.
863がいうのはこんな感じかな?
--
program test
implicit none
integer, parameter :: MAX = 100
integer :: i
character(MAX) :: number, sepd_number
print *, '正の整数を入力してください。'
read(*,'(a)') number
number = adjustr(number)
sepd_number = number(MAX-2 : MAX)
do i = MAX-3, 1, -3
if (number(i : i) == ' ') exit
sepd_number = number(i-2 : i) // ',' // sepd_number
end do
print *, sepd_number
end program test
--
866 :
デフォルトの名無しさん :04/12/11 16:20:39
intel fortran compiler for linux 8.1を使って NCAR Community Atmospheric Model (CAM3.0)を使うとき gmakeして undefined reference to `history_mp_fincllonlat_' というエラーがでたらIFCを最新のversionにかえるとよい。
real変数に1を代入するとの1.0を代入するのって違うの?? real x x=1 x=1.0
結果は同じだが余計な処理が入る可能性がある,かな? コンパイラのオプションには,「アセンブリコードにする」ものがあるから 双方のアセンブリコードを比較することができます. でも始めから型に合わせたリテラルを書くのがいいと考えています. x が double precision なら「x = 1.0d0」と書くなど.
869 :
デフォルトの名無しさん :04/12/14 17:04:48
出力書式fmtの使い方教えてください!
初心者の質問で申し訳ないのですが 急にFORTRANのプログラムを使わないといけなくなったのですが、どうしたら良いのか分かりません。 どうやらMS-FORTRANで作ったそうで、実行ファイルはあっても動きません。 ソースファイルは残っているのですが、どうすれば良いのでしょうか? よろしくお願いします。
871 :
デフォルトの名無しさん :04/12/14 19:24:21
Salford FTN77 Personal Edition Compiler には、組み込み関数は入っていないのでしょうか? 乱数の生成プログラムを書きたいのですが。
>>870 実行ファイルが動かない原因が判らないなら、ソースをコンパイルしても動かない確率が高いな。
どう動かないのか詳しく書かないと全然分からない。動かないなら、エラーメッセージなんかが出るの?
>>871 組み込み関数は入ってますが、乱数生成ルーチンはFORTRAN77標準ではありません。
FTN77用の乱数関係の組み込み関数ならUserGuide.pdfの344頁に説明があります。
integer i
double precision a
double precision random
read(*,*) a
call set_seed@(a)
a = random()
C 0.0D0 < a <= 1.0D0
write(*,*) a
call date_time_seed@
do i = 1, 10
a = random()
write(*,*) i, a
end do
end
874 :
デフォルトの名無しさん :04/12/14 20:44:57
>>873 どうもありがとうございます。
もう少し勉強してみます。
875 :
デフォルトの名無しさん :04/12/15 07:33:57
>>869 質問が曖昧すぎるが、外し気味に答えてみるw
write(*, fmt='(a)') 'mako-tan sama'
write(*, '(a)') 'kako-tan sama'
print '(a)', 'aiko-tan sama'
みな同じこと。コンソール出力。
fmt=は省略可。文字列の中身はFORMAT文中に書く物と同じ。
文字列は文字定数である必要はなく、変数であってもよい。
つまり出力データ毎にフォーマットを動的に変えるという荒技も出来るがバグの元。
876 :
デフォルトの名無しさん :04/12/15 08:52:28
>>875 曖昧な質問なのに丁寧にありがとうございました。
877 :
デフォルトの名無しさん :04/12/15 10:41:42
Visual Fortranで3次元の高速フーリエ変換をしようと思っています。 ISMLライブラリを使ってみたのですがどうも結果がうまく出ません。 80*80*80の立方体を変換したいのですが要所だけを以下にコピペします。 結果は全ての座標が0になります。 どこがおかしいのでしょうか? USE NUMERICAL_LIBRARIES ・・・ CALL FFT3F(80,80,80,GC1,80,80,GC2,80,80)
878 :
デフォルトの名無しさん :04/12/15 13:09:04
サンプル数が2のべき乗に制限されてるとか 単に多すぎるだけとか。 何なら16x16x16 ぐらいで試してみそ。
最適化のレベルによって計算結果がおかしくなってしまう場合 最適化しても同じ結果になるようにソースを書き換えるのか 最適化しないオプションを指定してこんぱいるするのか、どっちが基本でしょうか。
最適化したら結果がおかしくなるって・・・・コンパイラのバグじゃんそれ。
881 :
デフォルトの名無しさん :04/12/16 05:02:06
>>877 それだけでは要所にならない。せめて使用配列の宣言部が必要だ。
FORTRAN77だと、型のチェックと整合配列のチェックを人間がやらないといけないからだ。
一般論だが、外部ライブラリでうまくいかない場合。
1.イニシャライズのし忘れ。(配列のクリア。イニシャライズルーチンの呼び忘れ。等)
2.配列の型、サイズを間違えている。
というパターンが、多い。
今回のチェックポイントは
0.GC1、GC2は単精度複素行列になってるか?
1.GC1、GC2の大きさが、呼び出し時の引数と矛盾していないか?
2.変換前のGC1に値がちゃんと入っているか?
(呼び出しは正しいが、0しか入ってないと、当然GC2は0だ)
>>878 の意見に関してだが、
IMSLのマニュアルを見る限り、配列サイズが2のべきである必要はないようだ。
まず小さいマトリクスで試してみよという意見には賛成だ。
>>880 intel fortran compiler 8.1なんですけどね。
CPUもintelのXEON使ってます。
884 :
デフォルトの名無しさん :04/12/16 11:50:17
FORTRANでの変数の型のキャストについて質問させてください。 現在、ソース中で、 A(B+C) = D となっている部分があります。A(*)は配列です。 コンパイルしますと、 "A has non-integer subscript" と表示されます。 添え字の(B+C)が整数だと認識されていないようですので、 (B+C)を整数にキャストしたいのですが、その方法を見つけることが出来ませんでした。 とりあえず、勘に頼って A(int(B+C)) = D としたところ、エラーは出なくなったのですが、 コンパイラのマニュアルやFORTRAN入門書をみても、web検索をしてもint(*)という関数がみつからず、 これでいいものかどうか悩んでおります。 BおよびCの変数宣言をINTEGERを用いて行うのも1つの方法かと思われるのですが、 ソースが自分のものではないため、出来る限り問題のある箇所以外は触らないようにしたいと考えております。 利用コンパイラはSalfordのFTN77です。 よろしくお願いいたします。
暗黙の型 明示的に型宣言をしない場合,下記の約束がまもられる.Fortranの特徴の1つである. I, J, K, L, M, N で始まる変数は 整数型 と解釈される. 例 IJ, NO, JX, KOSU A〜H, O〜Z で始まる変数は実数型 例 ATOM, XCORD, COORD, MAX
887 :
884 :04/12/16 12:26:33
>885,886 ありがとうございます。 おかげさまで解決いたしました。
888 :
デフォルトの名無しさん :04/12/16 12:50:25
はじめまして。どうしても分からないのが2つ。 1+2+3+4+5+6+7+8*9=100のように、1,2,...,9の9つの数字の間に +−×÷の記号を1つずついれて、計算結果が100になるような算術式を全て求めよ。 ただし、除算はFORTRANの整数除算ではなく、通常の算術計算であるとする。 という問題と、 n×nの実数正方行列A={a(i,j)}の行列式|A|を、再起手続きを使って求めよ。 Aの第1行第j列を抜いた残りの部分行列をA'(j)とするとき、行列式|A|は、 |A|=a(1,1)|A'(1)|-a(1,2)|A'(2)|+a(1,3)|A'(3)|... =破=1〜n a(1,j)|A'(j)|*(-1)**(j+1) で与えられる。ただし、1行1列の行列{a}の行列式は要素aそのものである。 という問題の2つなのです。助けてくださいm(- -)mお願いします。
とりあえず何が分からないのかを考えてみよう. おそらく,何が分からなくてできないのかがわかってないみたいだから. 単に宿題の丸投げなら誰も助けてくれないだろうけどね.
890 :
デフォルトの名無しさん :04/12/16 15:46:38
最初の問題だと、+とか÷などの記号は文字配列だとその意味をなさないので、 どうすればいいのかいきなり詰まっています。
891 :
デフォルトの名無しさん :04/12/16 17:45:55
>>888 Fortran90だと再帰呼び出しが使えるが、FORTRAN77だと使えない。
どちらが対象かで難易度がずいぶん変わってくる。特に2番目。
どっちかな?
>>890 じゃあ,記号の意味をFortranに教えればいいよね.
893 :
877 :04/12/17 05:57:08
だめです。 16*16*16でやってみましたが結果は全部0になります。 変数は全て正しい型で宣言しています。 少しいじくって2次元のFFTではうまくいったんですがお手上げです。 便乗質問ですが、 今回の3次元FFTはそれ自体が目的ではなく他の計算の確認のためです。 3次元の立方体で特定方向に各配列の要素の和をとって2次元配列を作ります。 その2次元配列をフーリエ変換しフーリエスペクトル(実数部の二乗と虚数部の二乗の和)を求めます。 数学に疎いのでよく分かりませんがスペクトルのイメージは上下左右対称のはずらしいですが 私の作ったコードでは正確に対称にはなりません。 3次元FFTはコードが正しいかどうかの確認のためです。 しかし、私は任意のイメージのフーリエスペクトルが対称型になることがいまだに理解できないのですがどうなのでしょうか?
894 :
デフォルトの名無しさん :04/12/17 08:44:00
フリーのVisual C++を使おうとしているWinプログラマ初心者です。 あるソースを 落としてきてビルドしようとしているのですが、途中でNMAKEが以下のエラーを 吐きました。 NMAKE : fatal error U1071: cycle in dependency tree for target 'c:\Documents' ファイルはC:\Documents and Setting\washi\..... の下に置いているのですが、 ファイルパス名に空白が入っているのをNMAKEがチョチョギっているような 気がします。 どう対処したらよいのでしょうか?
895 :
1/2 :04/12/17 09:17:59
>>890 参考にしてちょ!
MODULE mod_eval
IMPLICIT NONE
INTEGER :: inum(5) = (/1,2,3,4,5/)
CHARACTER :: ops(5) = (/ '*', '+', '-', '/', '='/)
CONTAINS
SUBROUTINE eval(res, op_next)
IMPLICIT NONE
REAL , INTENT(OUT) :: res
CHARACTER, INTENT(OUT) :: op_next
INTEGER, SAVE :: ipos = 1
res = REAL(inum(ipos))
DO
SELECT CASE (ops(ipos))
CASE ('+', '-', '=')
op_next = ops(ipos)
ipos = ipos + 1
EXIT
CASE ('*')
ipos = ipos + 1
res = res * REAL(inum(ipos))
CASE ('/')
ipos = ipos + 1
res = res / REAL(inum(ipos))
CASE DEFAULT
PRINT *, 'ipos=', ipos, ' op=', ops(ipos)
STOP 'eval'
END SELECT
END DO
RETURN
END SUBROUTINE eval
END MODULE mod_eval
896 :
2/2 :04/12/17 09:19:21
!==================================================
PROGRAM main
USE mod_eval
IMPLICIT NONE
INTEGER :: inum(5)
REAL :: sum, tmp
CHARACTER :: op, ops(5)
sum = 0.0
op = '+'
DO
SELECT CASE (op)
CASE ('+')
CALL eval(tmp, op)
sum = sum + tmp
CASE ('-')
CALL eval(tmp, op)
sum = sum - tmp
CASE ('=')
EXIT
CASE DEFAULT
PRINT *, 'op=', op
STOP 'main'
END SELECT
END DO
PRINT *, 'value =', sum
STOP
END PROGRAM main
インデント死んだw
>>895 ,896
897 :
デフォルトの名無しさん :04/12/17 11:11:02
>>893 これで試して味噌。
PROGRAM test
USE NUMERICAL_LIBRARIES
IMPLICIT NONE
INTEGER :: i, j, k
REAL :: pi
COMPLEX :: gc1(8, 8, 8), gc2(8, 8, 8)
pi = 4.0 * ATAN(1.0)
gc1(1:3, 1:3, 1:3) = (1.0, 1.0) / REAL(3**3)
CALL FFT3F(3, 3, 3, gc1, 8, 8, gc2, 8, 8)
print *, gc2(1, 1, 1)
!
DO i = 1, 6
gc1(i, :, :) = EXP( CMPLX(0.0, 2.0 * pi * REAL(i - 1) / 6.0 ) ) / REAL(6**3)
END DO
CALL FFT3F(6, 6, 6, gc1, 8, 8, gc2, 8, 8)
print *, gc2(2, 1, 1)
END PROGRAM test
最初のFFTはδ関数を出すので、gc2(1,1,1)に1が立つ。
2個目のFFTは、x軸方向にのみexp(i2π(k−1)/N)の変化があるのでgc(2,1,1)に(1.0,0.0)が立つ。
出力例:
(1.000000,1.000000)
(1.000000,3.8894690E-08)
これ以外は0になる。E-7~E-8 のオーダーの数は単精度の誤差で0とおなじ。
対称になるのは、折り返しとかの事情だろう。行列要素は実onlyかな?
898 :
デフォルトの名無しさん :04/12/17 13:36:06
2問を書き込んだ者です。 FORTRAN90を使っています。 記号の意味をFortranに教える、というのは、どういうことなのでしょうか? a(4) = (/ '*', '+', '-', '/'/)で、 a(1) = * のようなことではダメですよね。 文字を計算式に使うと変なことになってしまいますし、 お手上げの現状なのですが...
899 :
デフォルトの名無しさん :04/12/17 14:41:51
>>898 >記号の意味をFortranに教える、というのは、どういうことなのでしょうか?
その書き込みは無視したほうがいいw
CHARACTER :: a(4)
a(1) = '*'
なら文法にかなっている。
900 :
884 :04/12/17 15:00:19
昨日、型変換について質問させていただいたものです。 もう一点、お聞きしたいことがあるのですがよろしいでしょうか。 比較演算子に関してなのですが、現在、 IF (A . NE . B) THEN と記述されている箇所がありまして、コンパイルを行いますと、 "The use of .EQ. or .NE. with non-integer operands can produce misleading results" と表示されます。コンパイラはSalford FTN77です。 論理素子AとBが整数型でないことが原因だと思われ、ソースを IF (int(A) . NE . int(B)) THEN と改変するとエラーは消えます。 ただ、実際にはAやBが実数で、その値を比較している場合もあると思われ、 勝手に整数にまるめても良いものか、悩んでいます。 FORTRANでは.NE.および.EQ.で比較する場合、その値は整数で無ければならないという決まりがあるのでしょうか? 参考書やweb等で調べた限りでは、そのような約束事はみつかりませんでした。 何度も申し訳ありませんが、もしよろしければお教えくださいますか。 お願いします。
901 :
デフォルトの名無しさん :04/12/17 16:01:50
>>900 結論から言うと、INT型にはしないほうがいい。変にいじらないほうがいい。
それは、エラーではなくウォーニングだろう。コンパイラによっては、この種の警告を与える。
浮動小数点の実数の場合、イコールを取る意味が曖昧なので注意しろと言ってる。
その辺の事情が分かった上でイコールを取るなら問題ない。
移植しているのならば、とりあえずプログラムを書いた奴を信じるしかないw
これはFORTRANに限らず、浮動小数点一般の問題だ。
”その辺の事情”を知りたいなら、桁落ちとかで検索して浮動小数点の誤差について調べてみるとよい。
たぶん実数ではイコールを取る意味が無いとか色々書いてあるはずだ。
>>900 a = 0.0
do j=1,10
a = a + 0.1
do i=1,10
b = i * 0.1
if (a .eq. b) then
write(*,*) a, ' = ', b
else
write(*,*) a, ' <> ', b
end if
end do
end do
end
903 :
あるのかな? :04/12/17 17:22:56
プログラムの実行時間を測定したいときはどういう関数を使えばいいの?
904 :
デフォルトの名無しさん :04/12/17 17:41:19
>>903 Fortran95から CPU_TIME という関数が用意されている。
大概のFortran90コンパイラでは、規格先取りで採用されている。
これ以外にはDATE_AND_TIMEという時計サブルーチンが存在している。これは90の正式規格。
FORTRAN77時代は、FORTRANの規格としては時間がらみの関数・サブルーチンは存在しない。
しかし、各ベンダーが用意した固有のルーチンが大抵用意されている。
マニュアルのお終いの方の非標準関数のあたりをあさってミソクソテクニック。
905 :
903 :04/12/17 18:01:39
現時刻を得る関数もあるのかな? プログラムはC言語から始めたので何とも使い勝手が悪く感じるんだが, 気のせい?
>>905 気のせいではない。計算速度の速さを除いては、糞言語ですから。
>>905 サブルーチン DATE_AND_TIME
西暦と時刻を返す。
FORTRANはバッチ処理で実行されることが多い。
TSS処理が前提のC言語とは歴史的な事情が違っている。
908 :
884 :04/12/17 19:59:19
>901 そうです、ウォーニングでした。 なるほど、実数だと厳密にイコールであるという意味が曖昧なのですね。 感覚的にですが、なんとなくわかる気がします。 非常に勉強になります、ありがとうございました。 昨日から色々と作業しておりましたが、 皆様のおかげで先程なんとか希望の結果が得られるプログラムができました。 どうもありがとうございました。
#include <stdio.h> void main() { FILE *fp_in, *fp_out; int gen, kob, average; int n; fp_in = fopen("seiseki.txt", "r"); if( fp_in == NULL ) { printf("Can't open 'seiseki.txt'\n"); return; } fp_out = fopen("kekka.txt", "w"); if( fp_out == NULL ) { printf("Can't open 'kekka.txt'\n"); fclose(fp_in); return; }
for(;;) { n = fscanf(fp_in, "%d%d", &gen, &kob); if(n != 2) { if(n != EOF) { printf("fscanf error.\n"); } break; } average = (int)( ( (float)(gen + kob) / 2.0 ) + 0.5 ); n = fprintf(fp_out, "%d %d %d\n", gen, kob, average); if(n < 0) { printf("fprintf error.\n"); break; } } fclose(fp_in); fclose(fp_out); } プログラム1で現国と古文の点数を入力し、プログラム2でその平均点を出力するという問題を解きたいんですが、 FORTARNでのプログラム2がどうにもうまくいきません。 何方か上記のCのプログラムをFORTARNに翻訳して下さい。 どうかよろしくお願いします。
エクセルでやれ。
>>903 system_clockっていうサブルーチンがなかったけ?
intelとpgiにはあるけど規格外かな.
914 :
デフォルトの名無しさん :04/12/18 05:20:03
>>913 あります。Fortran90の規格です。
でも、CPU消費時間ではなく、ある原点からの積算の秒数を返していたと思います。
ずーーーと1,2,3・・・・と指折りしながら数えてる律儀なサブルーチンさん!
>>912 すいません。どれをダウンロードしてどう使えばいいか解らないです・・・。
教えてください。
>>915 c2f.zipだけでいいだろ。
で、cというフォルダにdebug.cを、fというフォルダにc2f.fdとc2f.fiとc2f_lib.f90を
入れる。
c2f.exeを起動し、debug[enter]と押すと、debug.cがfフォルダにdebug.f90という
名前で生成される。
で、
>>909 >>910 のプログラムを翻訳してみたが、fscanf()とfprintf()がうまく翻訳
されなかった。どうも一文字単位の入出力しか現在の所サポートしていないようなので、
その部分は手でちまちまとエディットするしかない。
あと、FORTRAN90のソースになるので、FORTRAN77に変える場合は、他の翻訳
プログラムを探そう。探してないが、さすがにあるだろう。
質問です。 一つのファイルの中にデータが複数個あり、(例えば、"DATA.TXT"というファイルの中に、1,2,2,4,3,3,1,1,4,3,2,1という12個のデータが入っている) それらを読み込み、データの数字ごとのファイル(ファイル名=データの数字)をプログラム中で新たに作り、 それぞれのデータを該当番号のファイルの中に出力する(仕分けする)というものです。 (例では、"1"は"1.TXT"というファイルを作り、そこへ出力し、結果、"1.TXT"の中には"1"が4つ入っている。"2.TXT"には"2"が3つ。他同様。) GO TO文は使わず、DOループとIF文のみで作りたいと考えています。 当方プログラム初心者でして、また、ファイル中のデータ量が多い(10万個)ため、苦戦しています。 初歩的な質問で申し訳ありません。宜しくお願いします。
>>917 そういう処理ならawkなんかのスクリプトでやった方が
手っ取り早いと思うけど。
BEGIN { FS = ","; max = -1 }
{
for (i=1; i<=NF; i++) {
data[$i]++
if ($i > max) max = $i
}
}
END {
for (i=1; i<=max; i++) {
if (data[i] != 0) print data[i] > i ".TXT"
}
}
>>916 おかげで何とか完成できました。
丁寧な解説有難う御座います。
>>918 ありがとうございます。
しかし、残念ながらFORTRNしか分からないものでして・・・
せっかく教えていただいたものも、理解できない状況です。
申し訳ありません。宜しくお願いします。
>>920 Fortran が使えて awk が使えない人はいないから,
とりあえず使い方を調べてみませう.
Fortran を捨てたくなるかもね.
awk で扱うのが自然な問題は awk でやるのが一番楽です.
宿題は他にないのか?
>>917 そのDATA.TXTの中身がどういう書式で書かれているかで
書き方がずいぶん変わってくるかと。行ごとに1個の数字しか
書いてなければ話は簡単だとは思いますが・・・。
PROGRAM test
IMPLICIT NONE
CHARACTER(len=260) :: infile = "DATA.TXT"
CHARACTER(len=260) :: outfile
CHARACTER(len=16) :: cnum
INTEGER :: ios
OPEN(1,FILE=infile,STATUS="old",iostat=ios)
IF(ios /= 0) STOP
DO
READ(1,*,iostat=ios) cnum
IF(ios /= 0) EXIT
WRITE(outfile,*) cnum(1:LEN_TRIM(cnum)) // ".txt"
OPEN(2,FILE=outfile,POSITION="append")
WRITE(2,*) cnum(1:LEN_TRIM(cnum))
CLOSE(2)
END DO
CLOSE(1)
END PROGRAM test
924 :
デフォルトの名無しさん :04/12/20 22:09:44
学生さんはもう冬休みか。 いいねぇ。
あんたも昔は学生だっただろ
926 :
デフォルトの名無しさん :04/12/20 22:12:13
てすと
927 :
デフォルトの名無しさん :04/12/21 04:26:14
マターリいこうや、ロートル諸君!
928 :
KG :04/12/21 10:28:59
Matlabのmファイルをfortranのソースファイルに変換するツールをご存じの方が いらっしゃれば教えて下さい。
google ですぐに見つかるやつは違うの?
930 :
KG :04/12/21 18:15:55
googleで見つかるやつは,まだツールが公開されていないそうで...
931 :
fortran :04/12/23 22:47:57
エラーについて質問させてください>< forrtl:error (75): floating point exception 0: __FINI_00_remove_gp_range[0x3ff81a6de38] ・ ・ ・ 実行するとこのようなエラーが出てしまうのですが・・・ 0で除算していることは決してないのでオーバーフローなのかあぁ・・・
>>931 OSやコンパイラの種類もわからない
何をしようとしていたのか、ソースもない
そんな状態で何を答えろと?
>>932 禿同
まぁ、あとは、sqrt(a)やa**3でa<0とか、
934 :
デフォルトの名無しさん :04/12/24 07:48:59
935 :
877 :04/12/26 00:29:47
すいません。うえの方でFFTについて聞いたものです。
>>897 さんのコードはうまく動くのですが自分のコードは全部0になります。
元のコードから編集したのをコピペするので見てもらえないでしょうか?
USE NUMERICAL_LIBRARIES
INTEGER N
INTEGER G(16,16,16)
INTEGER I, J, K
REAL GRI(16,16,16)
CHARACTER FILENAME*15
101 FORMAT(16E16.8)
N=16
DO K=1,N
DO J=1,N
DO I=1,N
IF(MOD(I,2)==1.AND.MOD(J,2)==1.AND.MOD(K,2)==1)THEN
G(I,J,K)=1
ELSE
G(I,J,K)=0
END IF
END DO
END DO
END DO
936 :
877 :04/12/26 00:30:11
CALL FOU100(N,G,GRI) DO I=1,N WRITE(FILENAME,*)INT(I) FILENAME=TRIM(ADJUSTL(FILENAME))//'.dat' OPEN(8,FILE=FILENAME) DO J=1,N WRITE(8,101)(GRI(I,J,K),K=1,N) END DO CLOSE(8) END DO END
937 :
877 :04/12/26 00:30:31
SUBROUTINE FOU100(N,G,GRI) ! INTEGER G(N,N,N) INTEGER I, J, K REAL GRI(N,N,N), GG(N,N,N) REAL*8 ABC1,ABC2 COMPLEX GC1(N,N,N), GC2(N,N,N) ! DO I=1,N DO J=1,N DO K=1,N GG(I,J,K)=G(I,J,K) IF(G(I,J,K).EQ.-1) GG(I,J,K)=0.5 GC1=CMPLX(GG(I,J,K),0.0) END DO END DO END DO CALL FFT3F(N,N,N,GC1,N,N,GC2,N,N)
938 :
877 :04/12/26 00:31:16
DO K=1,N DO J=1,N DO I=1,N ABC1=REAL(GC2(I,J,K)) ABC2=AIMAG(GC2(I,J,K)) GRI(I,J,K)=(ABC1**2+ABC2**2) END DO END DO END DO ! RETURN END
これ新手の荒らしだな。 どっかのアップローダにアップしろよ。
精度統一しようよ
>>937 DO I=1,N; DO J=1,N; DO K=1,N
! 整数G(I,J,K)を実数GG(I,J,K)に入れる
GG(I,J,K)=G(I,J,K)
! G(I,J,K)は0か1なのに、-1だったら、GG(I,J,K)に0.5を入れる。
IF(G(I,J,K).EQ.-1) GG(I,J,K)=0.5
! GC1のすべての値をGG(I,J,K)+0.0iにする。
GC1=CMPLX(GG(I,J,K),0.0)
END DO; END DO; END DO
! GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0iをFFTにかける。
CALL FFT3F(N,N,N,GC1,N,N,GC2,N,N)
DO K=1,N; DO J=1,N; DO I=1,N
! なぜかABC1,2だけ倍精度
ABC1=REAL(GC2(I,J,K))
ABC2=AIMAG(GC2(I,J,K))
GRI(I,J,K)=(ABC1**2+ABC2**2)
END DO; END DO; END DO
942 :
935 :04/12/26 15:41:47
>>939 長くなってすいません。
>>941 前任者からもらったコードを改造して、さらにここに貼るときにいろいろ
はしょったので変なところが多いかもしれません。
>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
がなぜだが分からないのですが教えていただけないでしょうか?
>>942 >>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
>がなぜだが分からないのですが教えていただけないでしょうか?
>>937 のループの最後で
GC1=CMPLX(GG(I,J,K),0.0)
が
GC1=CMPLX(GG(N,N,N),0.0)
になるからだろ。
944 :
デフォルトの名無しさん :04/12/26 23:42:14
FORTRAN90勉強するためによい参考書があったら、教えてください 入門と専門書の中間くらいのものがあれば、助かるのですが。。。。 主に科学計算に使います。
過去の遺産をのぞいた場合fortranを科学技術計算に使用するアドバンテージって何かあるんでしょうか。
946 :
デフォルトの名無しさん :04/12/27 00:42:18
他の言語に比べて計算が早い。 私の御師匠さんも以前はC言語で書いていておられたが Fで書いてみると20%近く早くなったっていってた。
>>945 Fortran90以降なら配列演算
FORTRAN77以前は・・・ないな
950 :
奈菜氏 :04/12/27 16:25:51
FORTRAN77でニュートン法でこれを解けって、宿題が出ました。 助けてください・・・・2(X*X)−5X−3=0です。 とても、おっ馬鹿なんで・・・
>>950 FORTRAN 以前の問題。ここで聞くことではないと思うのだけど。
953 :
897 :04/12/28 12:07:28
>>935 すでに
>>941 が指摘しているように
GC1=CMPLX(GG(I,J,K),0.0)
が原因ですね。本来GC1(I,J,K)=CMPLX(GG(I,J,K),0.0)
Fortran90は配列操作に長けているので、
WHERE (iG == -1 )
GG = 0.5
ELSEWHERE
GG = REAL(iG)
ENDWHERE
GC1 = CMPLX( GG, 0.0 )
の様に書けば意味が明解になります。
(iG は型を明確にするために、Gを直してあります。)
今回の事とは直接に関係しませんが、変数名の命名に関しては、
暗黙の型宣言に忠実であることが望ましいです。
これは、たとえFORTRAN90でIMPLICIT NONEをかけても言えることです。
その理由は2つあります。
1.いちいち変数の定義部まで型を調べに戻る必要がない。
2.FORTRAN中・上級者は型を守らないような人を相手にしたがらない。
他言語出身者が『暗黙の型宣言なんかシラネ、宣言すればいいだけのことだろが!』
と言うことがありますが、それは2chで『”がいしゅつ”は既出と読むんだ。日本語知らないのか!』
と言う様なものに当たります。ネタにマジレスな人が2chでスルーされるように、
FORTRAN界ではその内部の伝統を守らないものはスルーされてしまいます。
954 :
デフォルトの名無しさん :04/12/28 17:48:54
3つのプログラムをおしえてください。 1、ガンマ乱数の生成プログラム 2、面積等分割のプログラム 3、適合度検定のプログラム
955 :
デフォルトの名無しさん :04/12/28 22:56:05
956 :
デフォルトの名無しさん :04/12/28 23:32:01
fortran90を使って、外部のファイルから1行づつ値を読み込むのってどうしたらいいのでしょう。 a1 b1 c1 a2 b2 c2 a3 b3 c3 ...以下続く みたいなファイルがあって、そこから まず一行目のa1とb1とc1だけを使って計算した結果を出力して、 次に二行目のa2とb2とc2だけを使って計算した結果を出力して…というのをひたすら繰り返したいのですが。 超素人質問ですいません。 よろしくお願いします。
doループでread文をぶん回せ。
958 :
デフォルトの名無しさん :04/12/29 00:18:04
ループでぶん回すとき、一行づつ読み込め見たいな命令っていらないのですか? do i=1,N read(*,*) a, b, c end do としとくと(文法自信ないですが。)i=1で最初の3つ(a1,b1,c1)を読み込んだら、 i=2の時は勝手にその次の3つ(a2,b2,c2)を読み込んでくれるのでしょうか?? ってか、自分で試してみればいいわけですね。 やってみます。
LAPACKの質問はここでOK?
>953 そのFortran中上級者と思っている人間にかぎって、 スパゲティなソースを量産しているFortranの現状。 全部が全部といいませんが。
961 :
デフォルトの名無しさん :04/12/29 10:00:17
>>960 そりゃしょうがないよ。
スパゲッティーが良くないとは、ALGOL、PASCALの時代から計算機学科の人々が言い続けてきたが
実際問題としてFORTRAN90以前は言語の特質として、原理的にスパゲッティーでないプログラムを
書くことは不可能だったんだから。
そもそも、FORTRAN界にはスパゲッティーなプログラムが良くないという価値観は存在しない。
自分で書いて、自分で使う、他人が使うことは想定しない、という古い時代の価値が保たれていて、
プログラムそれ自体が完成価値を持つという、計算機学科系の価値観とは深淵の隔たりがあるもの。
>>961 fortran コードを吐く fortran みたいなアプローチがあればいいんですよね.
インラインをうまく制御できたり強力なマクロがあったりという感じで,
計算コストを上げずに可読性を良くできる仕組みがあれば.
1, 2 文字の変数名が良く使われるのは,
紙に書いてある数式を写したからじゃないでしょうか.
下付き文字やギリシア文字がうまく書ければ
1, 2 文字に固執されないと思います.
TeX の数式がそのまま貼れて,しかも計算コストを考えて式変形してくれたら
いいですよね.maxima にあったような気もしますが,
これを言語仕様に含めたり.
ratfor使えばFORTAN77でもある程度スパゲッチィなソースに なるのは避けられるけれど、 FOATRAN中上級者はratforを使うのは邪道だと思っているような希ガス。 ちなみに漏れも暗黙の型宣言に忠実じゃない香具師(´・ω・`)
いやな時間に目が覚めた。 Fortran77で、 暗黙の型宣言を守り、IMPLICIT NONE。 COMMONはクリティカルなデータのみで、直交性を考えてやる。 GO TO 文はbreak用途のみに使う。 DO~END DOを使い、DO ~ CONTINUE は使わない。 WHILE文は使う。 無駄なFORMAT宣言は避ける。(WHITE(6,'(A)' プリプロセッサも使う。 分岐が多くなってきたら、コメント付けで意図を明確に。 これやるだけで、かなり可読性が増すと思うんです。 私の指針ですが。 逆にこういう気遣いができないFortran使いは許せぬ。 その、ぐちゃぐちゃした物を動かんからデバッグしてといわれても。 良く読んで、理解しろといわれても。 ・゚・(ノД`)・゚・。
>無駄なFORMAT宣言は避ける。(WHITE(6,'(A,3F8.3)'))
90を使い,module文で2次元の定数配列を宣言したい. integer,dimension(2,2) :: IAA = (/ 1,2,3,4 /)じゃだめなの?
>>966 Fortran90 の場合、多次元配列は
integer, dimension(2,2) :: IAA = reshape((/ 1,2,3,4 /), shape(IAA))
のように reshape を使う。
この場合、
IAA(1,1) = 1
IAA(2,1) = 2
IAA(1,2) = 3
IAA(2,2) = 4
のように列順であることに注意。
>>967 できました.
reshapeってのがあるんですね.
早速の回答 thxでした.
気持ちよく新年を迎えられそうです.