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/
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が付くようになった。