1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
446 名前:デフォルトの名無しさん [2007/05/09(水) 19:05:54 ] あと今の状態の文は以下のとおりです。 program ex4 implicit real*8(a-h,o-z) dimension a(100) open (10,file='fl.dat') read(10,*) a(i) do 10 i=1,19 k=i do 20 j=i+1,20 if(a(k).gt.a(j))k=j 20 continue b=a(i) a(i)=a(k) a(k)=b 10 continue open(11,file='ans.dat') write(11,*) a pause stop end
447 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:08:11 ] ファイルの中身も貼らないようでは困る。 あと、プログラムは間違いすぎていてどう指摘していいのか分からん。
448 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:00:58 ] アドバイスしたいけれど、院生がだした課題でしょ? これから研究する上でプログラミングが必要なのだから、 できるだけ努力しようよ。 # 気むずかしい院生に相談するというのも努力の一つ。 一年生なら、初心者救済のために教えたいけど、 四年生なら、今がんばらないと年末に泣くだけだよ。 課題ができなくて院生に怒られるのも、必要な経験のうちだよ。 また、自分達の理解度を正しく伝えるということも、 恥ずかしいけれど必要な作業。
449 名前:デフォルトの名無しさん [2007/05/09(水) 20:02:50 ] ファイルの中身はこのような感じです。 21.0 54.0 32.0 68.0 64.0 10.0 22.0 98.0 65.0 84.0 81.0 39.0 93.0 74.0 55.0 11.0 71.0 97.0 19.0 50.0 そんなに間違えてるんですか? よろしかったらプログラムを書いていただいてもよろしいでしょうか?
450 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:13:44 ] 書くわけないじゃん。
451 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:27:59 ] program ex4 i = system('cat fl.dat | sort -n > ans.dat') end
452 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:34:27 ] >>442 とりあえず, read(10,*) a(i) の下に do 999 i=1,20,1 write(6,*) a(i) 999 continue 等と追加し,配列aに入っている値を調べよ. 致命的な間違いに気付くであろう.
453 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:36:09 ] アンカーミスった>>446 ね.
454 名前:デフォルトの名無しさん [2007/05/09(水) 21:48:46 ] フィボナッチ数列 a0=0、a1=1、a(i+1)=ai+a(i-1) (i=2,3,…) を計算するプログラムを作成せよ。なお計算は例はa(i+1)=20まででよい。 条件1:得られた値が奇数であるならば、数値の右に*をつけ、奇数かつ3の倍数ならば、数値の右に**を付けて出力すること。 どなたかわかる方いませんか? プログラムお願いします(>_<)
455 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:59:56 ] 宿題は自分でやれ
456 名前:デフォルトの名無しさん [2007/05/09(水) 23:26:22 ] 研究室の本棚に回答あるぞ。 F77か知らないが、解説書やプログラムの本にも書いてるぞ。 「並び替え」で調べろ。それの英単語で出てくるだろうけど 敢えて書かない。 >>452 ゴミが入って、そのゴミが正解の場合もあるので read(10,*) a(i) の前に a(i)=-1.0 とかを入れた方が良いかな? >>446 今の段階で効率良いプログラムを書こうとするな。 とにかく動くプログラムを書け。 b=a(i) a(i)=a(k) a(k)=b が、どういう時に作用させたいか、今現在はどのように動いているか 調べろ。
457 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:35:43 ] >>456 いや・・・そもそも i に値が入る前にiを使っているのと、 このread文一個では、ファイルからのデータの読み出しがまず失敗している。 てか間違いが多すぎてアドバイスしにくいんだなそもそも。 >>446 まずデータを配列に格納することをちゃんと成功させてから、 ひとつひとつ問題をクリアしていくことをお勧めする。
458 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:41:30 ] 間違い多すぎるわけではないか。 1か所修正して2行追加するだけでとりあえず答えは出るところまで来てるんだな。
459 名前:デフォルトの名無しさん [2007/05/09(水) 23:45:49 ] >>467 あれ? >>442 では、ループ回してる中にread文あったけど.... ループ不足は分かってたけど書くと、致命的なことが安直に分かるので -1.0を入れろってしたんだ。 この人致命的に、理解してないね。 今の文でread(10,*) a(i)の後ろでループ回すの教えると、もっと根本的にミス するだろうし。
460 名前:デフォルトの名無しさん [2007/05/09(水) 23:50:27 ] あ、上の >>467 は>>457 です。 orz
461 名前:デフォルトの名無しさん [2007/05/09(水) 23:51:33 ] fortranでwebの結果を得ることできますか? get www.hoge.com を行い 結果をファイルに残す あるいは、戻り値 304( not found ) かどうかの判定とか。 Linux *g77 です
462 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:54:08 ] >>451 sortのスイッチは-rを追加しないといけないんじゃね? なんか大きい順って言ってるし. でもこの3行で「できました〜」って言ったらどう思われるかね.
463 名前:デフォルトの名無しさん [2007/05/09(水) 23:57:25 ] 固有値解析もサブルーチン呼ぶだけだから良いんじゃね? なわけねーだろ。
464 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:00:14 ] >>461 system 関数で wget を呼べば
465 名前:デフォルトの名無しさん [2007/05/10(木) 00:05:46 ] >>464 なるほど、getは出来ますね。純粋なfortranでは無いですが贅沢は言えません。 戻り値が200(存在する)場合はファイルに書き 304であれば、書かないようにすれば良さそうですが 戻り値を得る方法ありますか?
466 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:19:08 ] >>465 wget の出力をファイルにリダイレクトしておいて、それを解析するとか。
467 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:19:51 ] >>465 ああ、あと、当然成功すれば 0 が、失敗すれば非 0 が返ってくるはずだから、 それで成功か失敗かは分かる。 エラーの種類は出力を解析する必要あり。
468 名前:デフォルトの名無しさん [2007/05/10(木) 00:22:57 ] >>466 ああ、そうか。 wcなりで、有るときにファイル作業すれば良いね。 でも、permission や loginの時にどう対処すれば良いのか? ともかく、一応の道筋は付いた。 ありがとう。 戻り値を得る方法をご存知の方、いらっしゃったら、よろしくです。
469 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:24:48 ] 問題は fortran で実装する必要性だな。 何らかのスクリプトでいい気がする。
470 名前:デフォルトの名無しさん [2007/05/10(木) 00:28:00 ] fortranかVBい外のbasicでなら、思うことが自在にできます。 文字列や数値をくっ付けたりとか、あと解析に便利なんです。 つーのが、fortranでする理由です。
471 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:31:09 ] そこら辺は perl とか ruby とかの方が得意な気が。 まあ、言語を覚える手間がかかるというのなら仕方がないけど、 bash あたりでもいいという気はする。 ま、いいけどね。
472 名前:1/3 mailto:sage [2007/05/10(木) 12:20:10 ] >>461 Windows+VisualFortranの場合だが、参考例。 オプション:Linker->Input->additinal dependency WinInet.lib PROGRAM tashiro USE ifwina IMPLICIT NONE INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_PRECONFIG = 0 ! // use registry configuration INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_DIRECT = 1 ! // direct to net INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_PROXY = 3 ! // via named proxy INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4 ! // prevent using java/script/INS !
473 名前:2/3 mailto:sage [2007/05/10(木) 12:21:00 ] INTERFACE INTEGER (HANDLE) FUNCTION InternetOpen(arg1, arg2, arg3, arg4, arg5) USE ifwinty !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetOpenA' :: InternetOpen INTEGER (LPLONG) :: arg1 INTEGER (DWORD) :: arg2 INTEGER (LPLONG) :: arg3 INTEGER (LPLONG) :: arg4 INTEGER (DWORD) :: arg5 END FUNCTION ! INTEGER (HANDLE) FUNCTION InternetOpenUrl(arg1, arg2, arg3, arg4, arg5, arg6) USE ifwinty !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetOpenUrlA' :: InternetOpenUrl INTEGER (HANDLE) :: arg1 INTEGER (LPLONG) :: arg2 INTEGER (LPLONG) :: arg3 INTEGER (DWORD) :: arg4 INTEGER (DWORD) :: arg5 INTEGER (DWORD) :: arg6 END FUNCTION ! INTEGER (BOOL) FUNCTION InternetReadFile(arg1, arg2, arg3, arg4) USE ifwinty !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetReadFile' :: InternetReadFile INTEGER (HANDLE) :: arg1 INTEGER (LPVOID) :: arg2 INTEGER (DWORD) :: arg3 INTEGER (LPDWORD) :: arg4 END FUNCTION
474 名前:3/4 ごめwwwはみだしたw mailto:sage [2007/05/10(木) 12:22:09 ] ! INTEGER (BOOL) FUNCTION InternetCloseHandle(arg1) USE ifwinty !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetCloseHandle' :: InternetCloseHandle INTEGER (HANDLE) :: arg1 END FUNCTION END INTERFACE INTEGER (HANDLE) :: hInt, hUrl INTEGER (BOOL) :: iret INTEGER (DWORD) :: dwret, dwtot CHARACTER (LEN = 80) :: agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'//CHAR(0) CHARACTER (LEN = 256) :: strurl, buff CHARACTER (LEN = 256), ALLOCATABLE :: srctext(:) INTEGER :: i hInt = InternetOpen(LOC(agent), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0) IF (hInt == 0) PRINT *, 'Open error' strurl = 'www.yahoo.co.jp 'C hUrl = InternetOpenUrl(hInt, LOC(strurl), NULL, -1, 0, 0) dwtot = 0 ALLOCATE(srctext(1000)) OPEN(9, FORM ='binary') DO i = 1, 1000 iret = InternetReadFile(hUrl, LOC(buff), LEN(buff), LOC(dwret)) IF (dwret == 0) EXIT dwtot = dwtot + dwret WRITE(9) buff(1:dwret) srctext(i) = buff(1:dwret) IF (i == 1000) STOP 'buffer overflow ' END DO
475 名前:4/4 ごめwwwはみだしたw [2007/05/10(木) 12:24:10 ] print *, srctext(1:i - 1), srctext(i)(1:dwret) print *, dwtot, 'bytes' iret = InternetCloseHandle(hUrl) iret = InternetCloseHandle(hInt) STOP END PROGRAM tashiro 面倒なのはWinInet用のインターフェースが用意されていないので、自分でC用のヘッダーファイルを見て、 作ってやらないといけないことか。
476 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 02:48:37 ] 若者を呼び寄せるために Fortranでエロゲでも作らないか?
477 名前:461 [2007/05/11(金) 23:51:07 ] >>472 おお、出来るんですね。f77では、ないけど読めます。 ありがとう。 数値解析程度にC/C++やるので、なんとかできると思います。
478 名前:デフォルトの名無しさん [2007/05/12(土) 00:23:20 ] このプログラム…Nを11以上にすると動かなくなってしまいます… どうしてでしょうか? ちなみに、コンパイラはsalfordのPlato3を使っています。 program main integer:: N,k integer, allocatable:: F(:,:),A(:,:) real:: eps,epsp1 real, allocatable:: x(:),y(:),b(:,:),r(:,:) real, parameter:: rad=3.1415926/180 print*, "please entry the N." read*, N allocate(F(1,1:N**2),A(1:N**4,1:N**4),x(1:N),y(1:N),b(1:N,1:N),r(1,N**2)) A=0 print*, " " do i=1,N**2 A(i,i)=4 A(i+3,i)=-1 A(i,i+3)=-1 end do do i=2,N**2,3 A(i-1,i)=-1 A(i,i-1)=-1 A(i+1,i)=-1 A(i,i+1)=-1 end do do i=1,N**2 print "(10I5)",(A(i,j),j=1,N**2) end do !A
479 名前:デフォルトの名無しさん [2007/05/12(土) 00:24:23 ] do i=1,N x(i)=i*(N+1) y(i)=i*(N+1) end do do i=1,N do j=1,N b(i,j)=13*(rad**2)*sin(3*rad*x(i))*sin(2*rad*y(j))*((1/N+1)**2) end do end do print*, " " !b do k=1,N do i=k+1,N do j=k+1,N A(i,j)=A(i,j)-A(k,j)*A(k,j)/A(k,k) end do b(i,i)=b(i,i)-b(k,k)*A(i,k)/A(k,k) end do end do do k=N, 1, -1 do j=k+1, N b(k,k)=b(k,k)-A(k,j)*b(j,j) end do b(k,k)=b(k,k)/A(k,k) end do print*, b print*, " " !gauss
480 名前:478-479 mailto:sage [2007/05/12(土) 00:40:34 ] エラーメッセージは Access Violation the instruction at address 036238f0 attempted to write to location 00000000 036238b4 __ALLOCATE_U [+003c] 036ef495 get_non_checked_memory(int)#8F [+001a] 036ef4db get_heap_block(int)#8F [+0056] 036ef6ea __PALLOCATE2 [+008b] main - in file freeformat1.f95 at line 11 [+0299] です。
481 名前:デフォルトの名無しさん [2007/05/12(土) 01:00:50 ] >>478 メモリーがアロケートできなかったんじゃないかな? 11**4〜10^4 A(1:N**4,1:N**4)だから、必要とされるメモリーは、4*10^4*10^4<10^9Byte〜1Gbyte
482 名前:478 mailto:sage [2007/05/12(土) 01:28:11 ] メモリが足りないと言うことは、私のPCが原因なんですね・・・ なんとか改善策はありませんでしょうか?
483 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 02:24:01 ] >>476 正直もう Fortran は消えて欲しいのでやめてください。
484 名前:478 mailto:sage [2007/05/12(土) 02:42:35 ] N=2において、 b(1)=x(1)y(1) b(2)=x(2)y(1) b(3)=x(1)y(2) b(4)=x(2)y(2) N=3において、 b(1)=x(1)y(1) b(2)=x(2)y(1) b(3)=x(3)y(1) b(4)=x(1)y(2) b(5)=x(2)y(2) b(6)=x(3)y(2) b(7)=x(1)y(3) b(8)=x(2)y(3) b(9)=x(3)y(3) ってな感じに配列を格納したいのですが、下のプログラムでは 例えばN=2の場合、 b(1)、b(2)、b(3)、b(4)全ての配列にx(2)y(2)のときの値が格納されてしまいました…。 どうしてでしょうか? do k=1,N**2 do i=1,N do j=1,N b(k)=13*rad**2*sin(3*rad*x(i))*sin(2*rad*y(j))*(1/N+1)**2 end do end do end do
485 名前:デフォルトの名無しさん [2007/05/12(土) 03:39:01 ] >>482 よく見てないので、配列ミスないならメモリを節約するアルゴリズムの 本でも見なさい。 コンパイルオプションで配列ミスチェックできるなら付けてみる。 unix系でunlimitedしてみたら? >>484 「どうしてでしょうか?」なので原因だけ書く 君がそう書いてるから、そうなる。 上の442か? k=1の時、iもjも2まで回るから、そうなる。k=2の時も同様。 以下同じ
486 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 10:53:44 ] >>476 まずはヌける絵を描くんだ。 話はそれからだ。
487 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 11:04:10 ] >>476 DO「ああんっ……CONTINUE君っ……」 細い腰を震わせ、DOは歓喜の牝声をあげた。 奥深く突き刺さった行番号を、DOとIが招き入れるように吸い付いている。 「いいんっ……もっと……もっと下さい……」 好きなCONTINUEの行番号をDOとIの間に入れられることがこんなにも気持ちいいなんて。 CONTINUEの熱い肉体をもっと感じたくて、ついいやらしく激しい突きをせがんでしまう。 こういう感じ?
488 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 11:24:32 ] だがEND DOに寝取られる
489 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 12:46:16 ] FORTRANのイメージならホモゲーだよな
490 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 14:28:06 ] アッー!
491 名前:デフォルトの名無しさん [2007/05/12(土) 18:46:17 ] >>478 A をアロケートしようとしているところが 4GB を超えてしまっているのが原因。 4GB以下になるように分割して扱う必要がある。
492 名前:478 mailto:sage [2007/05/12(土) 23:04:36 ] >>485 >>491 アドバイスありがとうございます! なんとか、N=11以上のとき動かなくなるエラーは亡くすことができたのですが、 >>484 が未だに解決できないので、こちらの方のアドバイスも 大変恐縮ですが、アドバイスをよろしくお願いします。
493 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 23:41:22 ] >>492 紙と鉛筆を用意して、N=2の時 >>484 のプログラムがどんな動きをするのか 1ステップずつ k, i, j, b の値を紙の上に書き出して確認してみましょう。
494 名前:デフォルトの名無しさん [2007/05/13(日) 13:46:47 ] >>492 i と j を k から作り出すように書き換えるのがたぶん簡単。
495 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:36:15 ] FORTRANを盛り上げていこうぜ!
496 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:54:24 ] お断りします
497 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 21:33:57 ] そう言われると、かえって>>496 の菊穴にCOMMON文を無理やり押し込んでやりたいw うふふ
498 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 03:32:54 ] 最近フリーのGfortranを使い始めたんですが サブルーチンの使い方がわかりません・・・. LAPACKを使いたいんですけど,プログラムの始めに何か書くのでしょうか? いきなりcall文で呼び出せないでしょうし. ちなみに,windowsのコマンドプロンプトでコンパイルしています. fortran初心者なものですいません・・・
499 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 06:27:29 ] >>498 本を読まずに1から全部聞いて済ませようとしているのか?
500 名前:デフォルトの名無しさん [2007/05/15(火) 09:36:20 ] >>498 ヘッダファイル(インクルードファイル)がないのかというようなことを聞いているのでしょうが ないんじゃないかな。 リンクするのを忘れなければいきなりcall できると思う。 f90(f95)なら use lapack_f95 みたいなモジュールの読み込みだけはいると思う。
501 名前:デフォルトの名無しさん [2007/05/15(火) 10:08:38 ] Fortran IVの方でも聞いていたのですが、返事がなかったのでこちらでも 質問させてください。 C(Not C++ / MSVC)で作られたライブラリの関数が使用したいのです。 そいつは STDCALL で作られていて、大文字小文字が混在しているものもあります。 それをg95またはgFortran もしくは g77 で呼び出したいと思っています。 _cdecl で 小文字なら呼び出せるのですが 呼び出し規約と関数名の両方について 対処方があるならば知りたいと思っています。
502 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 10:10:22 ] ラッパ関数を C で作るとか。
503 名前:デフォルトの名無しさん [2007/05/15(火) 10:34:59 ] 素早いお返事ありがとうございます。 やはりそれが普通でしょうか。 関数がわりかし多めな+ IVF から呼べるインターフェース類はあるので 再利用ができるとうれしいなという感じなのですが。
504 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 10:44:55 ] ラッパ関数生成スクリプトでも書くとか。
505 名前:デフォルトの名無しさん [2007/05/15(火) 10:50:49 ] >>504 ですね。 あきらめて、書き始めておりました。
506 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:16:00 ] すいません。学校でFORTRANを習っているのですが、 解けない問題があるのでよろしくお願いします。 問:三角形の底辺A、高さHを入力し、 面積を求めて印刷するプログラムを作りなさい。 と、いう問題なのですが、TeraPadで C toi read(5,*)A read(5,*)H S=A*H/2 write(6,*)'TATE=',A write(6,*)'YOKO=',H write(6,*)'MENSEKI=',S STOP END と、入力しコマンドプロンプトで cd fortran g77 -o ファイル名 ファイル名.forとして、 エンターを押すと、エラーメッセージは発生せず、 その後、ファイル名→エンターをすると、 いつも出ている FORTRAN〜が消えます。 計算は出来ませんでした。アドバイスお願いします。
507 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:24:54 ] >>506 g77 云々 以降の画面に出ている文字を全部コピペして書け。 これだけでは判断のしようも無い。 プログラム自体は間違ってないように見える。
508 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 02:42:00 ] DO文を用いて整数NからM(N<M)までに存在する3の倍数の和を求める プログラムを作成したいのですが、うまい方法がわかりません。よければ実行例を教えてください。 自分なりに考えたのですが、この数列の初項と個数が分かれば解けそうなのですが、 Nに最も近くてN以上の3の倍数が初項というのを、 IF(MOD(N+1,3).eq.0)THEN 初項=N+1 のようにするとNとN+2の時の場合分けをしなければならないし、個数に至っては、 末項/3-初項/3+1で出そうとすると、かなりの数のIFを使わなければならないので 頭がこんがらがってうまく作れませんでした。
509 名前:デフォルトの名無しさん [2007/05/16(水) 09:47:21 ] >>506 実行するとコマンドプロンプトが修了してしまうという意味でしょうか? だとすると、たぶんマシンが変だと思う。 違うマシンで試せるなら試してみて。
510 名前:デフォルトの名無しさん [2007/05/16(水) 09:51:44 ] SUM=0 DO I=N,M IF (MOD(I,3) .EQ. 0) THEN SUM=SUM+I END IF END DO じゃだめ?
511 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 11:25:21 ] >>510 上手くいきました。 DO文の中にIF文入れて簡単に表せるんですね。とても勉強になりました。 ご教授ありがとうございました。
512 名前:デフォルトの名無しさん [2007/05/19(土) 23:08:05 ] FORTRAN77です。 一様乱数を10個ずつ発生させ、その平均を計算する。 これをn回繰り返す。 計算した平均値をnが1千回、1万回、10万回、100万回についてそれぞれ分布を求めよ。 という問題が分かりません。 乱数の発生は調べたら[0,1)区間の一様乱数が real function unifrd(i) integer l,c,t30 real mu parameter (l=843314861,c=453816693,t30=2**30,mu=2.0**31) i=l*i+c if(i.lt.0) i=(i+t30)+t30 unifrd=real(i)/mu end で出るらしく、これを応用すれば出せそうですが、10個ずつ発生させ、その平均を計算する プログラムの書き方がよく分かりません。 幼稚な質問ですが、どなたか教えて下さい。 お願いします。
513 名前:デフォルトの名無しさん [2007/05/20(日) 01:16:58 ] C S仮 C SUM合計 S=0 SUM=0 N=10 DO I=1,N 乱数発生ルーチン(ここで乱数はRとする) S=S+R CONTINUE SUM=S/N でNを返れ
514 名前:513 [2007/05/20(日) 03:36:17 ] 用すませて思い出したけど 変数は REAL*8 とした方が良いんじゃね?
515 名前:513 [2007/05/20(日) 03:51:40 ] あ、これで動くは動くが、変数名とか恥ずかしい C A平均 C SM合計 REAL*8 A,SUM,R A=0 SUM=0 N=10 DO I=1,N 乱数発生ルーチン(ここで乱数はRとする) SUM=SUM+R CONTINUE A=SUM/N
516 名前:デフォルトの名無しさん [2007/05/20(日) 18:22:48 ] わからないので助けてください;; 整変数I,J,Kをキーボードより与え、下記を実行するプログラムを実行せよ。 x=i^2/4 + j^3/27 y=x/(1+k^2) z=(yの3乗根)klogk 条件 kあるいはyの値が0以下の場合はzを求める計算ができない、その場合z=(絶対値yの3乗根)(絶対値k)log(絶対値k) を計算するように条件わけをすること。 IMPLICIT REAL(A-H,O-Z) DATA I,J,K,X,Y,Z/5,6,1,2,1,6/ x=i**2/4+j**3/27 y=x/(1+k**2) z=y**(1/3)*k*LOG(k) WRITE(6,'(4I10)')I,J,K WRITE(6,'(4F10)')X,Y,Z WRITE(6,'(2I10,2F10)7)M,L,E,D STOP END この辺までは組んでみたのですがこの後どうすればいいのでしょうか? すみません、よろしくおねがいします><
517 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 20:44:18 ] >>516 >整変数I,J,Kをキーボードより与え、 READ文 >kあるいはyの値が0以下の場合はzを求める計算ができない、その場合z=(絶対値yの3乗根)(絶対値k)log(絶対値k) >を計算するように条件わけをすること。 IF文
518 名前:デフォルトの名無しさん [2007/05/21(月) 14:01:26 ] >>516 IF文でy=0 または z=0 のところを別にして それ以外は yとkをabs でくくる。 という風にやるのが期待されているんだろうけど、 y<=0 でも計算できる気がするぞ。問題間違ってない?
519 名前:>>506 mailto:sage [2007/05/21(月) 16:22:39 ] >>507 さん レスありがとうございます。遅くなって申し訳ないですが、 もう一度やってみました。 >>506 後 W:\fortran>g77 -o ファイル名 ファイル名.for W:\fortran>ファイル名、と打ちエンターを押すと、 何も書かれてない下の行にカーソルが移動し、 エンターを押しても同じことで、もう一度ファイル名→エンターでは、 ファイル名 invalid number: Incomprehensible list input apparent state: unit 5 (unnamed) last format: list io lately reading direct formatted external IO abnormal program termination とエラー?が出ます。 すいませんがよろしくお願いします。
520 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 20:22:18 ] >>519 2回数値を入力してEnterを押すと答えが表示される。 READ文の復習をしましょう。 あと、細かいことだが 'TATE', 'YOKO' と底辺A, 高さHの対応はそれでいいのか?
521 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 02:13:29 ] >>520 さん、レスありがとうございます。 しかし、>>「2回数値を入力して」と、書かれていますが、 数値とはどこの数値をどこに入力すればよいのでしょうか? 何度もすいません…。
522 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 02:46:29 ] >>521 君はいったい何をするプログラムを作っているのかね? もう一回問題をよく読みなさい。
523 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:12:53 ] >>522 さん すいません。ようやく分かりました。ありがとうございます。 恥ずかしながら、出力結果が S=AH/2 になるのかと思ってました。 迷惑おかけしました。すいませんでした。
524 名前:デフォルトの名無しさん mailto:age [2007/05/23(水) 16:56:51 ] すみません、使いたいソフトのソースコードがFortran90で書かれていますが、 コンパイラがありません。 しかもUNIXじゃなくてWindowsXPなんです。Cygwinはあるんですが。 というわけで、Fortran90のWindows用フリーコンパイラなどをご存じでしたら 教えてください。
525 名前:デフォルトの名無しさん [2007/05/23(水) 18:01:06 ] g95 -minGW で決まり。
526 名前:sage [2007/05/24(木) 14:59:59 ] 3×3の行列の積を解くプログラムがわかりません>< ちなみにTextファイルから行列を読み込むプログラムです。 どなたかご教授願います。
527 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 15:11:59 ] 宿題頑張ってね
528 名前:デフォルトの名無しさん [2007/05/24(木) 19:38:37 ] fortranでフィボナッチ数列A0 = 0 , A1 = 1 , Ai+1 = Ai + Ai-1 (i =2,3...)を計算するプログラムを作っています。 得られた値が奇数の時には、数値の右横に*をつけ、奇数かつ3の倍数なら**をつけます。以下のようにプログラムしましたが、*印が偶数時にもついてしまい、また**の付け方にも困っています。どこが、間違っているのか、アドバイス手本よろしくお願いします。 IMPLICIT REAL (A-H,O-Z) A0 = 0 A1 = 1 A2 = 1 WRITE(6,*)'A 0 = 0' WRITE(6,*)'A 1 = 1' DO 20 L = 2,20,1 A2 = A1 + A0 I = A2-INT(A2/2)*2 J = A2-INT(A2/3)*3 IF(J.NE.O.AND.I.NE.O) THEN WRITE(6,*) 'A',L,'=',A2,'*' ELSE IF(J.NE.O.AND.I.EQ.O) THEN WRITE(6,*) 'A',L,'=',A2,'*' ELSE WRITE(6,*) 'A',L,'=',A2 END IF A0 = A1 A1 = A2 20 CONTINUE STOP END 結果 A 0 = 0 A 1 = 1 A 2= 1.* A 3= 2.* A 4= 3.* A 5= 5.* A 6= 8.* A 7= 13.* A 8= 21.* A 9= 34.* A 10= 55.* A 11= 89.* A 12= 144.* A 13= 233.* A 14= 377.* A 15= 610.* A 16= 987.* A 17= 1597.* A 18= 2584.* A 19= 4181.* A 20= 6765.*
529 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:10:22 ] >>528 ・FORTRANにはMODという便利な関数がある。 ・「奇数」、「奇数かつ3の倍数」の判定条件が変。 ・せっかくIF/ELSE IFで条件分けしているのにWRITE文がまったく同じ。 ・プログラムの頭に「IMPLICIT NONE」をつけてみよう。
530 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:13:41 ] >>528 実数で計算する必要があるのか?
531 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 07:16:18 ] >>528 Ai+1 = Ai + Ai-1 を計算するなら、次のように配列を使う方が簡単だと思います。 A(i+1) = A(i) + A(i-1)
532 名前:デフォルトの名無しさん [2007/05/25(金) 10:37:01 ] >>530 絶対にない >>526 絶対に3x3なら式を9個並べろ 規則性が分かったらループ回せ さすればkxn ・nxjでも簡単に計算できる
533 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 10:59:00 ] >>526 行列の積の定義を線形代数の本で見よ. 定義式をそのまま計算すればよろしい. 3x3が保障されてるなら532の言うように,式を9本かけばよい.
534 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 13:52:19 ] テキストファイルから行列を読み込む方法が分らないんじゃないかな。
535 名前:532 [2007/05/26(土) 00:25:52 ] open(2) "mat.txt" C ループ回すなら工夫して回せ read(2,*) A(I,J) read(2,*) B(K,L) C calc statment どーのこーの close(2) stop end I,JとK,Lで変えたけど分かってるならB(I,J)でも良い open文でstatus=oldかunknownが必要なら書け。 つーか、そしたら質問者は何も理解してないな。
536 名前:デフォルトの名無しさん [2007/05/26(土) 10:47:59 ] >>526 c = matmul(a, b) じゃだめなの?
537 名前:デフォルトの名無しさん [2007/05/26(土) 17:02:20 ] >>536 多分77の課題なんでね?それでいいとすると、あまりにあまり(正笑
538 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:41:55 ] !(Φ_Φ+){???} Ai+1 = Ai + Ai-1 ↓↓↓ 「全てに一致する」 i『option』 + 1 ≫『代入する』≪ 「全てに一致する」 i『option』 + 「全てに一致する」 i『option』 -1 A(i+1) = A(i) + A(i-1) ↓↓↓ 「全てに一致する」 (i『option』 + 1) ≫『代入する』≪ 「全てに一致する」 (i『option』) + 「全てに一致する」 (i『option』- 1)
539 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:50:49 ] !(Φ_Φ+){???} 『「全てに一致する」(command) i{option}』 == 『文字列、配列順に一致を優先する + i{option}』
540 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:55:32 ] 〆{この様に?} Ж √ζ {Ж}
541 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 13:14:21 ] do i=1,10 end do の場合、このループを抜けた後iの値は11になるのですか?
542 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 13:50:47 ] yes
543 名前:デフォルトの名無しさん [2007/06/02(土) 20:30:31 ] 大変初歩的なこととは思いますが質問です x : 1 2 3 4 5 ... y : -0.1 -0.02 0.03 0.1 0.7 ... のように,無数のxに対応するyの値を記録させるアルゴリズムがすでにあります. ここで,yの符号が変わったときの,対応するxを記録する(ここでいうx=3) 命令を組みたいのですが・・・ どうもわかりません. わかる方いれば教えていただけないでしょうか?
544 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 00:27:01 ] >>543 データ量が少ないなら、頭から1こづつ見ていっても対して変わらん。 それが嫌なら、単純なのは二分法。ぐぐればよろし。
545 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 12:03:57 ] ×づつ ○ずつ
546 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 17:50:33 ] >>545 歴史的仮名遣いでは『づつ』の方が正しい。 Fortran使いは、古いほうを好むべし。
547 名前:デフォルトの名無しさん [2007/06/03(日) 19:04:51 ] x-1とxのyを掛けて負ならば記憶させたら良いだけじゃ?
548 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:27:29 ] グローバル変数みたいなことしたいなら、commonじゃなくモジュール使えって言われますが commonだとどの変がまずいんですか?正確に複写しないとダメ、という他に 速度などの面でデメリットとかあるんでしょうか?
549 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:41:21 ] >>548 COMMONは色々厄介なのよ。 メモリーの先頭番地を合わせるだけなので、まったく別の名前で別の並びでも成立する。 サイズが合わなくてもいい。(処理系に依存するが最初に出た大きさになることが多いと思う) 昔はメモリー節約のために、今で言う動的割付のようにプログラマーがCOMMONを 自己責任で様々に再利用した。プログラムの前半と後半で、同じCOMMONブロックを まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。 そういうプログラムは非常にデバッグが難しい。読まされるほうは地獄。 そういう過去の怨念が溜まっているので、COMMONはとても忌み嫌われているのだ。 単なるGlobal変数として使う分には、その恐ろしさが分からないだろうが、COOMONは ほとんど無制限のメモリー領域の共有だと理解したほうが適切。 速度的にはむしろ早いんではないかと思ったりもする。
550 名前:548 mailto:sage [2007/06/04(月) 01:29:46 ] >>549 >プログラムの前半と後半で、同じCOMMONブロックを >まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。 昔はそんなことをしてたんですか・・・壮絶ですね でも逆に考えると、割と単純な科学技術計算とかで、複雑なことはしないが 速度はひたすらに要求されるような場合は、あえてcommonを使ったりするんでしょうか? 今は普通に引数で渡してますが、これ変えたら速くなるかなぁ
551 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:27:52 ] あらゆるところで変更されうるから、 common に起因するバグがあった場合、 バグのあるとろを探すのが大変、 というのはよく言われるところ。 ただ、common を避ける事で引数がもの凄く多くなるとなると、 それはそれで問題になる事もあったり。
552 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:42:58 ] >>550 最適化の問題などもあるので、今となってはCOMMONにする利益は無いのではないかと思う。 MODULEで渡しても変わらないのではないかと推測する。 FORTRANは参照渡し、すなわち変数のアドレスしか渡さないので、 変数のコピーを渡す値渡しと違って、それほど引数渡しのオーバーヘッドの問題は少ないと思う。 ただFortran90になってから、配列を受け渡すときに、サイズや次元の情報まで渡すようになったが・・ (FORTRAN77までは配列の先頭要素の番地しか渡さない)。 Fortran90の配列引渡しのとき、x(:)とかx(5:10)などと : 指定子を使って部分配列を渡そうとすると いまのFortranの実装では、呼び出し前に暗黙のダミー配列にコピーをつくり、それを渡して 戻ってきた結果を再び元の配列にコピーしている。したがってオーバーヘッドが大きくなる。 意味的には同じだが、xを渡す場合とx(:)を渡す場合だと、後者のほうが少し遅くなる。 巨大な配列は部分配列で受け渡さないほうがいい。
553 名前:548 mailto:sage [2007/06/04(月) 16:11:30 ] 詳しい解説ありがとうございます。勉強になります。 いつまでもFORTRAN77ではさすがに時代遅れになるかも・・・という漠然とした不安から、 上のバージョンへの移行を考えていたのですが、よく検討したほうが良さそうですね。 Fortran95とか新しいやつはオブジェクト指向とかも取り入れてるんでしたっけ。 速度を求めてる人にとっては論外なんでしょうね。。
554 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:15:07 ] >>553 Fortran95はFORTRAN77を含んでいるので、中途半端に移行してもいいんで内科医。 部分配列の引数受け渡しが遅くなるといっても、よほどのことが無い限り差はでないだろう。 オブジェクト指向はFortran2000からで、Fortran95ならPASCALが半分混じったような感じなので、 80年代とかに教育を受けた人には親しみやすいところがあると思う。 FORTRAN77を長く使った後で、Fortran90/95を使うと、痒いところに手が届くというか、 こんな機能があったらな、と思っていたような機能が色々入っているので、学んで損は無いと思う。
555 名前:デフォルトの名無しさん [2007/06/06(水) 00:25:16 ] IntelのコンパイラがVer10になった?
556 名前:デフォルトの名無しさん [2007/06/06(水) 00:55:42 ] 全日空の旧システムはFORTRANで書かれていた! ttp://itpro.nikkeibp.co.jp/article/JIREI/20070530/273051/
557 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:58:07 ] うn レジストレーション・センターに置いてあった。 IntelやXLsoftからはまだアナウンスがないけど、Windows版はなにやら Microsoft Visual Studio 2005 Premier Partner Edition Included だそうで。
558 名前:デフォルトの名無しさん [2007/06/06(水) 02:57:06 ] >>557 >Microsoft Visual Studio 2005 Premier Partner Edition Included kwsk
559 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 03:41:57 ] >>558 ttp://www.intel.com/cd/software/products/asmo-na/eng/compilers/fwin/278834.htm VSの簡易版(?)が付いて単体で使えるようになった。 あとPro版にMKLが付くようになった。
560 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 11:51:28 ] Product name Full product Support renewal IntelR Visual Fortran Compiler, Standard Edition, for Windows* $599 $2801 IntelR Visual Fortran Compiler, Professional Edition, for Windows* Includes IntelR Math Kernel Library $699 $280 IntelR Visual Fortran Compiler, Professional Edition, for Windows* with IMSL* Includes IntelR Math Kernel Library and IMSL Fortran Library $1,599 $749 1Support renewal qualifies you for upgrade to the Professional Edition ttp://www.intel.com/cd/software/products/asmo-na/eng/compilers/279613.htm よく分からんが、いままでのスタンダード版の更新料が$280に値上げになるが、 MKLも付くようになるという事でいいのかな?
561 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 14:07:06 ] fortran90って外部コマンド実行できますか? perlで言うsystem()みたいな ちなみにlinux環境です
562 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 14:08:42 ] 何でとりあえずやってみようとしないの?
563 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 14:22:40 ] fortranで外部コマンドなんて使えるの?いったいどういう仕組みで・・・ perlとかなら分かるけど
564 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 15:07:33 ] なんで使えないと思うのかが理解できない。
565 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:21:03 ] Fortran77の宿題なんですが・・、下のような行列を絶対値の小さいものから1行目に順に 並べるプログラムをつくれというものなんですが、分かりません。どなたかよろしくお願いします。 ‖2.0 1.0 -4.5‖ ‖0.0 -0.5 1.1‖ ↓ ‖0.0 -0.5 1.0‖ ‖1.1 2.0 -4.5‖
566 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:36:53 ] >>560 スタンダード版は新規のみでサポート更新がなくなったからプロ版(のサポート更新)にアップグレードしろ ということかと。
567 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:26:44 ] アップグレードで得られる権利: 各 プロフェッショナル・エディション に含まれる製品に対する使用権を所有します。 サポート期間が所有製品の現在の終了日より 1 年間更新されます。 例 ) インテル C++ コンパイラー 9.1 Windows 版 を 2006 年 10 月に購入した場合 ( この場合、サポートサービスが 2007 年 10 月まで有効 ) 、インテル C++ コンパイラー Windows 版プロフェッショナル・エディション SSR を購入することで、インテル C++ コンパイラー Windows 版プロフェッショナル・エディション に含まれるインテル C++ コンパイラーおよびすべてのライブラリー (IPP 、 MKL 、 TBB) のサポートサービスが 2008 年 10 月まで有効になります。 ttp://www.xlsoft.com/jp/products/intel/compilers/comp10_faq.html よく和歌欄が、今すぐ更新すれば従来の更新期間1年延長で、MKL付きの版に変わるという事か?
568 名前:デフォルトの名無しさん [2007/06/07(木) 03:04:51 ] >>565 2行3列に見えるのは、俺の目の錯覚? 「ソート」で調べて絶対値を被せたら良いだけじゃ?
569 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:36:43 ] 古いコンパイラで -Nl50 というオプションの効果がわかる方がいれば教えてください。
570 名前:デフォルトの名無しさん [2007/06/08(金) 17:06:33 ] >>569 コンパイラの種類は?バージョンは?
571 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 20:25:46 ] バージョンは分かりません。種類はFortranのコンパイラです。
572 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 23:55:35 ] >>571 お前はアホか! エスパーだって答えられないぞ! しょんべんで顔洗って出直せ! コンパイラのヘルプを見れなり、バナーを出すなりして、それをこのスレにコピペしろ。 それも出来ないなら、せめてコンピュータ名やOSくらいは書け。 脳みそがたりないようだから、何も考えるな、言われたままやれ。
573 名前:デフォルトの名無しさん [2007/06/09(土) 10:52:57 ] >571 まあ、とりあえず、そのコンパイラでコンパイルするときに打つコマンドは何? frt とか g77 とか、そんなんでわかるばあいもあるし。
574 名前:デフォルトの名無しさん [2007/06/09(土) 21:47:03 ] windows xp のコマンドプロンプトで f90のコンパイルして実行するとstack overflowしちゃいます. visual studio だとスタックサイズ増やせたんですが, コマンドプロンプト上でやりたいんです. どうしたらスタックサイズ増やせますか.
575 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:52:27 ] >>574 >>572-573
576 名前:574 [2007/06/09(土) 22:03:48 ] >>575 俺の頭が悪いのか理解できません 噛み砕くと?
577 名前:574 [2007/06/09(土) 22:28:12 ] 事故解決しました.おさわがせしました.
578 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 23:01:17 ] >>574 解決結果を書いておくと、備忘録になり、他の人の助けにもなる。 まぁ一般的に言えば、大概のコンパイラでは /help とか /? で、オプション一覧が出るので それを見れば解決するのだが・・・
579 名前:574 mailto:sage [2007/06/10(日) 00:25:33 ] じゃぁ。 自分ができた方法を・・・ 普通にコンパイル ↓ editbin /stack:十分な値(デフォルトは1Mだから、それ以上の数字) program.exe ↓ program.exe で、できました。もっと効率のよい方法もあるのかも、、、
580 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 03:01:07 ] >>579 コンパイラは何? Visual Studio上で動くFortranコンパイラにしても色々あるわけだが
581 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 05:35:56 ] ry、 / / } _/ノ.. /、 / < } ry、 {k_ _/`;, ノノ パンパン / / } ;' `i、 _/ノ../、 _/ 入/ / `ヽ, ノノ / r;ァ }''i" ̄.  ̄r'_ノ"'ヽ.i ) ―☆ {k_ _/,,.' ;. :. l、 ノ \ ` 、 ,i. .:, :, ' / / \ ,;ゝr;,;_二∠r;,_ェ=-ー'" r,_,/ ☆ 【ラッキーレス】 このレスを見た人はコピペでもいいので 10分以内に3つのスレへ貼り付けてください。 そうすれば14日後好きな人から告白されるわ宝くじは当たるわ 出世しまくるわ体の悪い所全部治るわでえらい事です
582 名前:574 [2007/06/11(月) 09:59:23 ] >>580 まぁ、前に書いたんですが・・・・ f90です
583 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 10:02:32 ] ( ゚д゚)
584 名前:デフォルトの名無しさん [2007/06/11(月) 10:48:04 ] >582 俺が不勉強なのかもしれんがf90というコンパイラは聞いたことがない。 そのソフト買ったとき、箱に f90 って書いてあった? なんていうメーカーの製品?
585 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:55:24 ] その製品を知ってれば答えられるが知らないなら答えられないというなら、 その製品が何かを聞き返すこと自体、意味がない気がしないでもない。
586 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 14:13:24 ] f90 は汎用コマンド名であって、コンパイラ名ではないな。
587 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 15:13:13 ] 任意の文字列C、整数Nを入力して、これらを連結してファイル名に使いたいのですが、 どうやればできるでしょうか?
588 名前:デフォルトの名無しさん [2007/06/11(月) 15:57:22 ] >>587 WRITE文を使えば簡単ですよ PROGRAM test IMPLICIT NONE CHARACTER(20) :: str1 = "test", str2 INTEGER :: i DO i=1,10 WRITE(str2,'(A,I3.3,".dat")') trim(str1), i WRITE(*,'(A)') trim(str2) END DO END PROGRAM test 出力結果 test001.dat test002.dat test003.dat test004.dat test005.dat test006.dat test007.dat test008.dat test009.dat test010.dat
589 名前:587 mailto:sage [2007/06/11(月) 18:02:38 ] ありがとうございます。trim関数ですか ただFORTRAN77なんですよね・・・
590 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 19:57:45 ] >>589 PROGRAM HOGE IMPLICIT NONE CHARACTER*10 C CHARACTER*20 STR INTEGER N, I READ(*,*) C READ(*,*) N I = INDEX(C,' ') - 1 IF (I .LE. 0) I = LEN(C) WRITE(STR, '(A, I3.3, ''.dat'')') C(1:I), N WRITE(*,*) STR STOP END
591 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 22:39:22 ] >>587 またこの質問かwwww 次からテンプレに入れておけ!(正笑
592 名前:587 mailto:sage [2007/06/11(月) 22:57:31 ] >>590 知りませんでした・・・>INDEX ありがとうございました
593 名前:デフォルトの名無しさん [2007/06/12(火) 03:04:08 ] //でくっ付けろよ。
594 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 09:11:28 ] >>593 まぁ、内部ファイルでやると1行で出来るからな。
595 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 00:06:45 ] N行N列の逆行列を求めるプログラムの作り方を教えてください・・・ ちなみにfortran90です LAPACK使えって言うのは無しで・・・
596 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 00:26:26 ] >>595 線形代数の行列の所で、掃き出し法によって逆行列を求める方法をやったでしょ。 それをそのままプログラムにすればOK、習って無くても、どの線形代数の本にもに載ってる と思うからから、調べてみて。数値計算だとガウス・ジョルダン法と呼ばれてる方法かな?
597 名前:デフォルトの名無しさん [2007/06/15(金) 10:15:01 ] LU分解 掃き出し法 スカイライン 色々あるよ。つーか数値計算の本読め。
598 名前:595 mailto:sage [2007/06/15(金) 11:11:08 ] 返事が遅くなって申し訳ない 助言ありがとうございます とりあえず、自力でまずはプログラム化してみます
599 名前:デフォルトの名無しさん [2007/06/15(金) 14:20:39 ] 教えて下さい。 H(l)を以下のように計算したいのですが、走らせても答えが「NaN」と表示されます。 どこがおかしいか教えて下さい。お願いします。 program FILTER c implicit real*8(a-h,o-z) dimension H(100000) open(115,file='H.dat') c do 10 l=1,n/2+1 f=df*(l-1) e=f/10.0 H(l)=((1.0/f)**0.5)*((1.0+(0.694*(e**2))+(0.241*(e**4)) &+(0.0557*(e**6))+(0.009664*(e**8))+(0.00134*(e**10)) &+(0.000155*(e**12)))**(-0.5))*((1.0-(dexp(-(f/0.5)**3)))**0.5) write(115,*) H(l) 10 continue c pause stop end (注)&は数式が長くなったため、改行している事を意味しているようです。
600 名前:デフォルトの名無しさん [2007/06/15(金) 14:29:00 ] >>599 n の値が不定 df の値も不定
601 名前:デフォルトの名無しさん [2007/06/15(金) 15:58:37 ] >>600 ありがとうございました。
602 名前:デフォルトの名無しさん [2007/06/17(日) 21:24:23 ] >>599 暇なんで書き換えてみた。 i=1 のときは、f がゼロだから 1/f が計算できないからパス。 program filter implicit integer(i-n) implicit real*8(a-h,o-z) real*8 ek(1:6) ek = (/ 0.69400d0, 0.24100d0, 0.055700d0, & 0.09664d0, 0.00134d0, 0.000155d0 /) df = 0.01d0 n = 20 do 1 i = 2, n / 2 + 1 f = df * (i-1) ee = f * f * 0.01d0 ex = 1.d0 ss = 1.d0 do 2 j = 1, 6 ex = ex * ee ss = ss + ex * ek(j) 2 continue sx = 1.d0 - dexp(-(f+f)**3) H = dsqrt( sx / (f*ss) ) write(*,*) i, H 1 continue stop end
603 名前:デフォルトの名無しさん [2007/06/18(月) 00:54:21 ] たぶんファイルからNを読み。 H.datの中のN個分のデータからH(I)を作りたいじゃ? もとのプログラムではHを配列にする必要ないけど。 dexp(-(f/0.5)**3)のf/0.5は 2*fの方が見やすいと思うけど。 元の定義式がこうなってるのかな?
604 名前:デフォルトの名無しさん [2007/06/19(火) 01:02:38 ] 複素数 C=(1.d0/3.d0,0.d0)のように分数などを打つとエラーが出るのはなんでですか? ちなみにC=(dlog(2.d0),0.d0)もエラーがでました。
605 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 01:26:40 ] >>604 cmplx()にしたらコンパイルできる。 次に質問するときはエラーメッセージくらいは 書いたほうが良いぞ。
606 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 01:28:40 ] 倍精度にしたそうだから dcmplx じゃないかな。 それともどっちでも自動的に補正してくれたっけ?
607 名前:デフォルトの名無しさん [2007/06/19(火) 01:30:16 ] >>604 ダメな理由はしらんが、 C = cmplx(1.d0/3.d0, 0.d0) でOK。
608 名前:デフォルトの名無しさん [2007/06/19(火) 02:09:37 ] >>605 >>606 >>607 ありがとうございました。 はじめにcomplex*16::c(100,100)と宣言しているので、そのままいけると思ってました。
609 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 02:10:49 ] 要するに (***, ***) で1つのリテラルだから、 その中に演算子とか(符号以外)入れれないんだろう。
610 名前:デフォルトの名無しさん [2007/06/20(水) 11:28:28 ] 質問させていただきます。 以下のプログラムで、y1とy3は答えとともにオープンしてくれるのですが、y2のオープンしたファイルが何も表示されません。 サブルーチン文はy1y2y3ともに引数は表示してくれてます。何か問題がありましたら教えて下さい。 お願いします。 program IFFT implicit real*8(a-h,o-z) dimension y1(1000000),y2(1000000),y3(1000000) complex*8 w1(1000000),w2(1000000),w3(1000000) dimension H(1000000),f(1000000) c open(114,file='d.dat') open(115,file='e.dat') open(116,file='f.dat') c m=15.d0 dt=0.01 n=2.0**m tp=n*dt df=1.0/tp c call SPECFILT(w1,w2,w3) do 21 j=n/2+2,n w1(j)=conjg(w1(n-j+2)) w2(j)=conjg(w2(n-j+2)) w3(j)=conjg(w3(n-j+2)) 21 continue c
611 名前:デフォルトの名無しさん [2007/06/20(水) 11:30:38 ] call nlogn(m,w1,1.0) do 24 k=1,n y1(k)=real(w1(k))/dt t=dt*(k-1) write(114,*) y1(k) 24 continue call nlogn(m,w2,1.0) do 25 k=1,n y2(k)=real(w2(k))/dt t=dt*(k-1) write(115,*) y2(k) 25 continue call nlogn(m,w3,1.0) do 26 k=1,n y3(k)=real(w3(k))/dt t=dt*(k-1) write(116,*) y3(k) 26 continue c stop end
612 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:01:49 ] >>610-611 入力ファイルが空なんだろう。 だいたい3つのファイルが同じ処理をしているなら、一つ用のサブルーチンを作って それを3回呼ぶようにすれば、このような疑問は生じない。 どうせ同じことだと横着して、同じ処理を3回書くから、どこかで間違ったかもと余計な時間を食う。 反省しろ! Fortranの神様に謝罪と賠償しろ!
613 名前:デフォルトの名無しさん [2007/06/20(水) 12:31:11 ] 612> それが入力ファイルもオープンしたらちゃんと値が表示されていたんですよ。
614 名前:デフォルトの名無しさん [2007/06/20(水) 12:54:58 ] >>610 質問と関係ないけど、 m=15.d0 dt=0.01 n=2.0**m tp=n*dt df=1.0/tp これ気持ち悪い。整数と倍精度実数はっきり区別して書く。 m = 15 n = 2**m dt = 1.0d-2 tp = dble(n) * dt df = 1.0d0 / tp f77も複素数型も使うことないので、あやふやだけど、 complex*8 は、実部と虚部の合計で8バイトで、実部と虚部それぞれは4バイト(単精度実数)、 complex*16は、実部と虚部の合計で16バイトで、実部と虚部それぞれは8バイト(倍精度実数)じゃなかったっけ? y1-y3 は real*8 なんだから、complex*16 のが良い気がする。 ちなみに、F90 以降の complex(8) みたいな宣言の方法だと、 実部・虚部それぞれが8バイトだったような気がする。
615 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:11:02 ] Microsoft PowerstationをWindowsXpにインストールしてFortranを使おう と思ったのですが、コンパイル時に Error executing fl32.exe. Text1.obj - 1 error(s), 0 warning(s) とエラーが出て先に進めません。 どうすれば解決するのでしょうか よろしくお願いします
616 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:04:58 ] >>615 どの文でエラーが起こったか分からないと 答えようがないんで… 文法間違いでないならサンプルで試してみたら 良いのでは?
617 名前:デフォルトの名無しさん [2007/06/21(木) 03:44:49 ] >>611 do 25 k=1,n の直前にnの値が何か書くように汁。
618 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 12:12:35 ] >>615 PowerStationはバグがあるから、新しいコンパイラ買え。
619 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 21:06:33 ] DO 100 L = 1 , 5 READ(IOT) & (((FTR(I,J,K,L),I=1,A),J=1,B),K=1,C) 100 CONTINUE というプログラムで、値は全てファイルから読み込ませます。 予めAとBとCは読み込みをさせています。 それでこのプログラムを実行させようとすると input statement requires too much data, unit200, file "ファイル名" と表示されて実行出来ません。どうやらデータの読みすぎのようなのですが、 心当たりがありません。 考えられる原因は何があるのでしょうか。 A,B,Cは200×100×50くらいの値です。
620 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:43:44 ] >>619 ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/em/em01_03.htm >evere (67): Input statement requires too much data >FOR$IOS_INPSTAREQ。書式なし READ 文または PAD='NO' で開かれたファイルからの書式付き順番 READ 文で既存の記録以上のデータを読み取ろうとしました。
621 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 23:23:17 ] >>619 A*B*C〜1,000,000〜1M 単精度なら4倍して4M データファイルの大きさがこれくらいあるか? まぁファイルの読み取りが、ここだけとしての話だがw
622 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:04:04 ] ありがとうございました
623 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:50:59 ] ハードウェアで4倍精度演算をサポートしてないと劇遅だよな
624 名前:デフォルトの名無しさん [2007/06/22(金) 15:10:51 ] end file premeture で終わるタイプと違う?ただのエラー表示の違い?
625 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:55:05 ] >>623 当然だろw コプロが無かった時代のパソコンでの計算を思い出せw
626 名前:デフォルトの名無しさん [2007/06/24(日) 22:37:16 ] 初歩的な質問でしたら申し訳ないのですが、調べてもわからないので質問させて下さい。 fortranで作ったプログラムを実行ファイル(EXE形式)にするにはどうすればいいのでしょうか。 (プログラムを実行するたびにfortranを起動して[コンパイル]→[ビルド]→[実行]するのは面倒なので、 .exeをダブルクリックするだけにしたいのです)
627 名前:デフォルトの名無しさん [2007/06/24(日) 22:46:43 ] >>626 一度、ビルドしてたら、実行ファイルできてないですか? フォルダが作成されてたらその中とかに。
628 名前:626 mailto:sage [2007/06/24(日) 23:03:43 ] >>627 「Debug」フォルダの中に実行ファイルできてました。 どうやらアホな質問をしてしまったようで申し訳ないです。 どうもありがとうございました。
629 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 01:36:53 ] >>628 練習用の短いプログラムならいいけど、本番用や他のマシンに持って行くプログラムは ちゃんと「Release」でビルドして使え。
630 名前:デフォルトの名無しさん [2007/06/26(火) 16:32:17 ] 質問させてください。 OPEN文の中にDO文を適用するのは可能でしょうか? 例えば、 OPEN(10,FILE='TEST1.TXT',STATUS='UNKNOWN')という文章の中の ↑ ↑ 矢印で指した数値にDO文を適用して、たくさんのデータを 開きたいと考えています。 例えば DO 1 I=1,N OPEN(I,FILE='TESTI.TXT',STATUS='UNKNOWN') 1 CONTINUE というような感じです。エロい人、宜しくお願いします。
631 名前:デフォルトの名無しさん [2007/06/26(火) 17:20:17 ] >>630 >>587-590
632 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:31:31 ] >>630 もう千回くらい既出。
633 名前:デフォルトの名無しさん [2007/06/27(水) 01:04:35 ] エクセルから数値を読み込んで処理させようとしたのですが、 うまく読み込んでくれません。ちなみに2次元ベクトルです。 ファイル形式は.csvでいいのでしょうか? open(10,file='〜.csv') do i=1,10 read(10,*) (A(i,j),j=1,10) end do close(10) という感じでしました。 よろしくお願いします。
634 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:24:01 ] >>633 どう「うまく読み込んでくれ」ないのか詳しく。 全く読めないのか、特定のデータが来ると読めないのか、ランタイムエラーで止まるのか・・・
635 名前:デフォルトの名無しさん [2007/06/27(水) 01:47:00 ] >>634 write文のように数字が表示され、止まってしまうんです。 同じ形式であと3つほど書いたので、たぶん1つ目と同じで止まると思います。
636 名前:デフォルトの名無しさん [2007/06/27(水) 02:43:22 ] おまえの頭では分かっていても他人に説明できてないのを理解しろ A(i,j)は2次元ベクトルでないと言うのはOKか? >>633 では数値データは100個分だけだよな? i,jの成分で200個有るとかじゃないよな? エラーメッセージ書け
637 名前:633 [2007/06/27(水) 09:12:30 ] 今から学校に行ってまた送ります。
638 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 12:06:30 ] >>635 EXCELのCVS形式の読み書きの話はここレスがあったから、まず探して鯉!
639 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 13:05:13 ] >>635 EXCELのCVS形式の読み書きの話はここレスがあったから、まず探して鯉!
640 名前:635 [2007/06/27(水) 16:55:17 ] was detected (unit=10).id decimal character (the relative position causing an error in a record = 96 ) 3,3,3,5,4,5,4,5,6,4,5,5,6,8,6,6,9,12,6,6,7,10,13,7,10,13,8,9,12,15,12,15,19,12,1 5,15,20,25,25,35 ? error occurs at MAIN__ line 10 loc 00010690 offset 0000004c MAIN__ at loc 00010644 called from o.s. taken to (standard) corrective action, execution continuing. was detected (unit=10).id decimal character (the relative position causing an error in a record = 230 ) 略 ? error occurs at MAIN__ line 16 loc 000106cc offset 00000088 MAIN__ at loc 00010644 called from o.s. taken to (standard) corrective action, execution continuing. という長大なエラー文が出てしまいました。 プログラムは open(10,file='danmenseki.csv',status='old') !表1.1を読み込む do ii=1,3 read(10,*) (A(ii,ij),ij=1,40) end do close(10) で、line10はread文のところです。 ご教授お願いします。
641 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:30:22 ] うーん。まず問題の切り分けをしていこう。 とりあえず、こいつは動くか? program test integer a(3,40) integer i, j open(10, file='danmenseki.csv', status='old') do i = 1, 3 read(10, *) (a(i, j), j = 1, 40) end do close(10) do i = 1, 3 write(*, *) (a(i, j), j = 1, 40) end do stop end
642 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:31:36 ] む。nbsp はエディタがどう認識するんだろう? ちょっと心配になったから、 先頭の空白は自分で入れて貰った方がいいかもしんない。
643 名前:デフォルトの名無しさん [2007/06/27(水) 17:48:46 ] >>640 手元で試したら、↓のような感じで csv カンマ区切りデータを読み込めたけど、 こんな感じではダメでしょうか。 OPEN(1,file="test.csv") DO i=1,imax READ(1,*) a(i, 1:jmax) END DO CLOSE(1)
644 名前:635 [2007/06/27(水) 17:56:47 ] was detected (unit=10).d decimal character (the relative position causing an error in a record = 96 ) 3,3,3,5,4,5,4,5,6,4,5,5,6,8,6,6,9,12,6,6,7,10,13,7,10,13,8,9,12,15,12,15,19,12,1 5,15,20,25,25,35 ? error occurs at MAIN__ line 7 loc 00010688 offset 00000044 MAIN__ at loc 00010644 called from o.s. taken to (standard) corrective action, execution continuing. jwe0173i-w line 7 Invalid decimal character . was detected (unit=10). (the relative position causing an error in a record = 1 ) 1.427,1.727,2.336,3.755,3.492,4.302,3.892,4.802,5.644,4.692,5.802,6.367,7.527,9. 761,8.127,8.727,12.69,16.56,9.327,10.55,12.22,17,21.71,13.62,19,24.31,18.76,22.7 4,29.76,36.75,34.77,42.74,53.38,40.52,50.21,57.75,76,93.75,119.4,162.6 略 という感じでエラーメッセージが出ます。 エクセルの保存元がいけないのでしょうか?
645 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:00:23 ] danmenseki.csv の中身はどんな感じなの?
646 名前:635 [2007/06/27(水) 18:02:51 ] >>643 ありがとうございます。 jwd2005i-w "keisan.f90", line 14: この変数'imax'は,値を設定せずに引用されてい ます. jwd2005i-w "keisan.f90", line 15: この変数'jmax'は,値を設定せずに引用されてい ます. となってしまいます。うまく読み込んでもらいたいのですが…
647 名前:635 [2007/06/27(水) 18:05:26 ] >>645 3 3 3 5 4 5 4 5 6 4 1.427 1.727 2.336 3.755 3.492 4.302 3.892 4.802 5.644 4.692 0.747 0.908 1.23 1.2 1.36 1.36 1.53 1.52 1.5 1.85 です。(右側は略)
648 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:07:03 ] csv になってないけど、本当にそうなってるの? 何かさっきから勝手に略しすぎてて、 どこに問題があるのか分からんよ。
649 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:12:49 ] よし。こうなったら、これが動くかどうか確認してみて。 ttp://www.hsjp.net/upload/src/up1068.zip
650 名前:635 [2007/06/27(水) 18:13:01 ] >>648 3 3 3 5 4 5 4 5 6 4 5 5 6 8 6 6 9 12 6 6 7 10 13 7 10 13 8 9 12 15 12 15 19 12 15 15 20 25 25 35 1.427 1.727 2.336 3.755 3.492 4.302 3.892 4.802 5.644 4.692 5.802 6.367 7.527 9.761 8.127 8.727 12.69 16.56 9.327 10.55 12.22 17 21.71 13.62 19 24.31 18.76 22.74 29.76 36.75 34.77 42.74 53.38 40.52 50.21 57.75 76 93.75 119.4 162.6 0.747 0.908 1.23 1.2 1.36 1.36 1.53 1.52 1.5 1.85 1.84 1.99 1.98 1.94 2.14 2.3 2.25 2.22 2.46 2.77 2.76 2.71 2.68 3.08 3.04 3 3.71 4.01 3.96 3.93 4.61 4.56 4.52 5.38 5.35 6.14 6.09 6.04 7.63 7.49 エクセルのセルにそのままデータを入力したのですが、だめでしょうか? 友達は.datで成功したらしいのですが…
651 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:15:12 ] こっちだとそのデータでうまく行くね。 何が悪いんだろう? OS とコンパイラは何?
652 名前:635 [2007/06/27(水) 18:19:46 ] OSはWindowsXP コンパイラはUNIXです。 コンパイラ、UNIXの意味がわからないので違うかもしれませんが
653 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:21:13 ] Cygwin の gcc を使ってるの?
654 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:22:19 ] あいや、g77 か。 コンパイラってのは、大雑把に言えばプログラムを実行ファイルなどに変換するもの。
655 名前:635 [2007/06/27(水) 18:23:48 ] f90 〜.f90 -o 〜 というやりかたでコンパイルします。 たぶんCygwinではないとおもいます。先生は勧めていましたが、それを使えばうまくいくのでしょうか?
656 名前:635 [2007/06/27(水) 18:32:48 ] わかりました。 Tera Term ah.〜 です。
657 名前:デフォルトの名無しさん [2007/06/27(水) 19:19:25 ] gfortranで、xx.fというファイルをコンパイルしてみたのですが、 > gfortran xx.f で、文法上のエラーは無いものの、下のメッセージが出ます。 ググってはみたんですが、対処法が分からず困っています。 助けてください。 xx.f: In function 'MAIN__': xx.f:342: internal compiler error: Segmentation fault Please submit a full bug report, with preprocessed source if appropriate. See <URL:gcc.gnu.org/bugs.html> for instructions.
658 名前:デフォルトの名無しさん [2007/06/27(水) 19:20:48 ] あ、OSはXP sp2です。
659 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:53:56 ] >>655 む、Fortran90 か。 困ったな。こっちにゃコンパイラがないや。
660 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:55:03 ] >>657 コンパイラのバグで落ちてるように見える。 同じことを実現する別のコードに書き換えると 回避できる可能性はある。
661 名前:デフォルトの名無しさん [2007/06/27(水) 21:34:07 ] >>660 俺は配列が間違ってる希ガス ソースだせ。該当ラインの前後10行くらい
662 名前:643 [2007/06/27(水) 22:26:26 ] >>646 それくらい、察してくださいよ。
663 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 22:46:15 ] >>656 いやそれ、全然わかってないから。 >>644 >jwe0173i-w line 7 Invalid decimal character . was detected (unit=10). 富士通のコンパイラか? ttp://ccinfo.ims.ac.jp/vpp/manhtml/html/japan/lang/Fort/html/japan/langFortMSG/fmej03/fmej0025.htm 入力ファイル中の"."が10進数値ではない不正な文字だ、と出ているが 配列Aを整数型で宣言しているとか、入力ファイル中に数値以外の文字が混ざっているとかしてないか? いずれにせよ、いきなり本番用のでかいデータを読み込ませたりせずに まずは>>643 のプログラムの頭にimax, jmaxを適当な小さい値で追加して、 test.csv もそれに合わせて手入力で作ってテストしてみろ。
664 名前:633 [2007/06/27(水) 23:00:27 ] >>663 ありがとうございます。 実のところ、入力ファイルを.datに変換してtestの方を実行すると、うまく(?)いきました。 また、write文で','を使って.csvを出力することはできました。 1×96行列になってしまいましたが… 多次元配列は扱えないのかもしれません。
665 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:01:12 ] 扱えないわけが無いと思うんだが。
666 名前:633 [2007/06/27(水) 23:11:30 ] >>665 エクセルの隣の列に移す記号を教えてもらえませんか? ','はわかるんですけど、「改行」のようなものを意味する記号は何ですか?
667 名前:デフォルトの名無しさん [2007/06/27(水) 23:12:15 ] 色んなことが、ごっちゃになって理解できてないな。 エクセルの、読みこむ側のファイルってタブ区切りか?
668 名前:633 [2007/06/27(水) 23:36:08 ] 読み込む側はエクセルのファイルをTera Termにコピペしたものを.datで保存したものです。 なので区切りとかはないと思います。
669 名前:667 [2007/06/27(水) 23:48:18 ] エクセルのファイルは普通のエクセルか?と言っても668には何を言いたいか わからないだろうな。 エクセル開いてドラッグで範囲決めてコピペしてるのか? vista側のエディタは何だ?秀丸とかか? 制御文字を表示させると区切り分かるけど。
670 名前:633 [2007/06/28(木) 00:03:58 ] MicrosoftのOffice2003のエクセルです。 コピペはその通りです。 ちなみにXPです。 エディターはよくわかりませんが「emacs -nw 〜」コマンドでテキストウィンドウを開きます。
671 名前:643 [2007/06/28(木) 00:25:07 ] >>633 OpenOffice.org Calc しかないから、Excel だと若干違うかもだけど、 csv 形式で保存するときに、区切り文字していできるでそ。 そこで、区切り文字カンマ(,)で保存すると、 ----------ここから---------- 1,2,4,8,16,32 -1,-3,-9,-27,-81,-243 10,100,10,100,10,100 0,0,1,0,0,1 ----------ここまで---------- こんなファイルできる。 で、↓のような Fortran90 プログラムで読み込みと表示の確認ができると思う。 ----------ここから---------- PROGRAM read_csv IMPLICIT NONE INTEGER,PARAMETER :: imax=4, jmax=6 REAL(8),DIMENSION(imax,jmax) :: a INTEGER :: i OPEN(1,file="test.csv") DO i=1,imax READ(1,*) a(i,:) END DO CLOSE(1) DO i=1,imax WRITE(*,*) a(i,:) END DO END PROGRAM read_csv ----------ここまで----------
672 名前:633 [2007/06/28(木) 00:41:05 ] >>671 ありがとうございます。 うちではできないので、学校に行って実際にやってみようと思います。 一応エクセルでは.csv形式で保存できるのですが、保存する際に警告みたいなメッセージが出るので 原因はそれなのかな?と思いはします。
673 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:56:22 ] >>672 それは 「csv(テキスト)で保存するとExcelの計算式やセルの装飾などの情報が失われるよ」 という警告だがら、関係ない。
674 名前:667 [2007/06/28(木) 12:04:28 ] コピペするとタブ区切りで持っていくはずだけどね
675 名前:657 [2007/06/28(木) 12:33:54 ] メッセージのxx.f:342は、342行目ということだったんですね。 342,343行目は、 STOP END なんですが。。
676 名前:661 [2007/06/28(木) 14:39:50 ] だから前後て書いてるでしょ サブルーチンあるのか?配列の引渡しは、うまくやってるか?
677 名前:672 [2007/06/28(木) 14:56:13 ] >>671 やはり、 was detected (unit=10).id decimal character (the relative position causing an error in a record = 13 ) 3,1.427,0.747 ? error occurs at MAIN__ line 15 loc 000106ec offset 00000044 MAIN__ at loc 000106a8 called from o.s. taken to (standard) corrective action, execution continuing. というエラーになります。 プログラムは implicit none integer,parameter :: imax=24,jmax=4,iimax=3,ijmax=40 real(8),dimension(imax,jmax) :: N,L,M real,dimension(24,4) :: X integer,dimension(24,4) :: K real,dimension(iimax,ijmax) :: A real(8),dimension(3,40) :: B real :: f real(8) :: lambda,omega integer :: i,j,ii,ij open(10,file='danmenseki.csv',status='old') !表1.1を読み込む do ii=1,iimax read(10,*) (A(ii,ij),ij=1,ijmax) end do close(10) です。 >>673 ソフトの問題ではないわけですね。ありがとうございます。
678 名前:657 [2007/06/28(木) 19:45:34 ] >676 ありがとうございます。 全部で546行のソースで、342行目にSTOP、343行目にENDがあります。 その後ろに4つのSUBROUTINEがあります。 配列の引渡しについては、引数を確認しましたが、型・サイズは同じでした。
679 名前:661 [2007/06/28(木) 20:25:40 ] >>678 デバッグモードで確認するかだね。gfortranはできるのかな? gnuだからできると思うけど
680 名前:657 [2007/06/28(木) 21:24:58 ] >>679 ありがとうございます。 コンパイラのデバッグモードって、このオプションのことですか? わけのわからないメッセージが出まくったのですが。困りました。 -fdump-parse-tree Output the internal parse tree before starting code generation. Only really useful for debugging the GNU Fortran compiler itself. これ以外の Options for Debugging Your Program or GNU Fortranは、 runtime用のもののようです。
681 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:29:04 ] >>677 どうもこちらで再現できないから、 うまくいった友達とやらに見てもらった方がいいかもしれん。
682 名前:661 mailto:sage [2007/06/28(木) 21:37:17 ] デバッグは「-g」のはず。 gdb使ってね。 一通りミリ ttp://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html "-fbounds-check"でこけたりして
683 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:21:15 ] まだCVSファイルの問題が解決してないのかw たしか富士通のコンパイラはレコード長の絡みでうるさいので、それかも試練。 入力データの1行の長さはどれくらいだ? すごく長いなら、OPEN文でレコード長を大きくしておけ。 富士通のコンパイラは10年くらい使ってないから、保障しないがw
684 名前:677 [2007/06/30(土) 00:30:41 ] 結局.datファイルで入力することにしました… 出力の方は24×4のはずが96×1で出てしまいますが手作業で直しました。 月曜にまた学校でいろいろ試してみますね。
685 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:21:05 ] >>684 >出力の方は24×4のはずが96×1で出てしまいますが つ 改行コード Windows側で LFのみの改行に対応したエディタか変換ツールを使うヨロシ。
686 名前:デフォルトの名無しさん [2007/06/30(土) 16:58:07 ] >>685 ftpソフトでwin-unix lf-cr+lf対応を使った方が早いと思う。
687 名前:デフォルトの名無しさん [2007/07/01(日) 22:28:27 ] フォートラン初心者です. BLASを使っていろいろ計算しようとしたんですが,内積で何故か良く分からない数値がでます. PARAMETER ( N = 4) REAL*8 e(N)/N*1.0/ inc = 1 WRITE(6,*) DDOT(N,e,inc,e,inc) END 実行結果が 2.25000000 1,1,1,1と1,1,1,1の内積だから4になってほしいんですが・・・ C言語なら少しは分かります. だれかぼすけて
688 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:09:45 ] >>687 適当なので気休めまでに。 REAL*8 e(N)/N*1.0/ これを REAL*8 e(N)/N*1.0d0/ にしてみそ。 コンパイラによっては、単精度4バイト4つ分を頭から詰めているのかもしれない。 別に考えられるのは、関数を直接WRITE文で書き出しているが、一旦変数に入れるのもよろし。 Cと違ってValueでは返さないので、関数をサブルーチンの引数にしたりすると コンパイラによって受け付けたり、受け付けなかったり、暴走したりすることがある。 ただ、Write文だから大丈夫だと思うが。あとf90になってからは、おkのことが多い気が駿河。
689 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:55:33 ] >>687 Intel Fortran Ver.10.026 + MKL 9,1 では、ちゃんと4が出たwww おぬしのコンパイラ環境等は何ぞや。
690 名前:687 [2007/07/02(月) 06:56:16 ] >>688 >REAL*8 e(N)/N*1.0d0/ 変化無しOrz 初期化は上手く行ってるみたいです. それといったん変数に入れても同じ. ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・ >>689 よくわからないんですが適当にHPを漁ってみると 本体:FUJITSU PRIMEPOWER HPC2500 OS:Solaris 8 コンパイラFortran JIS X3001-1:1998 (Fortran95) マニュアルとかのリンクが富士通なので,コンパイラも富士通だと思います コンパイル時は, %frt test.f90 -SSL2 -O0 でやってます スパコンでベクトルの内積一本とか,なにやってんだ俺\(^o^)/
691 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 11:29:11 ] >>690 %frt -SSL2 -O0 test.f90 こうとかwwwww >ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・ これが気になるな。症状的にはサブルーチンの単精度倍精度の割り当て違いっぽいので。 DDOTにもDOUBLE指定が必要な仕様かw IMPLICIT REAL*8 (a-h,o-z) もつけてみるかw
692 名前:デフォルトの名無しさん [2007/07/02(月) 14:26:52 ] pgf90のコンパイルで困っています。 makeを実行すると PGF90-W-0119-Redundant specification for name_size (Size_Class.f90: 101) のようなエラーがでてきます。 これはコンパイルオプションでなんとかできるものなのでしょうか? 教えてください。
693 名前:デフォルトの名無しさん [2007/07/02(月) 16:34:13 ] >IMPLICIT REAL*8 (a-h,o-z) かもね。 ただ、最適化するな。それで答えはどうなる? 最適化の問題か
694 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:12:58 ] >>693 オプション -O0 使ってるから、最適化はして無いだろう。 多分DDOTもdble宣言しておかないと駄目なんだろ。EXTERNALと合わせて。 前にも似たような症状がスレに出ていた希ガス。 この辺は、NEC<<<Fujitsu<Hitachi の順でコンパイラのケツの穴が狭いという 昔の言い伝えにあるように、Fujitsuはコンパイラが宣言にうるさいんだろ。 NECはゆるすぎて、ホモの尻穴のごとく何でもホイホイ容れてしまうのだがwww ところで、おまいら 京速コンピュータがNEC、日立、富士通の三社合同になったことをどう思う? 完全に破滅コースに入ったと思うんだがwwwwwwww
695 名前:デフォルトの名無しさん [2007/07/03(火) 00:16:01 ] >>694 最適化しないというオプションは効いてない場合もある。-Oは書かない。 京速?北海、九州コンピュータに頑張ってもらおう。
696 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:44:22 ] >>695 >北海、九州コンピュータに頑張ってもらおう。 意味分からん。解説よろ。
697 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 04:54:07 ] linpackのMPI版はありませんか?
698 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:07:37 ] >>697 あるべ。
699 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 02:02:05 ] 最近WINDOWS版g95をインストールし問題なく動いていたのですが、 突然エラーが出るようになってしまいました。 g95: installation problem, cannot exec 'as': No such file or directry とでて、コンパイルができなくなっている状態です。 pathは通っていますし、インストールもうまくいったはずなのですが・・・ なにより最近まできちんど動いていたので、全く原因がつかめません。
700 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:03:12 ] >>699 動いていたときと動かなくなった間に、何をしたのかを書かなければ誰にも分からん。 何もしていないというのは無し。 XPだったら復帰ポイントで戻れw
701 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 16:24:12 ] 自宅でfortran77を使うために、CPad for FTN77をダウンロードしたんですが コンパイルして実行すると コンパイルに失敗しました。 ファイル"〜〜test.exe”は存在しません。 と言われるのですがどうすれば解決できますか?
702 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:25:56 ] >>701 バグ取りすれば解決できます。
703 名前:701 mailto:sage [2007/07/06(金) 21:35:33 ] >>702 度々すみません 具体的にどういうことをすればいいんでしょうか?
704 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:38:10 ] >>703 自分の入力したプログラムをじっくり眺めて間違ってるところを直せばいいだけだよ。
705 名前:701 mailto:sage [2007/07/06(金) 23:49:35 ] >>704 学校ではコンパイルも実行もできたやつなんですが… といっても間違いがないとは限らないということでしょうか 簡単なもので試したんですが write(*,*)'test' end でもできませんでした。 下のメッセージに ■C:\〜〜〜〜〜〜〜〜〜\data> ftn77 /link test.f Cannot open authorisation file c:\〜〜〜\ftn77.ser: (文字化けしてる) System error (3): 指定されたパスが見つかりません。 と出てました。 ftn77.exeにつなげてるんですが…。
706 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:03:08 ] >>705 FTN77は日本語の入っていないパスにインストールしろ。
707 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 03:10:21 ] >>701 同じ質問がこのスレだけですでに2,3回出ているw >>65 あたりみろ
708 名前:701 mailto:sage [2007/07/07(土) 12:56:23 ] できましたー! 一番の原因は>>706 さんが言ってることでした 答えてくれた方々、本当にありがとうございました
709 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:45:18 ] 今度質問することがあったら、最初からエラーメッセージをコピペしような。
710 名前:デフォルトの名無しさん [2007/07/08(日) 13:09:06 ] 粘IN/1-T の式をTを0から3まで0.5刻みでとって さらにN=1、2、3、4、5について別々に求めたいのですが、わかりませんどなたかよろしくお願いします
711 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:16:07 ] すいません↑の式は 粘IN30/1-T-n 狽ヘn=1からNまでです
712 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:33:21 ] DO 10 T=0,3,0.5 S=0 WRITE(*,100) T DO 10 N=1,5 S=S+SIN(30*3.14159/180)/1-T-N 10 WRITE(*,101) N, S STOP 100 FORMAT(1H , 'T=', F6.2) 101 FORMAT(1H ,'N=',I2,F12.3) END
713 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:34:10 ] 神です!ありがとう
714 名前:デフォルトの名無しさん [2007/07/09(月) 08:16:24 ] まー>>711 の式が悪いので、本当に計算したいモノと違うだろうな と思うが、ある程度書いて貰ってるから後は自分で変えろ。 おれは712では、ないけど。>>711 を指摘しようと思ったけどヤメタ
715 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:30:43 ] 何時も気になるんだけど、このスレの住人はFORTRAN77とかFORTRAN95とか 明示せずに質問したり、解答したりしてるけど問題に成らないのか?
716 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 02:28:56 ] 回答する分には答えやすい方(主にF95)に勝手に脳内補完するから無問題。 問題になるなら>>1 をよく読んでから質問しろと言いたい。
717 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:49:19 ] >>715 宿題はを聞く奴は違いが分からないw 結局は77になるようだが。 そうでない場合は90で答えて大丈夫だろう。さすがに90処理系はたいがいどこにでもある。
718 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:52:16 ] 77で答えておけばそれより上位でもだいたい問題ない。
719 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:08:26 ] >>694 すごく・・・買vロジェクトです。
720 名前:デフォルトの名無しさん [2007/07/12(木) 01:20:37 ] GNUのfortranって何であんなに遅いの?
721 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 09:40:57 ] >>720 素人が作ってるからでないの? GNU-Cだって倒産した商用コンパイラを引き継ぐまではf2c+gccで、小さなサンプル以外は まともに走ったことが無かったような記憶が。
722 名前:デフォルトの名無しさん [2007/07/13(金) 18:39:06 ] ↓この問題が全くわかりません。 教えてください。 よろしくお願いします。 ...... call rndm0 ( ) ...... a = rndm ( ) ...... b = rndm ( ) このルーチンを使って、乱数を 100 回発生させて それをファイルに書き込む プログラムを作成せよ。それを実行し、ファイルに正しく書き込まれたことを 確認せよ。なお、メインプログラムと独立したファイルにサブプログラムが 書かれている場合は、メインプログラムを違う名前のファイルで作成した後に、 コンパイルすればよい。
723 名前:デフォルトの名無しさん [2007/07/14(土) 10:48:45 ] 自分で調べるのを前提に書く サブルーチンを使ったプログラム書けってことじゃ? PROGRAM HOGE ファイルを開く(OPEN文) ループスタート 100回 CALL RNDM() Aを書く エンドループ ファイルを閉じる(CLOSE文) STOP END SUBROUTINE RNDM 乱数発生するぞするぞ! RETURN END 「メインプログラムと独立したファイルにサブプログラムが書かれている場合」 てのは、ライブラリが有るって事 調べて分からない場合は又書き名。調べた痕跡が分かれば俺は答える。
724 名前:722 [2007/07/14(土) 14:32:45 ] >>723 ありがとうございます。 調べてみます!
725 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 03:39:15 ] ボコボコにしてやんお .∧_∧ ( ^ω^)=つ≡つ (っ ≡つ=つ / ) ババババ ( ノ ̄∪
726 名前:デフォルトの名無しさん [2007/07/19(木) 11:52:59 ] たとえば、 WRITE(*,'(E10.4)') 0.0001234 とすると、出力結果は0.1234E-03となります。 この出力結果を、1.234E-04とするにはどうしたらいいのでしょうか?
727 名前:デフォルトの名無しさん [2007/07/19(木) 14:40:44 ] そうするメリットは何? 文字として扱うかですね。
728 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 17:24:04 ] E形編集を使ったこと無いから、気付かなかったけど E形編集ってメイドコスプレしたオッサン並に気持ち悪い。
729 名前:デフォルトの名無しさん [2007/07/20(金) 00:09:39 ] >>727 おい! クソ豚! わかりもしないことに口出しするな! しょんべん飲んで、とっとと死にやがれ! >>726 その要望は多くの人が持っていたので、Fortran90で対応がなされた。 ただしFORTRAN77でも出来ることは出来る。 Fortran90なら、ESフォーマットを使えばよい。SはScientificのSだ。 工学と科学では表記の伝統が違うようだ。詳しくはマニュアル嫁。 Fortran77の場合は、1P, E10.4, 0P を使えばよい。Pフォーマットは思わぬ副作用があるので、 使用後はすぐに 0P で元に戻しておいたほうが間違いが無い。 詳しくはマニュアル嫁。
730 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:19:02 ] >>727 そりゃ少ない文字数で多くの桁を表現できるからだろ。
731 名前:デフォルトの名無しさん [2007/07/20(金) 14:49:51 ] >>729 0.123...... 1.234...... と小数点以下を同じ桁数でして、桁数も大きくすると 仮数分の限界を越すと思うが
732 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 16:49:58 ] 何が言いたいのか分からない
733 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 21:14:08 ] 無視でおk
734 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:45:57 ] >>731 WRITE(*,'(E10.4)') 0.0001234 〜〜〜 ちゃんと>>726 を読んだらどうだ? 2chなんか見てないで、精神病院でも逝って来い!
735 名前:デフォルトの名無しさん [2007/07/22(日) 03:13:48 ] r(i)をreal(8)の配列として、 sin(r(i))の値を求めたいのですが、出力が0になります。 どなたかどうすればちゃんとした値が帰ってくるのか教えてください。
736 名前:デフォルトの名無しさん [2007/07/22(日) 03:55:29 ] r(i) がゼロなんじゃね?
737 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 03:57:02 ] 整数に代入した後に出力してるとか。
738 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:18:36 ] >>735 ソース見せろ
739 名前:デフォルトの名無しさん [2007/07/25(水) 20:50:00 ] 配列の宣言で、REAL A(10,5)とすべところをA(5,10)と間違って宣言したままコンパイルし、 しかもboundのチェックしないオプションでコンパイルしてエラー等は起きずに動いた場合、 たとえば、A(7,7)にアクセスした結果は、 どちらの宣言でも同じなのでしょうか? C言語の場合は同じというような話をきいたことがあるのですが、FORTRANの場合 いかがでしょうか? 処理系に依存して結果が不定なのでしょうか?
740 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 20:52:54 ] 同じなわけがない。C でも。
741 名前:デフォルトの名無しさん [2007/07/25(水) 21:53:51 ] C言語なら5×10=50のエリアに連続的に並んでいるだけだから、 A(7,7)は49番目というつもりなら境界を越えない限りは アプリの実行結果は同じになるんじゃないか。
742 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 21:55:50 ] A(10,5) で A(7,7) はおもっくそ境界越えとるがな。
743 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:22:18 ] >>742 従来のFORTRANでは、境界はあまり気にしなくていい。 というか、サブルーチンに渡したりするときは次元すら気にしない。 どうせ先頭番地しか渡してないので。自己責任でGo! >>740 >>741 が正しい。 どうせメモリー上では1次元に展開されているので、どう展開されるか分かっていれば 本来不正な添え字でも、目的の配列要素をアクセスすることが可能。 ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。 FORTRANは縦書き。A(1,1),A(2,1),A(3, 1),.....,A(1,2), A(2,2), A(3, 2),.....という風にメモリー上に 並んでいる。 .
744 名前:デフォルトの名無しさん [2007/07/26(木) 07:24:32 ] FORTRANの他に数値解析に向いてる言語って何がありますかね?
745 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 08:43:53 ] >>743 いや、配列のために確保されているメモリ領域を越えちゃってるという意味で・・・
746 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:30:25 ] >>745 今回に限って言えば、50>7*7=49でぎりぎりセーフでね?
747 名前:デフォルトの名無しさん [2007/07/26(木) 12:17:43 ] >>746 Cは0から始まるから A(7,7) は (7+1)*(7+1)=64番目なのよ。 まあ、>>739 のは Cの場合はA(6,6)と読み替えてやるのがよろし。
748 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:23:45 ] >>746 A(10,5) で A(7,7) にアクセスするってのは、 10 * (7 - 1) + 7 = 66 番目のメモリ領域にアクセスするってことで、 50 要素しかない A(10,5) のメモリ領域は余裕で越える。
749 名前:747 mailto:sage [2007/07/26(木) 12:32:02 ] >>748 確かにそうだ。何で1行7要素だと思ったのか。 馬鹿だった。
750 名前:デフォルトの名無しさん [2007/07/26(木) 14:56:16 ] じゃA(5,10)なら良いのか? violationになりそうだけど
751 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:32:06 ] 5 * (7 - 1) + 7 = 37 だから、 確保したメモリ領域を越えないという点に関してのみは問題は無い。
752 名前:739 [2007/07/26(木) 19:38:10 ] >740-751 皆さんありがとうございました。 考え方がよくわかりました。 変な質問になってしまい申し訳有りません。 A(7,7)は例が悪かったと反省しています。
753 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:58:59 ] >>744 お金があったらMATLAB 貧乏人ならOctave
754 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:33:09 ] >>748 んだ。おまいが正しい。わしが間違ってた。すまんこw
755 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:32:54 ] >>743 >どうせメモリー上では1次元に展開されているので、 そうなんすか・・・知らんかった つまり、A(7,7)は単に先頭から7*7=49番目を見るってことですか? >ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。 つまりFORTRANは左から、Cは右から1,2,3,・・・と展開していくってことですか
756 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:37:39 ] >>755 ちょっと前のレスくらい読めよ・・・
757 名前:755 mailto:sage [2007/07/27(金) 12:39:52 ] >>756 すいません新着し忘れてましたすいません
758 名前:747 mailto:sage [2007/07/27(金) 12:51:34 ] まだ混乱しているようだから、整理すると SUBROUTINE A(X) INTEGER X(10,5) WRITE(*,*) X(7,3) END SUBROUTINE PROGRAM INTEGER Y(5,10) Y(2,6)=10 CALL A(Y) STOP END とかやると ちゃんと 10って表示されるってことでしょ。 Y(2,6) は前から27番目。 X(7,3)も27番目だから。 メインルーチンの中で Y(7,7) とかやるとコンパイル時にエラーが出ると思う、さすがに FORTRAN77の頃は結構利用されていたような気がする。 普通は1次元配列で作って2次元で受け取るとかその逆だと思うけど。
759 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:42:25 ] すいません.Fortran90で複数行をまとめてコメントアウトすることはできないのでしょうか?
760 名前:755 mailto:sage [2007/07/27(金) 13:55:30 ] >>758 ありがとうございます。もんすごい良く分かりました。 Y(7,7)でやってみたところ、g77だとやはり out of defined rangeとなりましたが、 ifort9ではコンパイルでき結果も一致しました。 SUBROUTINE A(X) INTEGER X(10,5) WRITE(*,*) X(7,4) END SUBROUTINE PROGRAM INTEGER Y(5,10) Y(7,7)=10 CALL A(Y) STOP END ifortって緩いんですかね?
761 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:18:10 ] >>760 配列の範囲チェックに限らず、ifortは微妙にいろいろ緩いよ。少なくともg77よりは。 オプションで変わるのかも知れないが、デフォではそう。 最初のうちはg77で練習した方がいいかもね。
762 名前:デフォルトの名無しさん [2007/07/27(金) 17:14:05 ] Fortran77で、Do文を利用して配列に値(1or0)を代入して ファイルにはいたら途中から?????とか巨大な数が でてしまうのですが、 何か初期化などが必要なのでしょうか? Do文の前にx(i,j,k)=0とか入れてるのですが、 これでは駄目なのでしょうか?
763 名前:デフォルトの名無しさん [2007/07/27(金) 17:51:26 ] >>762 1か0を代入した配列要素を参照すれば1か0を返すと思います。 予期せぬ値を吐いているのは、配列が宣言されてから、 その要素に一度も値が代入されていないからだと思います。 予期せぬ値が配列のどの要素にあたるのか考えてみれば 大抵あっさり解決すると思いますよ。
764 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:02:58 ] Intel fortranだと初期化してない変数は自動で0になるんよね
765 名前:762 mailto:sage [2007/07/27(金) 20:22:52 ] >>763 ,764 ありがとうございます。 使用しているのはSalfordのftn77peです。 配列要素は代入したものを参照しているはずなのですが。。。 以下の内容ですが間違いありますか? integer h parameter(ilimit=10) parameter(jlimit=20) parameter(klimit=2) real Conc(ilimit+1,jlimit+1,klimit+1) open(10,file='tests1.csv') i=0 j=0 k=0 h=5 Do 300, i=0,ilimit Do 200, j=0,jlimit if(j.lt.h) then Conc(i,j,k)=0.0 else Conc(i,j,k)=1.0 endif write(*,*)i,j,k,Conc(i,j,k) write(10,*)i,j,k,Conc(i,j,0) 200 Continue 300 Continue c close(10) stop end
766 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 22:09:46 ] >>765 FORTRANの配列は特に指定しない場合は 1から。 >使用しているのはSalfordのftn77peです。 >>765 のプログラムを/CHECK オプションを付けてコンパイルすると実行時エラーが出る。 /FULLCHECK オプションを付けるとコンパイル時にエラーになる。 配列を0から始めたいのなら以下のようにする。 real Conc(0:ilimit,0:jlimit,0:klimit)
767 名前:762 [2007/07/28(土) 13:05:47 ] >>766 アドバイスありがとうございます。 教えていただいたオプションつけると 実行時エラーが確かにでますね・・・ どこに間違いがあるのでしょう?
768 名前:762 mailto:sage [2007/07/28(土) 13:09:51 ] >>766 初期化したら大丈夫でした。 何から何までありがとうございました。
769 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 17:13:16 ] gfortran, ifort で NaN を検出したいのですが、 どうすればよいでしょうか。 program test real(8) :: x,y x=1. y=0. write(*,*) x/y,isnan(x/y) end $ gfortran test.f90 /tmp/ccABo1qT.o: In function `MAIN__': test.f90:(.text+0xa3): undefined reference to `isnan_' collect2: ld はステータス 1 で終了しました $ i$ ifort test.f90 $ ./a.out Infinity F 鳥は Linux 2.6.20-gentoo-r8 SMP x86_64 Intel(R) Xeon(TM) CPU 3.80GHz GenuineIntel GNU/Linux $ gfortran --version GNU Fortran 95 (GCC) 4.1.2 (Gentoo 4.1.2) $ ifort --version ifort (IFORT) 9.1 20070215 です。
770 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:48:12 ] >>769 Intel Fortran, g95 なら program test real(8) :: x,y x=0. y=0. write(*,*) x/y,isnan(x/y) end gfortranの場合は知らん。
771 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:18:08 ] >>770 thanks. infinity は NaN ではなかった。小手先の工夫で program test real(8) :: x,y x=0. y=0. x=x/y if(x-x.ne.0.) then write(*,*) x else write(*,*) x-x endif end を考えたのですが gfortran は NaN を返し、ifort は 0.000000000000000E+000 を, ifort -O0 は NaN を返しました。例外をトラップしようと思うと、 c のプログラムをリンクせざるとえないのかな。
772 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:20:20 ] >>771 マニュアル味噌。 Module: USE IFPORT Syntax result = IEEE_FLAGS (action, mode, in, out) gfortranの方は知らんが、F2003対応のIEEEモジュールを誰かが作ったとか書いてあったような。 記憶違いだったら、ごめんw
773 名前:デフォルトの名無しさん [2007/08/02(木) 03:31:02 ] わざわざNanを検出する理由は何か?
774 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:17:03 ] >>773 なんもない
775 名前:726 mailto:sage [2007/08/09(木) 12:58:16 ] >>729 ずいぶん遅くなってしまいました。 私のやりたいことはデータを並び替えるだけなのですが、もともとの出力データは役所が絡んでいるので、 出力形式がオリジナルのものと違うと何かと説明が面倒なのです。 ありがとうございました。
776 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 10:45:29 ] 標準入力でファイル名入れるときに、普通のシェルみたいに、タブによるインクリメントサーチ使えたらなぁ やっぱり無理だよね?
777 名前:デフォルトの名無しさん [2007/08/10(金) 14:36:40 ] だれかこのプログラムの使い方教えてください cera-www.dkrz.de/IPCC_DDC/info/Readme.gzip ASCIIデータをなにかに変換するプログラムなのですが 自分無知でよくわかりません。 おねがいしますm(__)m
778 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 16:19:46 ] ノットあナンバーはコンピューータサイエンスやるなら覚えとけボケ
779 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:15:35 ] >>777 只のデータフォーマットの説明とサンプルプログラムのようだが。 よくわからないなら使うなよ。
780 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 00:51:39 ] >>778 Fortran利用者はコンピュータ・サイエンスなんか知らない。 計算機自体をサイエンスだなんて何言ってんの?あんた馬鹿?って認識だろw IEEEフォーマットが普及したのはありがたい。 IBMとクレイのフォーマットが最後までがんばっていたようだが、 各社の糞数値フォーマットもようやく死滅したようで、まずはめでたい。 Infのおかげで、ゼロ割エラーで止まらなくなったのはうれしい。 IF文で避けているはずなのに、投機的実行して0割エラーでアボンとか、ウンコ漏れそうになるw 正直NaNはあんまり助けにならん。 >>777 その質問じゃ答えようが無い。 もう少し具体的に質問すれば誰か答えてくれるだろう。 書いてあることは、>>779 の言うとおりだ。 1.gzipで圧縮してあるからばらすが良い。解凍するとASCIIファイルが出る。 2.そのASCIIファイルのデータの書式。および読み込みサンプル。 の2点だ。
781 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 07:47:23 ] 中二病?
782 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 18:38:47 ] 夏休みで暇だから、宿題を持ってきたまえ。
783 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:27:55 ] >>777 中身もちゃんと見ていないが、たぶん、IPCC(国際的な専門家でつくる気候変動に関する政府間パネル) が、シミュレーションした結果をGRIB形式とかいうので保存してあるというやつの 中身の説明と、サンプルプログラムじゃないかな。
784 名前:デフォルトの名無しさん [2007/08/21(火) 11:56:55 ] OPEN(5,FILE='C:\\test-data.txt') DO 20 K=1,200 READ(5,25)X(K),Y(K) 25 FORMAT(2F20.0) 20 CONTINUE のとき、test-data.txtはどんなデータを与えればいいのだ? 2F20.0がよくわからん。
785 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:10:05 ] >>784 勝手に装置番号 5番を使うなよ。とか、 不用意に入力に書式仕様を使うなよ。というのは置いといて。 2F20.0 「20文字読み込んでその値を実数と見なす。小数点も指数も含まない場合は小数部のない実数と見なす。」 を 2回繰り返す。
786 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 00:32:58 ] >>785 まぁ F20.0 を使ったのは筋のいいほうでないかいw
787 名前:デフォルトの名無しさん [2007/09/01(土) 03:44:42 ] >>785 unit 番号は置いといて 読みこむ場合は、カラムの20,21カラムがしっかりしてたら 123.456 とかを入れても、123.456できちんと格納されてるよ。
788 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:11:05 ] データの桁位置が絶対にズレないということなら大丈夫なんだけどね…
789 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:07:04 ] Fortranで整数型 i = 1を文字型に変換するにはどうしたらよいでしょうか? i = 1 hoge = char(i) だとhogeに『のような文字が入りうまくいきません.
790 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 20:54:09 ] >>789 二バイト文字を入れたいという質問か?
791 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:02:48 ] >>789 >>587-590
792 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:39:58 ] このスレは内部ファイルの質問の無限ループだなw
793 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 08:01:37 ] 超初心者用だからな。 それだけ初心者にとって理解しにくい部分ってことだろ。
794 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:22:38 ] 次からテンプレに内部ファイルの使い方を書いといてくれ。
795 名前:デフォルトの名無しさん [2007/09/09(日) 19:45:39 ] visual fortranだと動くのに、FTN95だとめちゃくちゃエラーがでて コンパイルできません。金が無いんでフリーのFTNで動かしたいのですが 主な原因わかるかたいるでしょうか?
796 名前:デフォルトの名無しさん [2007/09/09(日) 21:04:57 ] >>789 Fortran まだあるのかよ Format変換かけて内部にWriteすればよいと思う SFTNとかUFTNとかあるのだろうか... $Branchi $do とか...
797 名前:エスパー mailto:sage [2007/09/09(日) 21:51:03 ] >>795 Visual Fortran独自の機能を使っているからだよ。
798 名前:デフォルトの名無しさん [2007/09/10(月) 13:12:28 ] FORTRAN使いが許容できるのはFORTRAN77迄だべ。 もはやFORTRANは死んでいる。C言語のプリプロセッサに成り下がった。
799 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 13:46:42 ] >>798 終わってるのはCのほうだろw
800 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:49:41 ] すいません。 整数を格納する1次元配列と整数のデータがあります. 整数データを重複を許さないで(重複データを飛ばして)配列に格納するにはどうすればよろしいでしょうか?
801 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 19:49:54 ] >>800 sort uniq
802 名前:デフォルトの名無しさん [2007/09/11(火) 05:00:09 ] 超初心者です。 format文の練習のために 学籍番号122番のアキラ君は 英語50点,国語80点、数学30点。この3科目の合計点は160点です。」 という文字を表示するプログラムを character*20 a integer b real c,d,e,f read(*,10)a,b,c,d,e,f 10 format(a6,i3,3i2,i3) f=c+d+e write(*,20)b,a,c,d,e,f 20+format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。') stop end というように作ったんですけど 0007) write(*,20)b,a,c,d,e,f 0008) 20+format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。') *** Non-blank label field in continuation line 0008) 20+format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。') WARNING - Characters found after column 72 (use -NO_WARN73 to suppress) *** Unterminated or empty character constant 2 ERRORS,1 WARNINGS [<MAIN@>FTN77 Ver 4.03] *** Compilation failed とでてコンパイルできません。どこがいけないのでしょうか?
803 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 10:05:09 ] >>802 20+format プラス記号が紛れ込んで、継続行扱いになっている。それで矛盾。 あと72カラムはみ出している。 一応エラーメッセージを読めば書いてある。 初心者はエラーメッセージを読んでも分からないといって読まないのが普通だが、教養人なら読めw
804 名前:デフォルトの名無しさん [2007/09/12(水) 02:28:32 ] >>803 返信ありがとうございます。 すいません。お聞きしたいのですが72欄をこえて書くにはどうしたらよいのでしょうか? ネットで調べたら 6欄は72欄を超えてしまった場合、ここに何か文字を書けば(たいていは「+」を書く)、72欄を越す文であっても続けて書き続けることができるようになります。 と書いてあったのですけど自分の書き方ではいけないのでしょうか? 初心者名質問ですいません。ぜひ教えてください。
805 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 11:37:24 ] >>804 72カラムを超えては書けないので、次の行に継続することになる。 20 format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語', + i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。') こんなかんじか。よく確かめていないが。
806 名前:デフォルトの名無しさん [2007/09/12(水) 14:59:44 ] >>804 ありがとうございます。コンパイルできました。 しかしまたあらたな問題が。 ネットでは>>802 のプログラムをコンパイルして実行したら 「学籍番号122番のアキラ君は 英語50点,国語80点、数学30点。この3科目の合計点は160点です。」という文が表示されます。 とかいてあったのですが実際に実行したらコマンドプロンプトの画面に C:\fortaran>format とでてきて何かを入力するみたいなんですがどのように入力すればいいのでしょうか? アキラ,122,50,80,30,160 と入力すればいいのでしょうか?でもコマンドプロンプト上では日本語入力できなくてこまってるんですけど。 すいません。また初歩的と思われる質問になってしまって。 お手数ですがよろしくお願いします。
807 名前:デフォルトの名無しさん [2007/09/12(水) 15:01:26 ] >>804 ありがとうございます。コンパイルできました。 しかしまたあらたな問題が。 ネットでは>>802 のプログラムをコンパイルして実行したら 「学籍番号122番のアキラ君は 英語50点,国語80点、数学30点。この3科目の合計点は160点です。」という文が表示されます。 とかいてあったのですが実際に実行したらコマンドプロンプトの画面に C:\fortaran>format とでてきて何かを入力するみたいなんですがどのように入力すればいいのでしょうか? アキラ,122,50,80,30,160 と入力すればいいのでしょうか?でもコマンドプロンプト上では日本語入力できなくてこまってるんですけど。 すいません。また初歩的と思われる質問になってしまって。 お手数ですがよろしくお願いします。
808 名前:デフォルトの名無しさん [2007/09/12(水) 15:02:19 ] すいません連続投稿となってしまいました。
809 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 20:16:55 ] >>806 >何かを入力するみたいなんですが つ READ文 使い方は(ry >どのように入力すればいいのでしょうか? アキラ122508030160 >コマンドプロンプト上では日本語入力できなくて [Alt] + [半角/全角 漢字] あと >>802 のプログラムは「変数の型」と「FORMAT文」について要復習だ。
810 名前:デフォルトの名無しさん [2007/09/14(金) 23:52:05 ] >>809 ありがとうございます。 もっとしっかり勉強します!
811 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 23:10:26 ] www12.plala.or.jp/ksp/formula/mathFormula/html/node8.html これらの式の右辺部を計算しようとした時に 式の通りに考えて wa=(1/2)*(n*(n+1)) wa=(1/6)*(n*(n+1)*(2n+1)) のようにしたらうまく計算出来ずにnに何を入れても0が出てしまいます。 wa=(n*(n+1))/2 wa=(n*(n+1)*(2n+1))/6 みたいにしたら出来たのですが。。。 上と下の違いがよくわかりません。括弧などの付け方は間違ってないと思うのですが・・・ 変数は integer n double precision wa で設定しました。
812 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 23:40:42 ] >>811 質問する時は一部だけ示すのではなく、コンパイル出来るソースを 最初から最後まで示すべき。 括弧の中の演算は先に実行されるから、先に(1/2)が計算される。 整数型同士の除算1/2は0となり、0と何が掛けられても0になる。 (1/2)でなく、(1./2.)と書いたら計算結果が変わるでしょ?
813 名前:811 mailto:sage [2007/09/15(土) 23:58:14 ] 質問の仕方が悪かったようで、申し訳ありませんでした。 今後はそのように質問させて頂きます。 問題は無事解決いたしました。どうも有り難うございました。
814 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 23:00:33 ] 素因数分解をするプログラムを組みました。 出力を99=1*3*3*11 みたいに1行に書きたいのですが 99=1 *3 *3 *11 のように複数行にわたってしまいます。これを改行せずに書きたいのですがどのようにしたらいいのでしょう。 文字列であれば write(*,'(a\)')'hoge' のように出来るのですが文字列と整数がごっちゃになった場合だとどうしてもうまくいかなくて・・・ アドバイスお願いします。 また、もしwrite文以外でもおかしな所があれば教えてください。 ソース(f90)は次の書き込みで書きます。
815 名前:814 mailto:sage [2007/09/16(日) 23:01:56 ] implicit none integer n,i,m,k write(*,'(a\)')'input n:' read(*,*)n write(*,*)n,'=1' k=n i=2 do while (i<=k) m=mod(k,i) if(m==0)then write(*,*)'*',i k=k/i cycle else if(k==i)then exit else i=i+1 cycle endif enddo end
816 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 23:21:51 ] write(*,'(A,I4,\)') '*', i
817 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 00:45:50 ] >>814 program unko implicit none integer n,i,m,k write(*,'(a)', ADVANCE='NO')'input n:' read(*,*)n write(*,'(i4, a)', ADVANCE='NO')n,'= 1' k=n i=2 do while (i<=k) m=mod(k,i) if(m==0)then write(*, '(a, i3)', ADVANCE='NO') ' *', i k=k/i cycle else if(k==i)then exit else i=i+1 cycle endif enddo WRITE(*, *) end program unko FORTRAN90の標準内でやろうとすると、ADVANCE='NO'を使うことになると思う。
818 名前:814 mailto:sage [2007/09/17(月) 03:24:10 ] >>816 >>817 レス有り難うございます! 解決しました!なるほどそのように書けばよいのですか。 同じ改行しないようにするのでも 標準仕様とか拡張?仕様などによって変わるのですね。
819 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:18:17 ] Visual Studio 2005 + Intel Fortran v10 で、ソース行のトレースバックってどうやって表示させるの? CVFの時代は、簡単に出来たんだけど。 ソース行が分からないと、実行時エラーが出ても対処がめんどい。
820 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 12:46:28 ] >>819 Version 9系ならソース行付きトレースバックでる。10と共存できるのでとりあえずそれで見たら?
821 名前:デフォルトの名無しさん [2007/09/20(木) 14:13:16 ] 横に並んでいるデータをエクセルで1つのセルに表示させたいので、列ごとにファイルを出そうと思っているのですが 上手く読み込んでくれません。 わかるかたいたら教えていただきたいと思います。 program example implicit real*8(a-h,o-z) dimension x1(1000000),x2(1000000),x3(1000000),t(1000000) open(200,file='iwayaguchi1023k.dat') open(100,file='x1.dat') open(110,file='x2.dat') open(120,file='x3.dat') m=16.d0 n=2.0**m read(200,*) read(200,*) read(200,*) read(200,600) (t(i),x1(i),x2(i),x3(i),i=1,n) 600 format(4f10.3) do 10 k=1,n read(300,*) x1(k) read(300,*) x2(k) read(300,*) x3(k) write(100,*) x1(k) write(110,*) x2(k) write(120,*) x3(k) 10 continue pause stop end
822 名前:デフォルトの名無しさん [2007/09/20(木) 14:14:33 ] ちなみにもとのデータは以下のようになっています 2004/10/23 17:56:00 37.2900 138.8000 13.0 6.8 NIG001 38.2584 138.4337 2004/10/23 17:56:21 172960.010 N-S E-W U-D 0.000 -0.023 -0.025 -0.001 0.010 -0.006 0.003 0.009 0.020 0.001 -0.023 0.016 0.030 -0.020 -0.044 0.002 0.040 -0.012 -0.021 -0.001 0.050 -0.005 0.002 0.006 0.060 0.021 -0.004 -0.006 0.070 0.012 -0.004 0.004 0.080 -0.022 -0.020 -0.007 0.090 -0.038 0.018 -0.031 (このようなのがずっと続く) お願い致します。
823 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:36:59 ] >>821 program hoge implicit none character*8 dmy real*8 t, x1, x2, x3 integer i open(200, file='iwayaguchi1023k.dat', status='OLD') open(110, file='x1.txt', status='REPLACE') open(120, file='x2.txt', status='REPLACE') open(130, file='x3.txt', status='REPLACE') do 10 i = 1, 3 read(200, *) dmy 10 continue 20 continue read(200, fmt=*, end=99) t, x1, x2, x3 write(110, *) x1 write(120, *) x2 write(130, *) x3 goto 20 99 continue close(200) close(110) close(120) close(130) stop end >横に並んでいるデータをエクセルで1つのセルに表示させたいので、 データファイルを開くときにテキストファイルウィザードで 「元のデータ形式」に「スペースによって右または…」を選択して[次へ] フィールド区切りの矢印をダブルクリックですべて消して[完了]
824 名前:デフォルトの名無しさん [2007/09/21(金) 12:41:54 ] >>823 ありがとうございます。 おかげさまで問題解決いたしました。
825 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 13:03:30 ] 解決した、しなかっただけでなく、「どのようにして」のところを書いてほしい。
826 名前:デフォルトの名無しさん [2007/09/24(月) 15:01:57 ] 多重積分で2次元から3次元に拡張しただけなのにunpaired right bracketsが あることと、truncated lineがあるとエラーが出ました。こうしたエラーの 原因はなんでしょうか?
827 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 16:36:38 ] >>826 超能力者になれるかな。 1行72文字オーバー
828 名前:デフォルトの名無しさん [2007/09/25(火) 13:34:14 ] 825> 言われたとおりやったら解決いたしました
829 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 01:52:57 ] 質問させてください. あるFortranの計算コード群をソースからビルドしライブラリを作成した後, Cのコードから呼び出そうと考えています. ここで (1) Fortranコンパイラでビルド (2) f2cされたコードをCコンパイラでビルド の2つには有意な性能の差が生じるのでしょうか. 定説があれば教えて頂けると幸いです.
830 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 03:29:22 ] 定説はないので計ってみるしかない 自分の僅かな経験では (1)Intel Fortran Compilerと(2) f2c + gccについて 自分の書いたソースで比べたところ(1)の方が速かった
831 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 16:42:57 ] すいません。 計算終了時に何かしら音が出るようにしたいのですが、 何かBEEP音のようなものを出す命令はないのでしょうか。
832 名前:829 mailto:sage [2007/09/28(金) 02:06:46 ] >>830 経験談ありがとうございます 時間のとれるときにじっくり計測してみたいと思います
833 名前:デフォルトの名無しさん [2007/09/30(日) 01:30:11 ] メモ帳でプログラムを組んでるんですが、インデントの感じが気に入りません。 Emacsみたいなフリーで手に入ってWindows XPで動くようなエディタはありませんか?
834 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:45:58 ] >>833 気に入らないも何もメモ帳はインデントしてくれないだろ? Emacsみたいなのが欲しいのなら、windowsで動くemacsクローンはMeadowとかいろいろある。
835 名前:833 [2007/09/30(日) 09:48:23 ] notepadのインデントはtabをおしたら何行も進むという意味です。 meadowとxyzzyならどっちがいいでしょうか?
836 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:49:56 ] >>835 手動インデントのことだったのか。てっきり自動インデントのことかと思った。 でも、タブで何行も進む?本当にそれはメモ帳? 835の「いい」の基準が分からないから実際にmeadowとxyzzyの両方を使ってみて気に入った方にすればいい。 慣れとかの点でemacs系を選択しようとしているんだと思うが、 emacsに拘らないのならメモ帳でソース書くよりは全然マシなフリーなエディタはwindowsにいくらでもあるぞ。 FORTRANに特化したものは無くてもFORTRANモード的なものを持ったものは何もemacsだけではない。
837 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 18:37:01 ] メモ帳はTABキーを押しても「タブ文字」が挿入されるだけ。
838 名前:833 [2007/09/30(日) 21:19:56 ] とりあえず、サクラエディタを入れてみました。 質問に答えていただいてありがとうございました。
839 名前:デフォルトの名無しさん [2007/10/02(火) 13:29:19 ] www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran95/fortran77.htm Fortranを始めようと思ってこのページにある方法でやろうとしているのですが うまくいきません。 WRITE(*,*) 'TEST' END と入力してコンパイルしようとしても 「コンパイルに失敗しました ファイルC:\.....\fotran.exeは存在しません」 と言われて実行することが出来ません。 これはどうすれば良いのでしょうか? いますぐFortranを練習する必要があり、困っています。 どなたかお願い致します。
840 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 14:00:49 ] >>839 fortran.exeがどこにあるか検索してみては? そんなに急ぐなら、周りの友達に飯でも奢って助けてもらったら?
841 名前:デフォルトの名無しさん [2007/10/02(火) 14:12:49 ] >>840 fortran.exeの場所はちゃんと指定しています。 コンパイルして作成されるはずの実行ファイルがないと 言われているのですが。 それと 周りにfortranを扱える人はいません。
842 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 14:37:30 ] コンパイルして作成されるはずの実行ファイルがC:\.....\fotran.exeなの? それはコンパイラ自身じゃないの? FORTRAN処理系が何で、どういうインストールの仕方をして、 どこに何というソースファイルを作って、どういうふうにコンパイルをしたか、 詳しく書かないと原因がよくわからない。 単にWindowsのコマンドプロンプトの使い方が分かってないだけの問題ということはない?
843 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 14:44:14 ] WRITE(*,*) 'TEST'とENDの前に6つのスペース入れていないに1票
844 名前:デフォルトの名無しさん [2007/10/02(火) 15:01:19 ] >>843 ありがとうございます。 スペースを入れるとうまくいきました。 でも ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/examples/ex1_1.f90 このページにあるプログラムをそのままコピペして使おうとしても なぜか同じエラーが出てしまうのですが これはなぜなのでしょうか? スペースはちゃんと入っているはずなのですが
845 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 15:10:19 ] なんでそれで 「コンパイルに失敗しました ファイルC:\.....\fotran.exeは存在しません」 なんてエラーメッセージがでるんだよw
846 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 15:30:46 ] >>844 Fortran77のコンパイラでFortran90のコードをコンパイルするのは無理だと思いますよ。 FTN95でもインストールして見てはいかがですか? >>845 おまい、頭悪いな。>>839 がコードのファイル名をfotran.for'として 保存したからに決まってるだろw
847 名前:デフォルトの名無しさん [2007/10/02(火) 15:47:00 ] Fortran90とFTN95って どちらの方が新しいのでしょうか?
848 名前:844 [2007/10/02(火) 16:01:30 ] そんなに特殊な記述を使わない限り90の記述でも 77で使えると聞いたのですが違うのでしょうか? 一体どこの部分を治せばコンパイル可能になりますか? !----- Ex1_1: 3種類の平均値 ----- PROGRAM Example_1_1 REAL :: a, b, av1, av2, av3 READ *, a, b av1 = (a + b)/2.0 av2 = (a*b)**0.5 av3 = 2.0/(1.0/a + 1.0/b) PRINT*, av1, av2, av3 END
849 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:19:57 ] >>848 REALから始まる行を削除すればいい。
850 名前:デフォルトの名無しさん [2007/10/02(火) 16:24:48 ] >>849 やってみました。 でもうまくいかないようなんですが・・・
851 名前:デフォルトの名無しさん [2007/10/02(火) 16:45:54 ] www.silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.asp を使ってみましたが それでもうまくいきません。 なんなんでしょうか?これは?
852 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:51:26 ] >>846 「コンパイルに失敗しました」はコンパイラの吐くエラーだし 作られたはずの実行ファイルが無いというメッセージはコンパイラが吐くとは思えないんだが
853 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:52:13 ] >>851 普通にそのコンパイラで>>844 のコードも>>848 のコードも動きました。 付属のPlato3起動して左上のマウスを乗せるとNewを表示される白いアイコンをクリック 出てきたウィンドウでFree format Fortran source fileが選択されてる事を確認してOKを押す >>844 をコピペしたら、左上のマウスを乗せるとStartと表示される青い三角アイコンをクリック 適当なファイル名で保存(拡張子は弄らない) 保存後にウィンドウが出るが気にせずOKをクリック で動かなければ後は白根山 >>852 実行ファイルが無いというメッセージはCpadが吐いてる。
854 名前:デフォルトの名無しさん [2007/10/02(火) 19:24:31 ] >>853 丁寧な解説ありがとうございます。 しかし それと同じことはすでに行っているのですが sakuratan.ddo.jp/imgboard/img-box/img20071002191043.jpg のようなコマンドプロンプト画面が出てくるだけでプログラムが始まりません。 OSはXPsp2なのですが、それと何か関係があるのでしょうか?
855 名前:854 [2007/10/02(火) 19:31:26 ] すいません、解決しました。 数値を入力すれば良かったんですね。 ありがとうございます。 でも >>848-849 のように>>839 のコンパイラでうまくいかないのはなぜなのでしょうか? 実際に使用するのはFortran77なので 77に準拠したコンパイラを使いたいのですが。
856 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:53:39 ] >>855 何をやったのか どんな結果になってうまくいかなかったのか エラーメッセージが出たらその内容 くらい書かないと「しらねーよ」としか答えられない。
857 名前:デフォルトの名無しさん [2007/10/02(火) 22:06:47 ] >何をやったのか >どんな結果になってうまくいかなかったのか >エラーメッセージが出たらその内容 全部>>839 に書いてあるのですが・・・
858 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:04:32 ] >>857 「コンパイルに失敗しました」と表示されたときに CPadの下の方のメッセージウィンドウに何か表示されてない?
859 名前:デフォルトの名無しさん [2007/10/03(水) 11:42:56 ] >>858 ■C:\Documents and Settings\....\Fortran> ftn77 /link ttt.for [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998] Licensed to: FTN77 Personal Edition Department: Non-commercial use only 0001) !----- Ex1_1: 3種類の平均値 ----- 0002) PROGRAM Example_1_1 *** Unexpected continuation line (have you got more than 19?) 0007) PRINT*, av1, av2, av3 0008) END *** Non-blank label field in continuation line 0008) END 0009) *** Unexpected end of file (END statement assumed) 3 ERRORS [<MAIN@>FTN77 Ver 4.03] *** Compilation failed ^C というエラーが出ています。 どうすればいいんでしょうか?
860 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:51:10 ] >>859 1から6カラムまで開けろや!
861 名前:デフォルトの名無しさん [2007/10/03(水) 12:34:36 ] >>860 すいません、どういう意味ですか? 開けるというのは何を開けるのですか?
862 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 18:12:30 ] 言っちゃ何だが、FORTRANの文法をよく勉強したほうが いいんじゃないか? 自分のしたいことをコード化できないようじゃ理論ギャップ があるのかバグがあるのか判断できないじゃまいか。
863 名前:デフォルトの名無しさん [2007/10/03(水) 18:14:39 ] 勉強はするつもりです。 だからとりあえずコンパイラがちゃんと動くしたいのです。
864 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 18:42:19 ] じゃあ、エラーメッセージ読んで考えろよw
865 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 03:45:16 ] >>861 >>843 どんな入門書でも最初の数ページ以内に書いてあるような基本的なことだぞ。 ちゃんとしたプログラムが書けなきゃコンパイラがちゃんと動くかどうかも確認できないぞ。
866 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:29:36 ] >>865 Fortran90と混同しているから、教えるのはかなり大変だぞwwww 教育者としての真価が問われる。 神化しないと切れるだろうwwwwwwwwwww
867 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 03:23:05 ] もやすみちゃん
868 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 01:50:10 ] 関数をサブルーチンの引数とすることはできるのでしょうか? サブルーチンの引数として被積分関数や積分範囲等を設定できればと思っています。 どなたかわかる方がいらっしゃいましたら、ご教授いただければと思います。
869 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 09:45:37 ] >>868 制限付きでできる。 external 指定をすればよろし。マニュアル味噌。
870 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 13:13:54 ] >>869 868です。ご返信ありがとうございます。 EXTERNALの指定で無事うまくいきました。 途中コンパイルがなかなか通らずどうしたものかと頭を抱えましたが、 「EXTERNALの指定でうまくいく!」という道筋を示していただけたおかげで、エラーの原因を他のところに絞り込むことができました。
871 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 11:56:52 ] 転置行列を書くために program ex2_19 implicit none integer n, i, j real(8) , allocatable :: c(:,:),ct(:,:) read(*, *) n allocate(c(n, n)) call random_seed call random_number(c(:,:)) write(*, *) c allocate(ct(n,n)) do i = 1, n do j = 1, n c(i, j) = ct(j, i) enddo enddo write(*, *) ct(:, :) end program ex2_19 というプログラムを書いたのですがどうしても出力結果が転置行列になりません。 どうしてでしょうか?誰か親切な方お願いします。
872 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 12:58:33 ] >>871 代入文をよく見直せ。
873 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 16:23:34 ] >>871 ct = transpose( c ) でもできる。
874 名前:871 mailto:sage [2007/10/08(月) 18:01:42 ] >>872 c(i, j) = ct(j, i) のところでしょうか?
875 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 19:11:47 ] c が元の行列 ct が転置行列 だよな?
876 名前:871 mailto:sage [2007/10/08(月) 20:18:58 ] >>875 そうです。 cは適当に乱数で決定されるようにしました。
877 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 22:50:50 ] > c(i, j) = ct(j, i) c(i, j) に ct(j, i) の内容を代入
878 名前:871 mailto:sage [2007/10/09(火) 00:23:13 ] >>877 わかりました! なんたる初歩的ミス…、頭の悪い質問ですみません。 ありがとうございました。
879 名前:デフォルトの名無しさん [2007/10/15(月) 17:14:30 ] K=0 ← こっちが前? DO 100 I=1,10 K=K+I 10 CONTINUE WRITE (6,100) K 100 FORMAT(1H ,i5) ← こっちが前?
880 名前:デフォルトの名無しさん [2007/10/15(月) 17:16:09 ] プログラムの「前」ってどっちですか? K=0 ← こっちが前? DO 100 I=1,10 K=K+I 10 CONTINUE WRITE (6,100) K 100 FORMAT(1H ,i5) ← こっちが前?
881 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 17:23:19 ] マルチすんなハゲ
882 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 18:36:36 ] >>879 前とは先頭のほうだw
883 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:11:01 ] googleg G| o o |g | L | \_e__/ <ぐぐれかす
884 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 02:22:47 ] 誘導され >>57 あたりを読みました FTN95をインストールしました。 plato3(日本語不使用)でコンパイル実行可能でした ↓ fcpadを利用しては出来ないですか? コンパイラパス C:\Program Files\Silverfrost\FTN95\ftn95.exe と入力 コンパイルは通るもののexeファイルが生成されず おそらく設定の実行付近をいじると出来るのか?と思っていますが 誰か、ご指導願います・・・。
885 名前:884 mailto:sage [2007/10/16(火) 02:40:35 ] 原因は分かりました。 が、解決方法が分からないので教えていただきたいのですが /LINKがプログラム名の前に入っているため生成が出来ないようです。 【現在】ftn95 /LINK file.f となってしまう 【解決】ftn95 file.f /LINK としたい 解決方法分かる方よろしくお願いします。
886 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 02:44:09 ] >>884 >>355 fcpadは自由形式のプログラム編集には使えない(向かない)けどな
887 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:47:42 ] 割り算の結果がうまく表示されない現象に悩まされています。 integer a,b character c write(*,*)'計算式間にスペースを入れて入力' read(*,*)a,c,b select case(c) case('+') write(*,*)'=',a+b 省略 case('/') write(*,*)'=',a/b endselect stop end
888 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:33:51 ] >>887 a,bをINTEGERで宣言しているので、その割り算は切り捨てになる。
889 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:04:30 ] 結果自体が表示されないんですが…。 realで宣言しても同じです 割り算以外の演算は問題なしです
890 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 17:37:05 ] >>889 どのようにおかしいか、出力例も交えて、もっと情報を提供しなさい。 >>887 の内容では誰も答えられない。
891 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 17:51:28 ] >>887 やってみた。 例えば、 4 / 2 と入力しても、case('/')に入らない。 もし case default を用意したら、そこに入る。 代わりに 4 "/" 2 あるいは 4 '/' 2 と入力したら = 2 を返した。
892 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:00:27 ] ゲイツにきけwwwwwww
893 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:08:28 ] 並び順番 READ 文の規則 ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/lr/lr10_03_01_02.htm >実行中に斜線 (/) が現れると,READ 文は終了し,残りの入力並び項目は変更されないままになります。
894 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:46:18 ] 誰か、Fortranで(いろんな意味で)生産性の高いコードを書くコツみたいの、挙げてくれ Fortranユーザって他の言語に比べてそういうのあんまり意識しなさそうだけど
895 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:59:39 ] >>894 つ www.mri-jma.go.jp/Project/mrinpd/coderule.html
896 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:43:34 ] 速度を犠牲にせずに生産性を上げるってのはなかなか難しいね
897 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 23:12:52 ] >>891 >>893 ありがとうございました。 FORTRAN学びはじめなので細かいところが分からず
898 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 14:31:50 ] FortranのIDEみたいな開発環境あるんでしょうか?
899 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:35:15 ] >>898 色々あることはある。 どういうのが望みだ?
900 名前:898 mailto:sage [2007/10/22(月) 22:47:23 ] あるんですね。やっぱりFortranコードといえど規模が大きくなるとそういうのは必要ですよね。 Visual Studioみたいなデファクトスタンダートのようなものはあるんでしょうか? >どういうのが望みだ? 今のとこviでカリカリやってるんですが、とりあえず制御文などのチェック機能(自動ハイライトとか)や行番号の管理とかあると助かります。 (でもこの程度だとIDEなんて大げさなものでなくとも、気の利いたエディタならできるのかも・・・) 規模が大きくなるとサブルーチンの管理とか大変ですよね 皆さんどうやってるんでしょうか?
901 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:10:55 ] >>900 Intel Visual Fortran は visual studio に対応している。 昔はVisualStudioを別売りで買う必要があったが、今は制限版がIntelVisualFortranに付属している。 LaheyのFortranやSilverFrostのFTN95、PGIのVisuialFortranもVisualStudioに対応している。 ttp://www.lahey.com/ ttp://www.silverfrost.com/ ttp://www.pgroup.com/ 他の商用コンパイラメーカーも大抵自作の統合環境をつけている。 EmacsもFortranModeがあってシンタックス・カラーリングとかしてくれる。 EclispのFortran環境にはphotranというのがある。 www.eclipse.org/photran/ 他にもフリーの環境はある。 昔ロシア人が貧乏人向けにg77とフリー統合環境と廃版英語Textbookを束ねて配っていたのだが、 最近はもう時代遅れか・・・
902 名前:898 mailto:sage [2007/10/23(火) 02:45:05 ] >>901 ありがとうございます。 Visual Studioに対応してるとは知りませんでした。ちょっとやってみます。 そういえばこれ、当然ながらWindowsでの開発だと思いますが、 Visual C++みたいな独自拡張とかはあるんでしょうか? せっかく作ったのにLinuxで動かないとなったら困りますよね・・
903 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 02:51:27 ] 色分けやdo-enddoの自動インデントならvimでもやってくれますね。
904 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:46:22 ] >>902 .NET対応版とか、Windows API 呼び出しとかしなければ、常識的な範囲でOK。
905 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 15:25:50 ] vimのfotranの色づけはデフォルトだとイマイチなんすけど ドキュメント読むの面倒なんで、お勧め設定晒してもらいませんか?
906 名前:905 mailto:sage [2007/10/23(火) 15:26:50 ] ×もらいませんか ○もらえませんか
907 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:11:51 ] Fortran90ではコメント「c」やCOMMONは使えないんですか? 77の(ほぼ)スーパーセットと聞いたんですが、やってみたら駄目でした。 てことは、77のコードをポートするには一般に結構な書き換えを要する、ってことですかやっぱ
908 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:17:28 ] >>907 先頭cコメントを使うためには、固定形式で記述する必要がある。 中途半端に自由形式を導入していないか? 回答者のために、コンパイラー名を書こう。
909 名前:907 mailto:sage [2007/10/23(火) 18:36:30 ] >>908 レスありがとうございます。 >先頭cコメントを使うためには、固定形式で記述する必要がある。 そうなんですか。Intel Fortran 9.0なのですが、 固定形式か自由形式かはどうやって決まるんですか? 拡張子(というかsuffix)? COMMONが使えないというのは勘違いでした。 複数行に渡るときの6列目の文字があるせいでした。90だと行末に&なんですね。 結局のところ、「77の(ほぼ)スーパーセット」といのは、77形式できっちり書いた場合の話であって、 90の機能と何でも混ぜていいわけではないんですね。。
910 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 20:44:40 ] >>909 通常は拡張子が .f .for .ftn の場合は固定形式、 .f90 の場合は自由形式と解釈される。 # ifort は .f95 をソースとして認識しない。 コンパイル時のオプションに -fixed / -free を指定することによって強制的にそれぞれ 固定形式/自由形式の指定をすることも出来る。 また、拡張子を大文字(.F .FOR .FTN .F90)にするとコンパイル前にプリプロセッサで前処理される。 > 90の機能と何でも混ぜていいわけではないんですね。 1つのソースに固定形式/自由形式を混ぜてはいけない。 ただし、別々のファイルにすれば混在させることも出来る。
911 名前:907 mailto:sage [2007/10/23(火) 23:48:50 ] >>910 ありがとうございます。非常に勉強になりました。
912 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:21:45 ] High Performance Fortranていう仕様があるようですが、どういうところで使われているんですか? 普通のユーザには縁のないものですか
913 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:04:39 ] >>912 90年代に並列プログラミングを考慮した規格として提案された。 日本のスーパーコンピュータメーカはコンパイラをちゃんと作ったが、 アメリカがやる気を見せず崩壊した。 地球シミュレータでもHPFは動いている。というかHPFはESに要求された仕様の一つだったような。
914 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:13:06 ] >>913 崩壊、ですか・・・ 推進評議会のサイトを見ると、「ユーザが最小限の指示文によってデータの分割配置の方法を 指定すれば、残る作業(計算の分割と通信の生成)をコンパイラが自動的に行う」とありますが、 分散メモリシステムで必要となる領域分割と通信を自動でやってくれる、ということですか? 今はFortran90+MPIという組み合わせが一般的だと思いますが、これよりも良い性能が出るんですか?
915 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 13:22:45 ] >>914 MPIはどちらかというと消極的な理由でデファクトスタンダードになった。 ソフトウェア中心主義の視点からは、MPIはハードウェアの抽象度が低いので、 HPFのほうが上位に立つのだが、現実的にはハードウェアへの依存性が高くて逆転する。 ここに過渡期に実務で使った人の比較意見が載ってる。 ttp://grape.mtk.nao.ac.jp/~makino/articles/future_sc/note031.html#rdocsect36
916 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:03:35 ] >>915 消極的ですか。確かにそんな気もしますね OOPの可能性にwktkするも、性能とのトレードオフに嘆き、手続き型も含めた現実的な方法に帰着する、という話と似てるかも ところでそのサイト見ていつも思うんですが、マ○ノさんてすごい人ですよね ここまでコアな人はなかなかいないと思う
917 名前:912=914=916 mailto:sage [2007/10/24(水) 16:04:56 ] >>915 スイマセン、お礼言うの忘れてました。 どうも有難うございました。
918 名前:デフォルトの名無しさん mailto:age [2007/10/28(日) 19:52:11 ] WRITE文で改行しない標準FORMATを使いたいのですがどうすればよいでしょうか? 具体的には、 WRITE(*,*) 'x = ', x という文を改行なしで表示したいのです。ここで、xはDOUBLEで、 xの大きさによって浮動小数点表示と固定小数点表示をコンパイラが判断して欲しいです。 よろしくお願いします。
919 名前:デフォルトの名無しさん [2007/10/28(日) 22:10:09 ] >>918 改行しないのはFAQ このスレでも何度も出ている。 Fortran90 では、ADVANCE='NO' 数値の大きさでフォーマットを変えるのは G Format これが77時代からある。 サンプル PROGRAM unko IMPLICIT NONE REAL :: x, y x = 0.1 y = 1.234567e11 WRITE(*, '(A, G15.5)', ADVANCE = 'NO') 'x=', x PAUSE WRITE(*, '(A, G15.5)', ADVANCE = 'NO') 'y=', y STOP END PROGRAM unko
920 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:32:38 ] COMMONブロックをモジュールに書き換える作業をしております。その際わからないことがあったので質問させてください。 jjoo.hp.infoseek.co.jp/tips/f90/common_to_module.html のサイトを参考に進めてきました。現在のプログラムの概略は次のような感じです(巨大なため全文ではありませんがご容赦くださいませ) module sub integer i,j end modeule sub program main use sub implicit none call 1 call 2 end program main subroutine 1 implicit none integer i,j (略) end subroutine 2 implicit none integer i,j (略) end この状態でコンパイル及び動作は出来るのですがサブルーチンにおいて変数部を subroutine 1 use sub implicit none (略) end とするとコンパイル時に symbol 'rmax' ai (1) is defined in multiple modules というエラーが出てしまいます。 これはどのように解決したらよいのでしょうか。よろしくお願いします。
921 名前:918 mailto:sage [2007/10/29(月) 23:48:47 ] >>919 欲しい結果が表示されました。ありがとうございます。
922 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 00:56:45 ] >>920 それはエラーメッセージに書いてあるがごとく、複数のモジュールの中で同じシンボル名を 重複して使っているという事だろう。 コモンブロックに当たるモジュールは1個だけ作って、それをUSEで呼び出せばいい。 コモンのときは全副プログラムにコモンを置かねばならなかったが、もジュールは違う。
923 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 14:05:25 ] CHARACTER*(*) HOGE のように、配列数が(*)となっているのはどういう意味なんでしょうか 動的に確保するということでしょうか?
924 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:18:34 ] >>923 HOGEの長さは HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。 HOGEが副プログラムの仮引数の場合、対応する実引数と同じ長さ。 HOGEが関数副プログラムの場合、その関数を使用する側で予め決められた長さ。
925 名前:920 mailto:sage [2007/10/31(水) 05:54:42 ] >>922 遅くなって申し訳ありません。レス有り難うございました。 なるほど、モジュールは一度読み込めばよいと言うことだったんですか。 そこで、サブルーチン中のuse文を消してみたところ そのエラーは吐かなくなりました。 その代わり x0(n)=2.d0*rn 1 Unexpected array Reference at (1) と言ったようなエラーが出るようになってしまいました。エラー文では配列の参照がおかしいみたいなことを書いてますがどのようなことなのでしょう。 内容が同じ物をcommon文としてかいた時は問題なく動作したので 配列の宣言がおかしいってこともないと思うのですが・・・
926 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 10:58:31 ] >>923 FORTRAN90以前では、基本的に変数は参照渡しで、実際には先頭番地しか渡していない。 また呼び出し側と呼び出される側での引数の整合性もチェックしていない。 さらに実行時にも、デバッグオプションをつけない限り、はみだしチェックのようなことはやってない。 したがって、副プログラム側では、引数の大きさはどうでもいいことになる。 このためFORTRAN66あたりまでのプログラムでは、配列にも適当な長さを指定するのが伝統だった。 (文字列は、まだ存在しなかったので・・・というか整数型に突っ込んでいた・・・・質問から外れるが) というわけで、FORTRAN77規格で、それを明示的に指定した書式が(*)だ。(とおもうw) 長さ『*』は、『適当』という意味だ。文字列のみならず数値型配列の最後の要素にも使える。 Fortran90以後は、色々コンパイル時のチェックが入るようになって、PASCALみたいでうぜぇという人達もいる。 最近のスクリプト言語は、型にゆるいのが多いが、昔のFORTRANに先祖がえりしているのである(嘘w
927 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:01:20 ] >>925 モジュールの宣言は1個で、USEは使うルーチンごと毎回だ。 カスケード的にUSEしているなら、深いほうで1回読んでおけばいい。
928 名前:923 mailto:sage [2007/10/31(水) 18:13:56 ] どうもありがとうございます。 >>924 >HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。 HOGEをHOGE="hoge"と変数にしたら駄目でした。定数しか駄目なんですね。 >>926 ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね? 例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・
929 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:21:08 ] >>928 >ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね? >例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・ いや、別に10のままでも、本質的には何も変わらない。 どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。 あと、多次元配列の場合、最後の次元以外は一応意味があるので、ちゃんと指定しないといけない。 ただ、FORTRAN77では整合寸法を別に引数で送るのが適切とされている。
930 名前:デフォルトの名無しさん [2007/11/01(木) 01:12:57 ] 何が原因かわからないのですいませんがどこが間違ってるのかご指摘お願いします. 縦300横10の配列を読み込んで,ただの列にしたいだけなんです. エクセルを使えば,FORTRAN使うほどのことでもないのでしょうか? それも含めて教えてください. program hairetu open(30,file='a.dat',status='old') do 10 j=1,10 read(30,*)(b(i,j),i=1,300) 10 continue close(30) open(20,file='b.dat',status='new') do 50 i=1,300 do 40 j=1,10 write(20,*)b(i,j) 40 continue 50 continue close(20) stop end
931 名前:930 [2007/11/01(木) 01:19:49 ] 付け足しです.このようなエラーメッセージが出ています. 0004) read(30,*)(b(i,j),i=1,300) *** B is a function name - a function reference is not allowed in a READ statement list *** Invalid input/output list 2 ERRORS
932 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:20:00 ] >>930 > どこが間違ってるのかご指摘お願いします. ・配列 b の宣言がない。 ・「縦300横10」のデータなら読み込み時の i, j の終値が逆。 > エクセルを使えば,FORTRAN使うほどのことでもないのでしょうか? これくらいの処理ならExcelでもなんでも結果が出せればおk ということで。 gawk "{ for (i=1; i<=10; i++) print $i }" a.dat > b.dat
933 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:36:36 ] ちなみにスレ違いだがWindows 2000以降なら以下のようなバッチファイルでも処理できる。 @echo off if exist b.dat del b.dat for /F "delims=" %%r in (a.dat) do ( for %%f in (%%r) do echo %%f >> b.dat )
934 名前:923 mailto:sage [2007/11/01(木) 13:21:29 ] >>929 >どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。 そうなんですか。ちょっと混乱してきたのですが ということは、仮引数の配列数は結局は関係ないということですか? >いや、別に10のままでも、本質的には何も変わらない。 では仮引数の配列数を明示指定するのは、単なる慣習みたいなもの、ってことですか?
935 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:14:19 ] >>934 そういえなくも無い。1960年代のプログラムを見ると、任意長の配列がよく大きさ10で宣言されている。 ただテキストの場合は、本当に10個の要素だと思うがw SUBROUTINE ZERO(n, a) DIMENSION a(10) DO 10 i = 1, n a(i) = 0.0 10 CONTINUE END 見たいなのがよく使われていた。 これとまぁ等価なのが DIMENSION a(*) で、もっと上品な書き方は整合配列を用いて DIMENSION a(n) とやる方法。後者をお奨めする。だがFortran90で書くことをもっとお奨めするw 先頭番地しか渡していなので、呼ぶ側では、配列の途中から渡したりできる。 REAL a(100) CALL zero(100, a) CALL zero(50, a(51)) --->Fortran90での a(51:100) = 0.0 普通のテキストには書いてないが、77までのプログラムでは、こういうのを知らないとまともに プログラムが読み書きできない。昔は誰も教えてくれないので徒弟制度で叱られながら学ぶか、 他人のコードを読んで泣きながら覚えるしかなかった。 漏れの読んだテキストで、そういう事が書いてあったのは、この本くらいか。 ttp://www.star.le.ac.uk/~cgp/prof77.html (他の本にも書いてあったが、単に読んだ時のスキルが足りなくて理解できなかったのかもしれないがw)
936 名前:923 mailto:sage [2007/11/02(金) 14:17:22 ] >>935 なるほど・・・よくわかりました。そういうコアな話を聞ける人が周りにいないもので、とても勉強になります。 丁寧な解説ありがとうございました
937 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:04:31 ] >ただテキストの場合は、本当に10個の要素だと思うがw これどういう意味ですか? 文字列配列も普通の配列に変わりはないと思うんですが
938 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 18:15:19 ] >>937 テキストは本当に10個に固定の要素を扱っているのではないかという事。 深い意味は無い。
939 名前:937 mailto:sage [2007/11/05(月) 01:33:05 ] 気になったので簡単にテストしてみました。 サブルーチン内で普通に文字列代入する(sub1)のと直接要素に代入する(sub2)のとでは違うようですね。 後者は通常の配列と同様な参照渡しなのに対し、前者は少し違った処理をする、ということでしょうか? implicit integer(i-n) character*3 text1 /'aaa'/ character*3 text2 /'aaa'/ call sub1(text1) write(*,*) text1 call sub2(text2) write(*,*) text2 end subroutine sub1(text) character*2 text text = 'b' end subroutine sub2(text) character*2 text text(1:1) = 'b' end <結果> b a baa
940 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 03:17:08 ] >>939 たぶんサブルーチン側ではtext*2で宣言しているので、 sub1 では text(1:2) = 'b ' の扱いになったんだと思う。 参照渡しなのは変わんないと思う。 text = 'b' は、一文字目は'b'として2文字目以降宣言長まではスペースを補填するのだと思う。
941 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 13:28:20 ] fortranの仕様ってどこが決めてるの? 少なくとも数値計算屋だよね?
942 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:39:48 ] >>941 ttp://www.j3-fortran.org/ いちおう、(コンパイラ、ハードウェア)ベンダー、ユーザー、大学人なんかが入っているはず。 なんだかイギリスが生意気にデカイ面している。 Fortran2008で、Crayのハードウェアに最適化されているCoArrayが規格に入ったのが気に食わない。
943 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:06:31 ] コーエンちゃん早く2003の処理系つくって
944 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 14:40:25 ] >>942 やっぱ向こうじゃNECよりCrayが優先されるんだろうね
945 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:02:52 ] >>944 『向こう』ってなんだよw 欧米コンプレックスの40代の爺さんかよwwww Fortran2008は、本来はFortran95のようにマイナーアップデートのはずなのに、 こういう妙な機能を入れ込ませようとする政治臭の漂うことをやると、信頼性をなくすと思うのだがな。
946 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:42:08 ] HP Fortran で以下の二つを実現することは可能ですか? 1) リトルエンディアン形式のバイナリ出力 2) Intel Fortranのopen(10, 中略, form='binary')に相当するやり方
947 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:14:02 ] >>946 マニュアル嫁 1) リトルエンディアン形式のバイナリ出力 Itanium機では出来る? ttp://docs.hp.com/ja/B3908-90009/ch08s08.html 2) Intel Fortranのopen(10, 中略, form='binary')に相当するやり方 DIRECT ACCESSで1バイトづつ読むというテクニックで切り抜けられる。
948 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:44:30 ] そういやIntel Fortran もようやく ACCESS='STREAM' が使えるようになったな。 これで処理系毎に書き直さなくて済むようになる。
949 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:58:25 ] >>947 ありがとうございます。 1) そういえば、CPUの種類は確認してなかった・・。 たぶんItaniumだと思うんですが、、。 職場行ったら確認して試してみます。 2) これはちょっと大変そうですね。 ヘッダー部、データ部、それぞれで型の違う変数を扱わなければならず、 変換が大変そうです。 4byteの変数を出力する際、1byteずつ逆から出力する必要があるってことですよね・・
950 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:12:25 ] >>949 文字列で読み出して、それをINTEGERやREALやREAL*8とEquivalenceをかけて置けばOK 処理系によって、RECL=1 にしたときに1byteになるものと、1語になるものがある。 たとえばIntelFortranではデフォールトは1語=4バイトだが、オプションで切り替えできる。
951 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:14:51 ] Fortran2003でOPEN( ... ACCESS='STREAM') が規格に入ったので、新しいコンパイラなら先取り導入 されている可能性大。
952 名前:949 mailto:sage [2007/11/11(日) 12:31:09 ] >>950 Equivalence使ったことありませんでした。 マニュアルみたら違う変数で同じメモリ領域を使えるようにする、、ってやつなんですね。 つまり整数1byte型x1,x2,x3,x4がy4,y3,y2,y1と同じメモリ領域になるようにし、 逆から順に1byteずつ出力すればいいってことですね。 RECLに関してはマニュアルを読んでみます。 >>951 'DIRECT'、'SEQUENTIAL'、' POSITION=APPEND' マニュアル見たらACCESS指定子に選択できるのは上記3つだけみたいでした。
953 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:45:48 ] >>949 ,950 fortran90以降でequivalence文を使うのは非推奨。 subroutine trans_endian(str,inte) character(len=1),dimension(4),intent(in) :: str integer,intent(out) :: inte inte=transfer(str(4:1:-1),0) end subroutine trans_endian
954 名前:1/2 mailto:sage [2007/11/11(日) 15:26:51 ] >>953 とこんな感じで整数をエンディアンの自動判別しながら読める。 正直TRANSFERを使うより、EQUIVALENCEの方がすっきりするよな。 F90はソースコードの見かけに流れされすぎ。 SUBROUTINE check_endian() IMPLICIT NONE CHARACTER(LEN = 4) :: ctmp INTEGER :: itmp ctmp = 'ABCD' itmp = TRANSFER(ctmp, itmp) IF ( CHAR( MOD(itmp, 256) ) == 'A' ) THEN qlittle_endian = .TRUE. ELSE IF ( CHAR( MOD(itmp, 256) ) == 'D' ) THEN qlittle_endian = .FALSE. ELSE CALL abort('endian indeterminable') END IF RETURN END SUBROUTINE check_endian !---------------------------------------------------------------------
955 名前:2/2 mailto:sage [2007/11/11(日) 15:27:24 ] !--------------------------------------------------------------------- FUNCTION rd_int32() RESULT(ires) IMPLICIT NONE CHARACTER (LEN = 4) :: tmp INTEGER :: i, io, ires IF (qlittle_endian) THEN DO i = 1, 4 ir_record = ir_record + 1 READ(ir, REC = ir_record, IOSTAT = io) tmp(i:i) END DO ELSE DO i = 4, 1, -1 ir_record = ir_record + 1 READ(ir, REC = ir_record, IOSTAT = io) tmp(i:i) END DO END IF ires = TRANSFER(tmp, ires) RETURN END FUNCTION rd_int32
956 名前:デフォルトの名無しさん [2007/11/11(日) 17:22:06 ] >>943 コーエンといえば、これワロタ。 F2003が実用的な意味で出てくるのか甚だ疑問だなw ttp://www.nag.co.uk/market/Malcolm_Cohen_Fortran_Jubilee_Presentation.pdf The Irony of FORALL ? “world’s slowest high-performance feature” (HPC vendor 1) ? “months just to get the semantics right...” (HPC vendor 2) ? “even on massively parallel machines, it’s slower than DO” (HPC vendor 3) ? The analysis needed to eliminate the costly array temps... ...would parallelise the obvious DO loop alternative. So at best FORALL is as good as DO, usually it is slower, sometimes much slower. 11
957 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 01:50:22 ] readで配列の行数列数を指定せずにファイルを読み込むにはどうしたらいいんでしょうか? 「end-of-file during read, unit 5」と表示されてしまい、どうやらEND=100のように文番号を指定する必要があるみたいなのですが、 どのように記述すればいいのか分かりません。 どなたか教えてくれませんか?
958 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 07:28:49 ] >>957 とりあえず切り抜けるには、 READ(nn, *, END =10) A 10 CONTINUE
959 名前:957 mailto:sage [2007/11/13(火) 11:17:16 ] >>958 出来ました! かなり助かりました。ありがとうございます。
960 名前:デフォルトの名無しさん [2007/11/13(火) 15:23:03 ] はじめまして、初めて書き込みするものです。 C言語のプログラムをfortran90で書き換えようとしてるんですが、 C言語の do{ 処理文 }while(条件) に対応するfortranの命令文は何を使って書けばいいんでしょうか? あと、C言語で使われている、間接演算子*aなどはfortranではどう扱えば いいのでしょうか?サブルーチンの仮引数として書いたときに、エラーが 出てしまうので、修正の仕方が分からないで困っています。 アドバイスをいただけないでしょうか?
961 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:41:03 ] >>960 C言語の do 〜 while にそのまま当てはまる文はない。 ループの終了条件判定を前へ持ってきても良いのなら DO WHILE (条件) 処理文 END DO 条件判定が後ろにないとダメな(最低1回は実行する)場合は DO 処理文 IF (.NOT. 条件) EXIT END DO
962 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 22:27:56 ] >>960 Fortranでは引数は基本的にすべて参照渡しなので 普通に渡して仮引数を書き換えれば実引数の値も変わる。 サブルーチン側で勝手に書き換えられては困る場合は 仮引数に INTENT(IN) 属性を付けておけば書き換えられない ようになる。というかコンパイル時にエラーにしてくれる(はず)
963 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 00:07:58 ] >>961 FortranにREPEAT〜UNTIL型の構造が入らなかったのは何故なんだろうね? FORTRA66時代のDO〜LOOPがREPEAT〜UNTIL型だった呪いかな?w >>962 F2003で引数にVALUE属性が導入されるらしい。 コンパイラによっては今でも独自拡張で出来なくも無いが。
964 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:38:29 ] >>961 >>962 ありがとうございます!とても参考になりました。 教えていただいたことを使ってもう一度やってみます。 また分からないことが出てきてしまうと思うので そのときはまたよろしくお願いします。
965 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 14:10:39 ] 保守代わりに下らない質問 77にはDO WHILE文は無いよね? 77ではIF(〜) GO TO 〜ってやるしかないよね?
966 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 21:25:14 ] 失礼します、初めて書き込みさせていただきます。 以下のようなプログラムを書いたのですが(相当省略してますが)、 nの値を8以上にするとmの値が正しく出ないのですがなぜなのでしょうか。 (とりあえずaはどうでもいいです) integer :: i, j, m, n real(8) :: a read(* ,*) n do i = 1, 2n-1, 2 m = 1D0 do j = 1, i m = m * j a = a + dble(m) end do end do write (*, *) m mはiまでの階乗を表したくてこのようにしているのですが…
967 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:02:03 ] >>965 DO WHILEはないが、GOTOの種類ならたくさんあるぞw >>966 mはintegerだから 基本整数型が32bitの場合、2147483648以上の数は扱えない。
968 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:55:17 ] >>966 >>967 氏を補足するならば、integerで表される最大値は2**31-1だ。 m=m*jをx=x*DBLE(j)にしろ。xはreal(8)な。m=1の代わりに、x=1.0d0。 まぁ整数で何も考えずに階乗を求めると、途中でマイナスになって、 2の補数表現とかコンピュータの勉強になるので、教育的には非常にいい課題だ。
969 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:15:09 ] >>967 >>968 様 全然知りませんでした。おっしゃる通りに直してみます。 本当にありがとうございました!
970 名前:デフォルトの名無しさん [2007/11/21(水) 02:34:46 ] Silverfrost FTN77 4.03をダウンロードしたのですが、 セットアップのところを押すと、 「C:¥WINDOWS¥SYSTEM32¥AUTOEXEC.NT.システムファイルは MS-DOSおよびMicrosoft Windowsアプリケーションを実行するの に適していません。」 と表示されます。どうすればいいでしょうか?教えて下さい。 お願いします。
971 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 19:50:57 ] >>970 ttp://support.microsoft.com/default.aspx?scid=kb;ja;324767
972 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 00:50:42 ] >>970 特にこだわる理由が無いならFTN95を入れるという選択肢もある。
973 名前:970 [2007/11/22(木) 14:49:08 ] ありがとうございました。 これで家でも使えるようになりました。
974 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:09:52 ] 学生時代、情報科の先生にプログラミング言語は何教わった?と聞かれて Fortran77ですと答えたら、それ古いぞ今はCだと言われた。 それからだいぶ経つのに、77を教わっている学生さんが居るとは、 教えてる奴はよっぽど77好きなんだろうな。
975 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:19:46 ] 計算科学あたりでは今でも F77 教えてたりする。 今はもう C すら古いというのに。
976 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:06:43 ] Visual Fortran10 with IMSL + visual studioって構成でアプリケーション作ったんだけど, IMSLとのリンクが動的にしかできないからIMSLのインストールされていないPCで動かすことができません. INCLUDE 'link_fnl_shared.h' use IMSL_LIBRARIES ならうまくいくのですが, INCLUDE 'link_fnl_static.h' use IMSL_LIBRARIES だとリンクエラーになりコンパイルできません. どなたかアドバイスいただけませんでしょうか?
977 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:21:36 ] >>974-975 真理は時間や空間には依存しないもの。 流行り廃りがあるような内容は、学問ととして伝授するに値しない。 FOTRANは、普遍的不変なる価値を持つのだ。 50年前のコードが動いて、実際使われているんだから、 こんな再利用可能な習得価値のある言語は無い。
978 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:32:26 ] バグを抑制するための仕様が貧弱だから 保守が大変なんだよ。
979 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:57:45 ] C言語のことかーーーっ!!!
980 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:58:50 ] ちょっと前はとりあえずF77でやっときゃおk、だったが今はさすがにF90だろ いつまでも研究室レベルのコードでいいなら別に構わんけど
981 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:31:30 ] F90からいきなり入った連中は、変数命名の伝統を守らなかったりするので、再教育が面倒。 規格を硬くして厳格に守るべき部分もあるが、自由度を大きくしたまま慣習法によって厳格に守る部分 があってもいい。いざというときだけ破格で逃げる。とにかくバランスを間違えてはいけない。 英米系の慣習法と独仏系の制定法の伝統にもよるのかもしれないが・・・・ 情報学科よりの連中は、PASCALがなぜ廃れたかの教訓を得ていない。 それはそうと本来情報教育の講座が、しっかりした教材を用意すべきだと思うのだが、 連中はFORTRANとかを無闇に馬鹿にして、すぐに忘れ去られる新規言語に飛びつくからワロスワロス まぁ、FORTRAN全盛時代の代表的なテキストたる浦昭二のFORTRAN本も暗黙の型を 守っていないのでどうしようもないのだがw
982 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:44:51 ] FORTRAN77 を使ってあまりの酷さに逃げたわ。 何、あの引数の数。構造体が無いから酷い。 それを避けようとしたら COMMON 変数まみれ。 最悪だ。
983 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:22:57 ] >>982 FORTRANではバッチ処理で物理メモリーを限界まで使うことが多いが、 そうなると自由にメモリーを再利用できるCOMMONは非常に便利。 メモリーが貴重な時代には非常に合理的な仕組みだった。 今風に言うとガベージコレクションを自分でやれる。 その時代時代の最高のハードウェアの制約を前提として限界まで使うにはFORTRANはいい言語。 無限のメモリーやCPU速度を暗黙の前提にしている仮想マシン上の観念言語とは違う。 FORTRAN77程度で逃げるのは根性無し。FORTRAN66で根性つけて出直せw
984 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:01:32 ] プログラマにはそんな無駄な根性なんて要らない。
985 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:19:09 ] 必要なのはデスマを生き抜く体力のみ。
986 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 19:59:15 ] Fortran77 は、1977年以前に生まれた人間しか使ってはいけないそうな
987 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:17:12 ] 楽勝で使えるぞな
988 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 00:39:37 ] そろそろ次スレ用のテンプレについて議論しよう。
989 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:29:10 ] テンプレって無視されるのが普通だからどうでもいいような気もするけどね。 コンパイラのリンクとか宿題丸投げ用テンプレでも入れる? F77やF90の簡単な説明もあると良いかな?自分が習ってるのがどっちか分からない子用に
990 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:22:19 ] >>989 たしかにF77とF90以降の区別は重要だな。質問のときにはっきりさせろと。 あとは、文字列を数字に直すというFAQかな?
991 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 11:33:52 ] テンプレ議論するには残り少なすぎ・・・ まぁ内部ファイルの質問は多いから入れとこうか
992 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 11:46:42 ] >>995 が次スレを立てるという事で
993 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 07:37:24 ] F
994 名前:デフォルトの名無しさん [2007/11/30(金) 08:34:03 ] バイナリデータを書き込むと先頭に余分な6バイトがついてしまいます。 純粋なデータのみを書き込みたいのですが、どのコマンドを使えばよいのでしょうか?
995 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:40:05 ] >>994 エスパー力が試されているな。 実行環境とどんな型のデータをどんな風に 書き込んでいるのか分からない。 昔Compaq/AlphaでVisual Fortranを使った時の話 open(io,file="hogehoge",access="direct",form="unformatted",recl=2,statu="new") としてバイナリファイルを作った時、2バイトずつ書き込もうとしても、 コンパイル時にオプション(-assume byterecl)を与えないと8バイトずつになってしまった。 余分な6バイトがつくというのは、こういう状況か?
996 名前:995 mailto:sage [2007/11/30(金) 09:40:56 ] ×statu="new" ○status="new"
997 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 11:29:16 ] >>994 コンパイラ・処理系などは何だ?
998 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 14:00:28 ] くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/
999 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 12:56:23 ]
1000 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 12:57:05 ] ( ´ー`) 1000 !
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。