1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
857 名前:デフォルトの名無しさん [2010/01/19(火) 21:21:43 ] インテル Visual Fortranコンパイラ9.1を使っているんですが、インストール後 サンプルプログラム(sample.for)をコンパイルしたところ、下記のエラーがでてしまい、うまくできません。 エラー内容: ifort: error: unable to run '<Microsoft VC++ Dir>\\Bin' このため、.objファイルは出力されるのですが、exeファイルが出力されません。 よろしくお願いします。
858 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:41:44 ] >>857 MSのSDK入れろ
859 名前:デフォルトの名無しさん [2010/01/24(日) 21:39:26 ] "2500/500"のような文字を読み込んで、 2500 / 500 = 5 を計算したいのですが、下のコードでは "/"が読み込めないみたいです。 改善方法を教えていただけないでしょうか? できれば、"2500"や"500"の部分を任意の桁数でできると幸いです。 コンパイラはG95です。 IMPLICIT NONE CHARACTER :: A*5, B, C*5 REAL*8 :: Num1, Num2 PRINT*, "Input" READ*, A, B, C PRINT*, "A=", A, " B=", B, " C=",C READ(A(1:), *) Num1 READ(C(1:), *) Num2 PRINT*, Num1/Num2 END よろしくお願いします。
860 名前:デフォルトの名無しさん mailto:sage [2010/01/24(日) 22:12:58 ] >>859 FortranのI/Oでは「/」は改行を意味している。 よって文字と解釈していなのだろう。 前にもそんな事を聞いていた奴がいたような・・・ 回避する方法は、わからん。 文法書のI/Oのところをじっくり読んで自分で考えてくれ。
861 名前:860 mailto:sage [2010/01/24(日) 22:27:59 ] >>859 しらべたw READ文にFORMAT指定をすればよろし。 READ '(3A)', A,B,C とすれば多分おk
862 名前:859 mailto:sage [2010/01/24(日) 22:57:22 ] >>860 "/"を文字として認識することができました。 ありがとうございます。
863 名前:860 mailto:sage [2010/01/25(月) 00:38:43 ] >>859 おk。 任意の桁数でやるには INTEGER :: kslash CHARACTER(128) :: text READ '(A)', text kslash = INDEX(text, '/') READ( A(1:kslash - 1), * ) num1 READ( C(kslash + 1:), * ) num2 という感じだろう。TRIMでtextの尻の空白を切ったほうがいいかもしれん。 むろん任意と言ってもREALの範囲内の数だが・・
864 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 00:39:52 ] 訂正www READ( text(1:kslash - 1), * ) num1 READ( text(kslash + 1:), * ) num2
865 名前:859 mailto:sage [2010/01/25(月) 07:35:21 ] >> 863 おお!重ね重ねありがとうございます。 無事に作ることができました。
866 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 20:32:37 ] 初心者すぎて笑われるかもしれませんが平面上の3点の座標で三角形つくるときの面積を求めたいのですが 当然ながらヘロンの公式でやりました 辺の長さが出てる場合であればうまくいくのですが長さの計算も入れようとするとどう座標を扱えばいいかちんぷんかんぷんで X(I)とY(I)で1〜3まで動かしかたがわからないというか…その考えが間違ってるのかもわからないです
867 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 20:57:24 ] >>863 Fortran兄貴降臨!いつもお疲れさまっす。 ただ、Fortranの思想的に>>859 みたいなことは、やるべきではないとは思う。 perlでもpythonでもシェルでもいいが、Fortran実行ファイルを適当なラッパーで くるむほうが、素直で良いと思う。
868 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 21:11:49 ] >>866 君なりのソースをここに書けば直して貰えると思うよ。
869 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 21:54:30 ] >>866 数学がわからんの? Fortranがわからんの? 上の方も書いてるけど、わかってるところまでのソースを書くとよろし。
870 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 01:04:31 ] >>867 Fortranでパーサー書こうぜ! 再帰があるから、77時代ほど難しくないはず・・・
871 名前:デフォルトの名無しさん [2010/01/26(火) 14:19:14 ] >>870 とてもうろ覚えだけど・・・ DECのVMSってFortranでかなりの部分は書かれていたような。 IMEというか英語を日本語に変えるやつは堂々Fortranだったような。 ・・・とてもうろ覚えだけど。
872 名前:デフォルトの名無しさん [2010/01/29(金) 08:26:49 ] はじめまして。初心者ですがよろしくお願いします。 突然ですが、この問題を解ける方いらっしゃいますか。 学校の宿題なのですが、どうしても分からないのでここにきました。 お願いします。 問題こちら↓ 階乗 n! を計算する関数を作成し, 順列 n個の異なるものからr個取り出して並べる。 このときの順列の総数をnPrとあらわす。 nPr=n(n-1)(n-2)・・・(n-r+1) を計算する関数を作成し, 組み合わせ 異なるn個からr個取り出して組を作る。 このときの組合せの総数をnCrとあらわす。 nCr = nPr/r! を計算するプログラムを作成しなさい。(問題終わり) よろしくお願いします。
873 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 18:29:35 ] Permut[n_, r_] := Pochhammer[1 + n - r, r] Permut[n, r]/r!
874 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 19:47:54 ] オープンしている特定のファイルのバッファを フラッシュする方法はありますか。コンパイラはifortです。 出来ればクローズしないでフラッシュしたいのですが、 どうしてもバッファにたまってしまいます。 よろしくお願いします。
875 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:06:31 ] 872の丸投げぶりはすごいな。 途中まで書いたソースコードでもここに貼ったら?
876 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:14:32 ] C/C++の宿題スレが丸投げだからその流れがこちらまで来たか
877 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 10:34:15 ] 初秋の青空を連想するくらいのすがすがしい 丸投げw
878 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 16:23:48 ] >>874 CALL FLUSH(ユニット番号)
879 名前:874 mailto:sage [2010/01/31(日) 04:55:24 ] できました! >>878 ありがとうございます!
880 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:11:44 ] プログラムで値を入力して計算結果を得たいのですが、結果を出力するとNaNが出てしまいます。 NaNが出力される原因だけでもいいのでわかる方いらっしゃったら宜しくお願いします。 ttp://www.dotup.org/uploda/www.dotup.org610825.txt 長いのでろだに上げました。テキストファイルですみません…
881 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:24:10 ] 丸投げ、流行ってるな。
882 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 09:17:59 ] ifort -g -check all traceback とかでNaNにかぎらず異常値が発生したらその行を教えてくれるような実行ファイルをつくってくれる オプションがあるはずだから、マニュアルよんでみよう。 >>878 それ、よさそうだね。 ログ生成がゆっくりの場合、あるていど溜るまでディスクには書かれないから不便な事がおおかったけど、 いろいろと助かりそうだ。参考にするよ!
883 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 18:38:34 ] へぇそんなんあったんだ
884 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:00:51 ] >>880 66スタイルで何やってるかわからんなw NUMPACK使っているところを見ると、富士通、名大・九大・京大あたりの流れか。 ライブラリ関数が無いから実行することもできないしもっと詳しく書いてくれないと誰も答えられないだろう。 まぁ定数や関数の一部が単精度のままなので倍精度にしている意味がない可能性が高い。 その辺かな?w
885 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:04:41 ] >>882 FLUSHはFortran2003で導入された命令。 IntelのHELPはF2003命令がいまいち入ってなかったりしてアレなので、 文法解説書を買って学ぶがよろしい。
886 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 09:14:48 ] >>885 そうなんだ。何年か前に g77 でサブルーチン版の flush をつかったことあがった。 今確認したら、やっぱり使えた。因みに g95 だと関数版の flush が使えた。関数 版だと戻り値でエラーチェックできるから有り難い。
887 名前:デフォルトの名無しさん [2010/02/07(日) 15:54:15 ] FFTについて質問させてください。 大学の講義で、離散フーリエ変換のプログラムについて勉強中です。 講義の最後に、「バイオリンの音のデータをフーリエ変換し、 フーリエ変換した結果を横軸:周波数、縦軸:振幅としてグラフ化せよ」 という課題が出ました。 配布されたデータの読み込みを試みたのですが、どう読み込ませたらいいのかが分かりません。 配布されたデータは2列で構成されており、左の列が時刻データ、右の列は音の振幅を表しています。 ↓にプログラムを書きます。よろしくお願いします。
888 名前:デフォルトの名無しさん [2010/02/07(日) 15:56:08 ] --前半-- program fft implicit none !======================================================================== include "fftw_f77.i" integer*8 ::plan !======================================================================== !サンプリング条件の設定 !サンプリングデータ数N , aの数Ma , bの数Mb !サンプリング間隔dt = 1/44100 [s] , サンプリング周波数 f0 = 44100 [Hz] , N, Ma, Mb !周波数分解能df=1/(N・dt) integer,parameter:: N=10000,Ma=5000,Mb=4999 real(8),parameter:: df=44100/dble(N) , dt=1.0d0/44100 !入力波形のデータの設定fin=100Hz real(8) ::fin,a0 !作業用の変数 complex(8):: in(N),out(N),c(0:n-1) integer ::i real(8) ::t,a(0:Ma),b(1:Mb),x,y
889 名前:デフォルトの名無しさん [2010/02/07(日) 15:57:26 ] --後半-- !入力データの設定 write(*,*) 'Input data:' open(unit=11,file='violin.dat') do i=1,N ※ここが分かりません!※ end do close (11) !======================================================================== !ライブラリを利用したフーリエ変換(作業領域作成と実行) call fftw_f77_create_plan(plan,N,FFTW_FORWARD,FFTW_ESTIMATE) !準備 call fftw_f77_one(plan,in,out) !実行 !======================================================================== !結果の変換 c(0:N-1)=out(1:N) a(0)=c(0) a(1:Ma)=dble( c(1:Ma)+c(N-1:N-Ma:-1) ) b(1:Mb)=dble( (c(1:Mb)-c(N-1:N-Mb:-1))*(0.0d0,1.0d0) ) !======================================================================== !結果の出力 write(*,*) 'Output data after forward FFT:' open(unit=22,file='ab-.csv') open(unit=21,file='c-.csv') do i=1,N write(21,'(i6,'','',1pe16.8,'','',1pe16.8)') i,out(i) end do write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') 0.0,a(0),0.0 write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') (i*df,a(i),b(i),i=1,Mb) if (Ma/=Mb) write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') Ma*df,a(Ma),0.0 close (21) close (22)
890 名前:デフォルトの名無しさん [2010/02/07(日) 15:59:09 ] --ラスト-- !======================================================================== !フーリエ変換(作業領域消去) call fftw_f77_destroy_plan(plan) end program fft
891 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:29:00 ] >>889 クラスの友達に聞いた方が早いよ。
892 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:20:13 ] むしろ、データファイルの中身が必要なんじゃね?
893 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:37:52 ] >>891 きっとボッチなんだよ。
894 名前:デフォルトの名無しさん [2010/02/07(日) 22:48:06 ] そうなんすよ。 彼女と遊びすぎて留年しちゃったもんで・・・。
895 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:02:40 ] お前はこのスレを敵にまわした。
896 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:10:16 ] >>894 教えようと思ったがやめた
897 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:48:18 ] 自分が今いるサブルーチンの名前を取得する方法ってありますか? デバッグするときにどのサブルーチンで止まってるか確かめたいんですが。
898 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:30:51 ] 終了したのが なんていうサブルーチンで何行目か、とか ソースファイルの何行目だったか、とか教えてくれるようにする オプションってあったと思うけどなぁ。というわけでマニュアルを読もう! Fujitsuだと超最適化かけてもこの機能はついてくるのが素晴らしいが PC向けではなかったような・・・。出してくれんかねぇ
899 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:59:22 ] >>898 いえ、それがめんどくさいことに終了せずにどこかで停止してるんですよ。 write文の中身をいちいち変えてもいいんですけど、 出来るだけコード汚さないように書きたいので。
900 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:25:45 ] すみません、もう一つ。subroutineの最後に return end って書くのはなんででしょう。サブルーチンでのendってreturnと 同じ意味じゃないんでしょうか?returnが無いと困るケースってあります?
901 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 12:13:11 ] ヒント: returnはサブルーチンの最後である必要は無い。
902 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 13:12:13 ] 大昔はEndSubroutineが無かったから、 このEndはサブルーチンのですよ、とチェックをいれる意味で 推奨されてた名残だね。ぶっちゃげ無くてEndだけでもいい。 Returnはサブルーチン抜けを意味するのだからメイン階層では絶対出てこないので。
903 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 18:54:13 ] 900じゃないけどreturnとか使った事ありませんでした 勉強になるスレです
904 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:05:26 ] >>897 __FILE__ を使って後はゴニョゴニョとよくやってた。 Fortran 自体を使わなくなって数年(足を洗ったので)。
905 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:08:56 ] >>899 Fortranにはそういう命令はない。 しかしコンパイラのtracebackオプションを使えばいい。 大抵のコンパイラにはそういう機能がある。 だがそれは、処理系に依るのでマニュアルでオプションを調べるしか無い。 コンパイラの種類とバージョンを言えばわかる可能性はある。
906 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:13:26 ] __LINE__使えるんじゃないの?
907 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:35:53 ] >>906 標準のFortranにはないべ。 Unix系のプリプロセッサの機能だろ。方言のなまりがきつすぎる。
908 名前:ごめんなさい、お願いです。 [2010/02/10(水) 00:51:22 ] このプログラムを 明日までに作ってください!!お願いします。 Fortranで, 階乗 n! を計算する関数を作成し, 順列 n個の異なるものからr個取り出して並べる。 このときの順列の総数をnPrとあらわす。 nPr=n(n-1)(n-2)・・・(n-r+1) を計算する関数を作成し, 組み合わせ 異なるn個からr個取り出して組を作る。 このときの組合せの総数をnCrとあらわす。 nCr = nPr/r! を計算するプログラムを作成してください。 おねがいします。
909 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:55:59 ] >>908 最近勉強しているのでFortran95 で書いてみた。 たぶん君が求めているのはF77ヴァージョンだろうw MODULE m_2chan IMPLICIT NONE CONTAINS ELEMENTAL INTEGER FUNCTION factorial(n) INTEGER, INTENT(IN) :: n INTEGER :: i factorial = PRODUCT( (/ (i, i = 1, n) /) ) RETURN END FUNCTION factorial ELEMENTAL INTEGER FUNCTION permutation(n, r) INTEGER, INTENT(IN) :: n, r INTEGER :: i permutation = PRODUCT( (/ (i, i = n, n - r + 1, -1) /) ) RETURN END FUNCTION permutation ELEMENTAL INTEGER FUNCTION combination(n, r) INTEGER, INTENT(IN) :: n, r combination = permutation(n, r) / factorial(r) RETURN END FUNCTION combination END MODULE m_2chan !
910 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:57:29 ] PROGRAM twochannel USE m_2chan IMPLICIT NONE INTEGER :: n, k PRINT *, 'INPUT n and k' READ *, n, k PRINT *, 'nCk = ', combination(n, k) STOP END PROGRAM twochannel 77育ちの俺様は、暗黙の型に従っていないのですげー気持ち悪いぜwww
911 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:27:41 ] >>908 数学的にチューニングすべきだが、提示された式のとおりに作った。PROGRAMは改行多杉になるので省略 integer function factorial(n) implicit none integer i, n i = n factorial = 1 do while(i .gt. 0) factorial = factorial * i i = i - 1; end do end integer function permutation(n, r) implicit none integer n, r, i i = 1 permutation = 1; do while(i .le. r) permutation = permutation * (n - i + 1) i = i + 1 end do end integer function combination(n, r) integer n, r, factorial, permutation combination = permutation(n, r) / factorial(r) end
912 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 08:48:40 ] 908の人気に嫉妬
913 名前:デフォルトの名無しさん [2010/02/10(水) 08:58:43 ] >>901 >>902 あ、そうなんですか。別に書かなくてもいいってことですね? >>904 >>905 >>906 ありがとうございます。でも、エラーが出て終了するんじゃなくて、 ジョブは走ってるんですけどどこかで止まってるっぽいんですよ。 出力ファイルが計算途中で更新されなくなるんです。 で、どこまで進んでどこでどうなってるか調べたいのでいちいちwrite文挟んでるんですが… tracebackって終了したときしか使えないですよね?
914 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 10:05:57 ] デバッガー無いのか? アタッチ出来れば楽勝だな。
915 名前:908です。 [2010/02/10(水) 11:57:13 ] みなさん、ありがとうございました!!(泣
916 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:09:07 ] >>913 仰る通り Traceback は異常終了しないとでない。 しかし、望みの機能が存在しないのは、世の中の人がその機能を欲していないということなので がんばってPRINT文をばらまいて解決しなさいw プログラム相談員とか、そういう人に聞くのも、連中の人を小馬鹿にしたような寝言を我慢しないと 駄目だが、有効w
917 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 13:16:13 ] >>916 >連中の人を小馬鹿にしたような寝言を我慢しないと駄目だが ワロタw あの目線はどうにかならんのか
918 名前:デフォルトの名無しさん [2010/02/11(木) 22:18:28 ] ちょっとお聞きしたいのですが、 fortranでguiプログラミングはできないのでしょうか?
919 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:26:53 ] >>918 C用のライブラリのAPIを呼びまくるという形ではできる。