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/
375 名前:デフォルトの名無しさん mailto:sage [2007/03/29(木) 22:11:04 ] >>374 プラトン先生はよく知らんが、リソースファイル書いてアイコン指定すれば?
376 名前:デフォルトの名無しさん [2007/04/02(月) 21:07:05 ] Fortranで何ができるのかも良くわかっていないのですが, データを出力したときにメモリーの状態はどうなっているのか? ということを教えて下さい. その内容は 「Fortranでエクセル形式データを出力させた場合,データは一度 メモリーに格納され,エクセルへ出力するのだと思っているのですが, 出力した後,メモリーは開放されるのでしょうか?」ということです. 当方の環境は, コンパイラ : fujitsu fortran77 OS : WindowsXP Professional 以上,よろしくお願いします.
377 名前:デフォルトの名無しさん [2007/04/02(月) 22:07:34 ] 死にたい
378 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:09:26 ] >>376 質問の意味が不明瞭だ。 原則としては、プログラムが終了するなら、メモリーは解放される。 実行中は、静的に確保した部分は確保されたままだし、動的に確保されたものはDEALLOCATE すれば開放される。 ただしOSやコンパイラにバグがなければ。 昔のMS-PowerStationにはメモリーリーク・エラーがあって実行中にI/Oがあると、 徐々に使用メモリーが増えていった。
379 名前:デフォルトの名無しさん [2007/04/03(火) 02:15:04 ] >>377 死ぬなら中国大使館に爆弾持って特攻だ!!
380 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 14:14:52 ] >>379 FXって言う為替取引で倍率を200倍でやると良いって、死ぬきあるなら博打をしてから詩ねってことだな
381 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 10:24:58 ] r'::::::::,:::::::::::::::::::::::\ 【USBオナホを実現させる会】に入会しませんか^^^ \::/::;;;:::::::::::::::::::::::::\ , ─ -v_;;. -─ ─ ── ─-、このオナホが実現すれば、パソコンにUSB接続して | , f-‐ ''_ .二 二二二 二._t 対応エロゲを立ち上げてペニスを挿入するだけで Y__,rYニニ -- ‐─ ──‐‐─`ー─‐-- 、画面のキャラクターが喘ぐんだよぉ♪ ,..‐Kノ,h;;::.,-rェ;ェエf7fv!Tl TiTit.、--':::::::::ノ キミの腰の動きに合わせて (:::::::::l::::ヽ.|l.|/,|l.1,!H、ト|` H┼I、l|l |l ト.-‐ ''´ わたしたちがアニメーションするの。 `,ニl:::::::::レl/!|lイh_ l|`` ,イrマ,イ| |l |レノ とっても素敵なアイテムでしょっ☆ く /|:::::::::レl.ィ!ll.l. ー‐' , kノハト,イレ:::::l / / !:::::::::|1l_l.|l.|ゝ"" (.ア ,仆!|::´:::::::| ゆっくり動かすと・・・じわじわと感じて、 └t. l l:::::::::N'::: N´ヽ`,,ーr t1リ::レ::::::::::: ! はげしく動かすと・・・失神とかもするんだよ☆ `ー弋:::::::`:::::::::ゝ ニァ@'ノ::、:::::::::::::::: ノ `ー、::::::: /:::::::,イ !ト`ヽ::ヽ:::::, ‐'´ わたしたちとバーチャルで繋がるから `ー1::::::└Ll_rー'::::::〉´ もう、即射精しちゃうよねっ☆ でも・・・USBオナホールは、まだ実現していないの・・・。 はやくみんなとエッチなことしたいなぁ・・・。 USBオナホールを実現させて次元を超えたSEXをしましょうねっ☆ 入会方法はとっても簡単。毎週1回どこかのスレに↑をコピペするだけでいいヨ♪
382 名前:デフォルトの名無しさん [2007/04/05(木) 09:23:54 ] Intel Visual Fortran9.1を使っています. Fortran90形式でプログラムを書いており, マトリックスを表示させたいのですが,これに関して質問があります. 現在,2次元配列に格納されたマトリックスを表示するために, integer :: i,j,N integer,allocatable :: A(:,:) 〜〜〜 N=10 allocate(A(1:N,1:N)) A = 123 do i=1,N,1 write(6,'(100I3)') (A(i,j),j=1,N,1) enddo という風にしています. つまり,横に並べて表示するformatとして 100I3 という風に反復回数を十分大きくとって 対応しています. この反復回数100の部分を変数にしたいのですが不可能なのでしょうか?
383 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:45:17 ] >>382 文字型変数で書式を作って渡す。 character(len=20) :: fmt ... write(fmt, "('(', I5, 'I3)')") N do i=1,N,1 write(6, fmt) (A(i,j), j=1,N,1) end do または、Visual Fortran限定で良ければ書式中の <> 内に整数式を書き込む。 do i=1,N,1 write(6, '(<N>I3)') (A(i,j), j=1,N,1) end do
384 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:17:58 ] >>382 これは実はFAQ。このスレでもすでに何回も出てきている。 教科書も少しはこういう事を書けw
385 名前:382 mailto:sage [2007/04/06(金) 06:49:35 ] >>383 ありがとうございます. 助かりました.
386 名前:デフォルトの名無しさん [2007/04/09(月) 07:37:06 ] 式の前に入れる空白の数によってコンパイルエラーが出たりでなかったりするのですが、 これはどのように決まっているのでしょうか?
387 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 08:30:56 ] >>386 ソースやエラーメッセージも貼らずに(ry 空白を追加したら1行が73桁以上になった、に10エスパー
388 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:26:38 ] 73行以上っていつの時代のコンパイラだよw
389 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:02:39 ] gfortran やIntel Fortran 9.1 でも固定形式ではしっかり73桁目以降を無視してくれますよ。
390 名前:デフォルトの名無しさん [2007/04/09(月) 23:45:40 ] >>388-389 そうじゃないぞ諸君。 一般的なコンパイラでは拡張子によって、デフォの挙動が変わる。 拡張子が.fや.forの場合は、固定書式になって72カラムモードとなる。 .f90などの場合は自由書式になる。 あと、ワークステーションなどでは、よく同じコンパイラが、コマンドとしてf77とf90呼び出される設定に なっていて、デフォの挙動を変えて作動する。この場合も、固定書式と自由書式にそれぞれなっている。 まぁFORTRANを使うなら固定書式の爽やかさを味わってみるのもいいだろう。
391 名前:デフォルトの名無しさん [2007/04/13(金) 19:22:44 ] n(nx,ny) という配列をバイナリ形式で write(8)n という風に書き出した場合、格納順序はどのようになるのでしょうか? n(1,1),n(1,2).... でしょうかそれとも n(1,1),n(2,1).... あるいは処理系に依存なのでしょうか?
392 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 19:30:32 ] >>391 n(1,1),n(2,1).... ただし格納されたデータ形式は処理系依存
393 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:40:47 ] >>391 FORTRANでは規格でn(1,1),n(2,1)....の順にメモリー上に入っている。 さすがにこれは教科書にも書いてある。 というか、これを知らないと整合配列がらみでF77などでは実用的なサブルーチンとか書けない。 またライブラリを呼ぶにしても引数の意味が理解できないだろう。 まぁマニュアル嫁。
394 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 05:11:11 ] 合同乗積法による乱数生成プログラムを作成しなければならないのですが どこか参考になるページなどはありませんでしょうか。 かれこれ2、3時間探しているのですが見つかりません。
395 名前:デフォルトの名無しさん [2007/04/17(火) 16:42:15 ] 配列の初期化について質問があります. 以下のプログラム (Fortran90です) のように, 変数宣言部で初期化すると,data文が効かずににMatrixの要素がすべて0になってしまいます. もちろん変数宣言部を integer :: Matrix(1:3) に書き換えるとMatrixの要素はそれぞれ 1, 2, 3 と入ってくれます. これは一体どういうことなんでしょうか? 最適化を外しても同じです・・ 頭が変になりそうです. !---プログラム----- program MATRIX_TEST implicit none integer :: Matrix(1:3) = 0 data Matrix/1,2,3/ write(6,*) Matrix end program MATRIX_TEST
396 名前:395 mailto:sage [2007/04/17(火) 17:09:51 ] 色々やった結果,以下のようにしたら期待通りになりました. 変数宣言部で初期化するとsave属性が付くという仕様に気づきませんでした. data文はsave属性の変数に値を入れることができない(?). 何がなにやら・・ もうdata文を使うのはやめます. !---プログラム----- program MATRIX_TEST implicit none integer :: Matrix(1:3) = 0 !data Matrix/1,2,3/ ←やめて,下のようにした. Matrix = (/1,2,3/) write(6,*) Matrix end program MATRIX_TEST
397 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 17:48:06 ] そういえばfortran90ではdata文を使うのはやめましょうっていう記述結構見かけるんだけど、 多次元配列にデータ入れたい場合どうやってます? たとえば2×2のマトリックスを3個用意する場合。 1次元目がマトリックスを区別し、2次元目が行、3次元目が列を表すものとして、 integer :: A(1:3,1:2,1:2) data A(1,:,:) /1,2,3,4/ data A(2,:,:) /5,6,7,8/ data A(3,:,:) /9,10,11,12/ に相当するコードをdata文なしでどうやって書きます? >>396 みたく A(1,:,:) = (/1,2,3,4/) と書ければいいんだけど、これはコンパイルエラーになる… 変数宣言部で一気に integer :: A(1:3,1:2,1:2) = (/1,2,3,4,5,6,7,8,9,10,11,12/) ってやるしかない?? これだと目的の要素に値入れるのにメモリ上の並びを考えないと いけないので4次元5次元となると、きついっす。
398 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:51:49 ] >>394 合同乗積法による乱数 でググルとトップにFortranのプログラムが出てくるぞ! しょんべんで顔洗って出直して来い! >>395-397 DATA文は実行文ではなく初期化文だ。 F90では初期化が直接出来るので、わざわざDATA文を使う理由がない。 宣言文での初期化とDATA文での初期化のどちらが優先されるのかは、規格書を見ないと分からんが そんな使い方は想定していないので、たぶんメーカーの実装に依存していると思われる。 A(1,:,:) = (/1,2,3,4/) がうまく行かないのは、次元があっていないから。 RESHAPE関数を使って次元をあわせればおk。これはよく教科書にも載っているので調べそ。
399 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 02:24:37 ] 二項分布のプログラムについてなのですが(硬貨の表裏)、表を0、裏を1とした場合 それぞれが1/2の確率で現す書き方がわかりません。 超初心者ですみません。
400 名前:397 mailto:sage [2007/04/18(水) 06:26:52 ] >>398 サンクス! 調べてくるお
401 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 07:00:39 ] すいません、質問させてください。 コンパイル時どうしても /opt/intel/fc/9.0/lib/for_main.o(.text+0x41): In function `main': : undefined reference to `MAIN__' と出てしまうのですが、これはどういう事なのでしょうか。
402 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 09:56:11 ] >>399 0以上1未満を返す乱数のサブルーチンは用意してあるとする。 このとき0以上0.5未満だったら表、0.5以上1未満だったら裏とすればよい。 >>401 確認していないので想像で書くw メインルーチンが無いだけじゃない?プログラム文が無いとか。 昔のHITACのFORTRANだと、サブルーチン名をMAINにすると、 それをスタートアップルーチンと勘違いしていきなりそこから実行が始まるウンコ仕様だったがw
403 名前:399 mailto:sage [2007/04/18(水) 14:43:32 ] なるほど。。 やってみます。ありがとうございました。
404 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 16:08:05 ] NaNを検出するような関数ないですか・・
405 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 16:16:14 ] すみません自己解決しました isnan(real)でした
406 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 22:32:46 ] >>404-405 IEEEのフラグがらみの関数はFortran2003で導入される予定なので、それはコンパイラ独自の拡張。 コンパイラの種類などを書かないと、誰も答えられないし、何の情報にもならん。 おまんこ。
407 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:18:38 ] g77はFortran90の機能も内包しているのですか?
408 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 14:44:17 ] YES おまんこ。
409 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:08:24 ] >>407 ちょっとだけだけどな。
410 名前:デフォルトの名無しさん [2007/04/23(月) 14:23:26 ] 実行時間を計ろうと思って色々検索したら,dtimeというサブルーチンが 用意されていると知り,使ってみたのですが,よくわからないエラーが発生してしまいました. >>410 のプログラムをコンパイル&実行すると,なぜか出力がNaNになってしまいます. call dtimeを削除すると期待した値が出るのですが,なんでこんなことになるのかわかりません… どなたか助けて下さい (´;ω;`) ただdtimeがfortran標準でないという記述も見かけたので,使わない方がいいのでしょうか… コンパイラはIntel Visual Fortran 9.1で,コマンドは f90 /check:all /Od test.f90 でした.
411 名前:410 [2007/04/23(月) 14:24:32 ] すみません>>410 ではなくて>>411 です orz !-- test.f90-- program test implicit none real(8) :: x,y call SUB x = 11.d0 y = Func(X) write(6,*) y contains subroutine SUB implicit none real tarray(2),result call dtime(tarray,result) call dtime(tarray,result) return end subroutine SUB complex(8) function Func(x) implicit none complex(8),parameter :: IU=(0.d0,1.d0) real(8),intent(in) :: x Func = exp(IU*x)/sqrt(2.d0) return end function Func end program test
412 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 14:56:37 ] >>410 Intel Visual Fortranの DTIME は引数が1つの関数だ。サブルーチンじゃない。 SUB の先頭に USE IFPORT をつければちゃんとコンパイル時にチェックしてエラーを出してくれる。
413 名前:410 mailto:sage [2007/04/23(月) 16:33:19 ] >>412 アッー!たしかにそうです! ライブラリ・リファレンスに書いてました・・・・・ ありがとうございました!
414 名前:デフォルトの名無しさん [2007/04/24(火) 15:35:00 ] (1) 2×2の行列A,B の要素を入力し,A+B とAB およびA−1 計算する部分をそれぞれサブル ーチンとするプログラムを作成せよ.
415 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 15:40:12 ] A-1ってA-I(もしくはE)のことか?
416 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 15:41:13 ] ああ、逆行列のことか。スマン。
417 名前:1/2 mailto:sage [2007/04/24(火) 18:53:50 ] >>414 program main use la_precision, only: WP => DP implicit none integer, parameter :: N = 2 real(WP), dimension(N,N) :: A, B, C, D, E print *, "input A:" call sub_read(A) print *, "input B:" call sub_read(B) call sub_add(A, B, C) print *, "A + B =" call sub_write(C) call sub_mul(A, B, D) print *, "AB =" call sub_write(D) call sub_inv(A, E) print *, "inv(A) =" call sub_write(E)
418 名前:2/2 mailto:sage [2007/04/24(火) 18:55:08 ] contains subroutine sub_read(X) real(WP), intent(out) :: X(N,N) integer :: i, j do i = 1, n; read *, (X(i,j), j=1,N); end do end subroutine sub_read subroutine sub_write(X) real(WP), intent(in) :: X(N,N) integer :: i, j do i = 1, n; print *, (X(i,j), j=1,N); end do end subroutine sub_write subroutine sub_add(X, Y, Z) real(WP), intent(in) :: X(N,N), Y(N,N) real(WP), intent(out) :: Z(N,N) Z = X + Y end subroutine sub_add subroutine sub_mul(X, Y, Z) real(WP), intent(in) :: X(N,N), Y(N,N) real(WP), intent(out) :: Z(N,N) Z = matmul(X, Y) end subroutine sub_mul subroutine sub_inv(X, Y) use f95_lapack, only: la_getrf, la_getri real(WP), intent(in) :: X(N,N) real(WP), intent(inout) :: Y(N,N) integer :: ipiv(N) Y = X call la_getrf(Y, ipiv) call la_getri(Y, ipiv) end subroutine sub_inv end program main
419 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 00:54:13 ] >>417-418 正直なところ、たかがこれしきの行列演算をサブルーチンにする意味が分からん。 おまけに逆行列はLAPACK使ってるし。2*2限定なら高校で習う公式で十分だろ。 すべてがjokeなのかもしれないが
420 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 02:18:40 ] 宿題か何かなんじゃないか? っていうか超初心者用スレなんだから サブルーチンにする意味なんか問うな。 Hello worldなんか意味がないとか言っているのと同じだ。
421 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 00:00:42 ] >>421 たぶんFORTRAN77での宿題なんでね? Fortran90では意味を成さない希ガス。
422 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 01:12:40 ] >>421 何その再帰呼び出し的アンカー
423 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 11:11:20 ] >>422 f90 へのあてつけ
424 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 16:35:22 ] 最新のgfortranをvistaにインストールし、コンパイルしようとしたら ld: cannot find -lgfortranbegin とエラーが出てコンパイルできません。 XPではインストールして問題なくコンパイルできました。 vistaでは使えないのでしょうか?
425 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 16:41:49 ] >>423 f90 は再帰できるじゃん。 F77 へのあてつけなら分かるが。
426 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 21:09:24 ] >>424 状況がよくわからんが Program Files 以外の日本語や半角スペースを含まないフォルダにインストールし直せばいいんじゃね?
427 名前:424 mailto:sage [2007/04/26(木) 22:15:59 ] >426 それも考えてc直下にインストールし直しても結局同じでした。 vistaだからなのかな・・・誰かvistaで動いてる人は居ないんでしょうか。 g95も同じようにエラーが出て使えませんでした(今手元にvistaマシンが無いのでエラーメッセージ分かりません FTN95はvistaでも動きました。
428 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 22:39:47 ] >>424 まったく分からんが、ローダーのエラーなのでコンパイルは行ってるんでない? 単にメインプログラムがないだけとか?
429 名前:424 mailto:sage [2007/04/26(木) 22:48:44 ] >428 XPマシン+gfortranでコンパイル→実行できたソース(非常に簡単なプログラム)をコンパイルしようとしたんですが, 上記のようなエラーが出て何も生成されませんでした。 ソースの指定をしないとno input filesが出るので,インストールもされてるしpathも通ってはいるようですが・・・ とりあえず明日にならないとvistaマシンはさわれないので今はどうしようもないですが, 何か分かる方はアドバイス御願いします。
430 名前:デフォルトの名無しさん [2007/04/27(金) 13:22:12 ] 平方根について質問があります. 複素数の範囲で -1 の平方根をとった場合, 精度の関係で +i が出力される場合と -i が出力される場合があります. つまり, Z1 = (-1.d0, 1d-10) Z2 = (-1.d0, -1d-10) のような時に, Q1 = sqrt(Z1) Q2 = sqrt(Z2) を計算したような場合,Q1=i,Q2=-i となります.皆さんはこのような問題を どうやって排除していますか? 絶対値で見たとき,ある値以下では0.d0で置き換えるという作業も考えられますが, 出る値のオーダがあらかじめ分かっているときしかできません. それとも初めからルートをとるような計算を 避けるようなアルゴリズムを考えるのでしょうか? また,平方根をとることによって精度が半分になってしまう場合が多々ありますが,これも諦めるしか ないのでしょうか.例えば理論上では0となるべきところで, R = 1d-10 となっているようなときです. Rと0.d0とを比べたときの誤差は許容範囲内だとしても,sqrt(R)とsqrt(0.d0)とではかなり違ってきており, sqrtを計算するたびに誤差が馬鹿にならなくなってきます... このようなときに行う定石みたいな処理があればアドバイスお願いします.
431 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 14:54:07 ] i と -i のどちらかでなければダメなのであれば その問題において何らかの束縛条件があるはずだから、 それに照らし合わせて符号を決めればいい。 どちらでもいい式になってるのなら気にする必要は無い。 どっちかというと、FORTRAN の問題じゃなくて数学の問題かな。 x^2 = -1 の時 x = ±i なわけだけど、 条件によっては +i か -i のどちらかじゃないといけないが、 どちらでもいい、あるいは両方ないといけない場合もある。
432 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 23:55:16 ] >>430 ルートを取ったときに誤差が増えるといっているが、そもそも1^-10のルートが1^-5なのだから そうなるのは当然のことだ。 そもそも根本的な発想が間違っている。それゆえに対処法が見当違いで、ど壺にはまっている。 >>431 のいうことももっともである。 身近な詳しい人に教えを乞うて、正しい発想をしなさい。
433 名前:デフォルトの名無しさん [2007/05/03(木) 14:13:58 ] 正の整数nを読み込みr=1,2,...,nに対する nCr=n!/r!(n-r)! を計算するプログラムを教えてくださいお願いします。 へたれなもんでスマセン。
434 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 14:20:30 ] 宿題は自分で(ry
435 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 14:25:48 ] nCr = n(n - 1)・ … ・(n-r+1) / r(r-1)・ … ・1 nC(r-1) = n(n - 1)・ … ・(n-r+2) / (r-1)・ … ・1 nCr = nC(r-1) * ? / ? nC0 = 1 nC(n-r) = nCr これだけ分かってれば解けるはず。
436 名前:斎木君 mailto:sage [2007/05/03(木) 15:51:22 ] >>433 program hoge implicit none integer :: n, r read *, n do r = 1, n print *, n, "C", r, "=", nCr(n,r) end do contains recursive function nCr(n, r) result (c) integer, intent(in) :: n, r integer :: c if (n < 0 .or. r < 0 .or. r > n) then c = 0 else if (n == 0 .or. r == n) then c = 1 else c = nCr(n-1, r-1) + nCr(n-1, r) end if end function nCr end program hoge
437 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 15:59:55 ] パスカルの三角形ってまた重いものをw
438 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:16:03 ] >>436 再帰は出来るだけ避けろ!w 情報工学科じゃあるまいしw
439 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:17:43 ] 再帰が問題じゃないだろー。
440 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 07:37:26 ] gccをfedora core 5、athlon64環境で使っています。 CのfloatとFortranのrealは同じ精度なのでしょうか?
441 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 22:04:12 ] >>440 同じ
442 名前:デフォルトの名無しさん [2007/05/09(水) 16:37:45 ] 質問があります。 今大学の研究室でプログラミングをやっているのですが、 みんなでやっても出来ません。 問題は「fl」というファイルに20個の数字がランダムにあって、 その数字を大きい順に並び替えるという問題です。 ちなみに今私が作ったプログラムは program ex4 implicit real*8(a-h,o-z) dimension a(100) do 10 i=1,19 open (10,file='fl.dat') read(10,*) a(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(i) pause stop end です。どこが間違っているのかわかる方がいましたら教えて下さい。
443 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 17:38:53 ] >>442 院生にきけ
444 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:39:12 ] ループの中でファイルを開いてるのが意味分からない。
445 名前:デフォルトの名無しさん [2007/05/09(水) 19:04:13 ] open文とread文をループの外にやっても正解のファイルが出てきませんでした。 心優しい人の返信待ってます。ほんとに困っているのでよろしくお願いします。
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用のヘッダーファイルを見て、 作ってやらないといけないことか。