1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
730 名前:718 [2006/07/23(日) 09:43:05 ] >>722 様、>>727 様、ありがとうございました。 お蔭様で、すばらしいものをいただきました!!!!!!
731 名前:デフォルトの名無しさん [2006/07/23(日) 12:54:39 ] >>728 FORT77で書いた。IMPLICIT NONEとか書いているのでF90かなとも思ったが、 Data文の使い方などが77くさいので77にした。 PROGRAM enshu2 REAL A(5, 5), B(5, 5), TMP(5, 5), x(5), y(5) DATA A/1,2,3,4,5, 2,3,4,5,6, + 3,4,5,6,7, 4,5,6,7,8, 5,6,7,8,9/ DATA x/5,4,3,2,1/ C y = A x DO 10 i = 1, 5 y(i) = 0.0 DO 20 j = 1, 5 y(i) = y(i) + a(j, i) * x(j) 20 CONTINUE 10 CONTINUE DO 30 i = 1, 5 WRITE(*, *) i, y(i) 30 CONTINUE C B = A**5 CALL copy(5, A, B) DO 40 i = 1, 5 CALL matmult(5, A, B, tmp) CALL copy(5, tmp, B) 40 CONTINUE DO 50 i = 1, 5 WRITE(*, '(I3, A, 1P, 5G13.5, 0P)') i, ':', (B(i, j), j = 1, 5) 50 CONTINUE STOP END C
732 名前:デフォルトの名無しさん [2006/07/23(日) 12:55:11 ] SUBROUTINE copy(n, a, b) REAL a(n, n), b(n, n) DO 10 i = 1, 5 DO 20 j = 1, 5 b(i, j) = a(i, j) 20 CONTINUE 10 CONTINUE RETURN END C SUBROUTINE matmult(n, a, b, c) REAL a(n, n), b(n, n), c(n, n) DO 10 i = 1, n DO 20 j = 1, n c(i, j) = 0.0 DO 30 k = 1, n c(j, i) = c(j, i) + a(j, k) * b(k, i) 30 CONTINUE 20 CONTINUE 10 CONTINUE RETURN END
733 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 13:16:33 ] 【爆 笑 問 題 VS 東 京 大 学】 もはや説明不要の日本の最高学府、東大に 爆笑問題が挑発的な問題提起をする!! 会場は、数多くの東大の学生諸君に囲まれ 前線には、東大の教授陣が睨みをきかせている緊張感の中 我らが爆笑問題は、いた! 90分間、あなたは見たこともない光景の中で 毒舌を吐き、教養を語る 太田光の姿を見ることになるだろう だが、教授陣も学生も黙っていられない 大蛇太田に、最高学府のプライドを持って 反撃する! 爆笑問題が『笑われるのか』、『笑わせられるのか』 貴方自身の目で、この伝説の光景を確かめてほしい・・・ (Part1) www.youtube.com/watch?v=UopvktceXS4 (Part2) www.youtube.com/watch?v=UGh-Kr2MDQU (Part3) www.youtube.com/watch?v=4dbaY8Yb3E0 (Part4) www.youtube.com/watch?v=7Yyar_hoKYw (Part5) www.youtube.com/watch?v=xcphQUht2Rs (Part6) www.youtube.com/watch?v=lUUEVSH7rbI (Part7) www.youtube.com/watch?v=EdERtUE86fU (Part8) www.youtube.com/watch?v=OrlIWhRpKok (Part9) www.youtube.com/watch?v=QX2bH6LH0oI
734 名前:デフォルトの名無しさん [2006/07/23(日) 14:48:27 ] >>729 PROGRAM kimtama PARAMETER (maxdat = 100) INTEGER ix(maxdat), iy(maxdat) OPEN(10, file = 'score.dat') OPEN(11, file = 'out2.f') DO 10 i = 1, maxdat READ(10, *, END = 99) ix(i), iy(i) 10 CONTINUE 99 ndata = i isum = 0 DO 20 i = 1, ndata isum = isum + iy(i) 20 CONTINUE avy = REAL(isum) / REAL(ndata) sdev = 0.0 DO 30 i = 1, ndata sdev = sdev + (REAL(iy(i)) - avy)**2 30 CONTINUE sdev = SQRT(sdev / ndata) WRITE(11, *) avy, sdev WRITE(6, *) avy, sdev WRITE(6,*)'結果をファイル out2.f に出力' STOP END
735 名前:デフォルトの名無しさん [2006/07/23(日) 21:07:30 ] windows環境でFORTRANを使用しているのですが、演算結果をコマンドプロンプトで表示させているのですが演算結果が長くなると最初の部分がコマンドプロンプトに表示されなくなります。 どのような対処法で演算結果の全表示ができるのでしょうか?アドバイスお願いします。
736 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:13:20 ] >>735 やったことはないけど、cygwinのターミナルでscriptというコマンドを実行してから プログラムを実行すればtypescriptというファイルに出力が保存されるよ。 プログラムが終了してからexitを実行してscriptを終了させるのを忘れないように。
737 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:27:55 ] >>735 リダイレクトで出力をファイルに保存する。 C:\> hoge.exe > log.txt moreで表示を1画面ずつ止める。 C:\> hoge.exe | more NT系(cmd.exe)ならコマンドプロンプトのプロパティで画面バッファのサイズ(高さ)を増やす。
738 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:51:31 ] 現在、Opteron×2のFreeBSD6.0でFortran95の開発環境を作りたいと思ってます。 gfortranでもg95でも構いませんが、両方ともgcc4.xがいるようです。 しかし、FreeBSD6.0だとgcc3.xが既に入っていて、gcc4をmakeしようとすると 「duplicate script ~ man/man1なんとか」ってエラーがでます) FreeBSD6.0(64bit)でFortran95の開発環境を作るいい方法はないでしょうか? FreeBSD自体超初心者ですが、アドバイス下さい。 スレ違いでごめんなさい。誘導でもいいのでお願いしまっす。
739 名前:デフォルトの名無しさん [2006/07/23(日) 22:09:43 ] >>735 DOS窓のプロパティー>レイアウト>画面バッファのサイズ を、9999なり許されるだけ 大きな数にしておけばおk。
740 名前:デフォルトの名無しさん [2006/07/23(日) 22:17:16 ] >>736 >>737 >>739 みなさん早い回答ありがとうごさいます。うまくいきました。
741 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 00:33:45 ] >>738 たぶんこのスレでは無理。 大抵Windows使ってる。Cygwin、Linuxの人は居てもBSDの人見たことない。 BSDスレに行くのがいいと思う。
742 名前:728 [2006/07/24(月) 06:54:52 ] >>731 >>734 ありがとうございました!大変助かりました!
743 名前:ダイナム [2006/07/24(月) 16:58:58 ] FORTRANでモードベクトルを求めたいんですが、さっぱりです。。。誰かご存知の方がいたら教えてもらえないでしょうか
744 名前:デフォルトの名無しさん [2006/07/24(月) 19:09:05 ] >>743 それだけでは答えようがない。 モードベクトルは業界用語で一般人には分からん。 もう少し具体的に質問すれば具体的な返事が得られると思うぞ。
745 名前:738 mailto:sage [2006/07/24(月) 19:50:33 ] >>741 レス感謝です。 他できいてみます。
746 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 20:56:08 ] VC++(普通のWinコンソールAP)から、FORTRAN関数(DLLにする予定) を呼び(stdcall)たいんですが、リンクに失敗します。 cdeclだとリンクに成功するんですっけど、stdcallだと呼べないlol 参考になりそうなサイトでもなんでもいいんで教えてエロイ人! あと、FORTRANをDLL化するときって、エクスポートとか必要すか?
747 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:06:49 ] >>746 マニュアル読むしかないな。 DECFORTRAN系なら、compiler directiveで、stdcall を選べたはず。 cDEC$ ATTRIBUTES C :: object [, object] ... cDEC$ ATTRIBUTES STDCALL :: object [, object] ... DLLがらみも cDEC$ ATTRIBUTES DLLEXPORT :: object [, object] ... cDEC$ ATTRIBUTES DLLIMPORT :: object [, object] ... こういう指定子があるので、まぁマニュアル見てがんばれw 他のコンパイラもこういうオプションあったはず。
748 名前:デフォルトの名無しさん [2006/07/24(月) 21:57:52 ] プログラムの実行中 severe(170): Program Exception - stack overflow という、エラーをはきだして終了しました。 そこで、ファイルの書き出し部分をコメントアウトしたら、 正常に最後まで走ったので、素人的な判断ですが、 ファイルの書き出しのバッファが溢れてしまったと思うので、 flushする方法を教えていただきたいです。お願いします。
749 名前:748 mailto:sage [2006/07/24(月) 22:03:18 ] あ、すいません。やりなおしたら、 ファイルの書き出し部分をコメントアウトしても、 エラー出してしまいました。 一般的に、 severe(170): Program Exception - stack overflow このエラーが出たら、どう対処したらよろしいでしょうか?
750 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 22:14:18 ] >>749 スタックのサイズを増やす
751 名前:デフォルトの名無しさん [2006/07/24(月) 22:53:29 ] Compaq Visual Fortran 6.5をインストールしたあとに Microsoft Visual C++ 6.0 standardをインストールしたら, Visual Studioを共有しているらしく,C++がまともに動かなかったり,一部英語になってみたり 全体的にすこぶるおかしくなってしまいました. その後,全部アンインスコし, まずは普通にVC++をインストールしました. もちろんこの時点では何もかも正常です. で,これにCVFをインストールすると可笑しくなるので, Fortranはコンパイラとバッチファイル,それに関連するライブラリ等を手動でコピーしてみました. というのも,Fortranはコンソールアプリが動けばいいのでVisual機能は今必要ないからです. すると今度はFotranにライセンス的なエラーが出て使えませんでした. 共存は不可能なのでしょうか?
752 名前:デフォルトの名無しさん [2006/07/24(月) 23:05:11 ] >>749 リンカーのオプションにスタックサイズがあるので、それを増やすことで解決する。 VisualFortranなら、プロジェクトのプロパティー>リンカ>どこかw しかし、多分それはautomatic変数で大きな配列を取っているせいだと思う。 面倒だがallocatableで配列を取るようにすれば、heapの方からとるので そういうイライラするエラーは出にくくなる。
753 名前:748 mailto:sage [2006/07/24(月) 23:08:14 ] >>750 スタックサイズあげても、なんかエラー消えませんでした。 ですが、エラー解消されました。 pvarは、ある配列を指す、ポインタで、 write (13, '(F20.8, $)') pvar を、 write (13, '(F20.8, $)') (pvar(i), i=1,3) としたら、エラー消えました。 くだらないエラーですいません。
754 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 23:18:02 ] >>751 CVFの後からMSVC++をインストールするとメニューが日本語に変わったりしたが 動いていた記憶があるのだが・・・ たしか、VisualStudio自体もパッチをあててVersionをそろえないとDLLの類が 矛盾して問題を引き起こした気がする。 ここに古いFAQがあるがあまり役に立たないかな・・・・・ xlsoft.co.jp/jp/products/intel/cvf/visual/jfaq.html ま、がんばれw
755 名前:751 mailto:sage [2006/07/24(月) 23:40:28 ] >>754 助言ありがとうございます. もちっとがんばってみます.
756 名前:迷子 [2006/07/25(火) 04:36:17 ] どなたか助けてください。 フォートランとCで書かれたPC用のプログラムが手元にあります。 そのプログラムソースはフォートランに20とCに10ぐらいのファイルに分割されています。 一つのファイルに手を加えて試したいのですが、 一体、どうすればコンパイルできるのでしょうか? コンパイラーは何か特別なものが必要なのでしょうか? 私にはフォートランもCもパラメターと関数を少しいじる程度の知識しかありません。 作った方もすでに卒業して連絡がとれません。 どうかお願いします。
757 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 05:34:16 ] 分割コンパイルくらいは周りの人に聞きゃいいんじゃね? プログラムできる人、全く居ないのか?
758 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:25:18 ] >>756-757 初心者には、ハードルが高いと思うよ。 先輩の遺品の中に、makefile というのがどこかにないかな? 例えば、こんなの。 Make と Makefile の説明 ttp://www.unixuser.org/~euske/doc/makefile/ 自分の環境を書いた方がいいよ。
759 名前:番組の途中ですが名無しです [2006/07/25(火) 06:41:39 BE:35013825-2BP] 標準出力に出力するとき、改行せず内容を更新したい場合はどのようにすればいいんでしょうか? 具体的には a = 2.0000000 とあって、aを更新したときに a = 2.0000000 (改行) a = 4.0000000 とするのではなく a = 4.0000000 (改行無しで2が4に切り替わる) のように表示したいのです。
760 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:52:27 ] >>758 makefile があったら、ハードル高いも何も make 一発じゃないかな? まあ、make hoge みたいにするようになってる可能性はあるが。
761 名前:迷子 [2006/07/25(火) 07:01:55 ] 周りはC/C++かJavaだけの人(といっても皆さんにわか覚えの人達)しかいないのです。 みんなFortranの方はお手上げです(部屋にはコンパイラすらない)。 一人がVisualC++.netを使ってCの分割コンパイルの仕方を教えてくれたのですけど。 それでFortran部分とリンクが出来ているとは思えないなんてコメントを残すし。 エクスキュータブルには.exeファイルが一つしかないから、 ひょっとしてCとFortranのファイルを全て同時にコンパイルする方法があるのかな? じゃ、ひょっとして特別な環境じゃなきゃコンパイルできないのかな? Linuxには富士通からのFortran/C++のコンパイラが出てるみたいだけど...PCには? もう2週間ほど妄想に迷走しまくっていてます。 こんな超素人ですがよろしくお願いします。
762 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:03:16 ] コンパイラ無いのに前の人はどうしてたんだろう?
763 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:07:31 ] とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから それをそのままリンクすりゃええわけだけども、 注意する事は識別子名がそのまま使える事は限らないってことと、 標準ライブラリをちゃんとリンクするってところだな。 識別子名に関しては既に対策取られてるはずではあるけど、 それもコンパイラが変われば状況変わる可能性があるので、 前の人が使っていたコンパイラが無いなら またいじる必要があるかもしれん。 あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、 C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを 忘れないようにリンクするだけだな。
764 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:08:55 ] gccなら > gcc *.f *.c でおk
765 名前:デフォルトの名無しさん [2006/07/25(火) 10:50:42 ] >>759 標準出力を、FORTRANのラインプリンター制御文字が有効になるモードにして、 改行せずの+を1文字目に出力する。
766 名前:デフォルトの名無しさん [2006/07/25(火) 14:11:04 ] 教えてください!!明日レポート提出です・・ (1)n個のデータa1、a2......anを読み、大きい順に並べて出力する。 (2)y=x**2+1の0から2までの積分地を台形則から求める。 以上の二つをお願いします。(2)がさっぱりです。
767 名前:デフォルトの名無しさん [2006/07/25(火) 14:56:27 ] >>766 (1) FORTRAN77で初心者っぽく作ってみた PROGRAM kintama REAL a(1000) WRITE(*, *) ' INPUT No. of DATA' READ(*, *) n DO 10 i = 1, n WRITE(*, *) 'INPUT DATA No.', i READ(*, *) a(i) 10 CONTINUE CALL sort(n, a) WRITE(*, '((5F10.4))') (a(i), i = 1, n) STOP END C SUBROUTINE sort(n, a) REAL a(n) DO 10 i = 1, n DO 20 j = i + 1, n IF ( a(j) > a(i) ) THEN tmp = a(i) a(i) = a(j) a(j) = tmp END IF 20 CONTINUE 10 CONTINUE RETURN END
768 名前:デフォルトの名無しさん [2006/07/25(火) 15:12:27 ] >>766 (2) 解析的には8/3+2|^2_0=4.6666・・・・・・・だが、100分割で計算すると4.6668000 台形公式だしh^2に誤差が比例しているとするとまぁこんなところか。 文関数を使っているがあまりお勧めできない。積分をサブルー朕に、被積分関数をfunctionにすると もっと通っぽいだろう。あと、台形の面積を正直に求めているが、これは同じ値を2回計算しているので ウンコである。両端を0.5倍、その他を1倍で足すほうがまとも。 初心者っぽさを出すために、マジ台形で計算してみた。 PROGRAM okki F(x) = x**2 + 1.0 n = 100 s = 0.0 x0 = 0.0 x1 = 2.0 h = (x1 - x0) / n DO 10 i = 1, n x = x0 + h * REAL(i - 1) s = s + h * ( F(x) + F(x + h) ) / 2.0 10 CONTINUE WRITE(*, *) ' AREA =', s STOP END
769 名前:766 [2006/07/25(火) 18:21:46 ] >>767-768 さん 本当にありがとうございます。助かりました。
770 名前:迷子 [2006/07/26(水) 00:27:33 ] >>758 >>760 私一人では跳び越せないハードルで見たいです。 ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。 ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。 わたしのPCはデルPrecisionにXPをのせたものです。
771 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 00:44:28 ] >>762 前の人が僅かに書き残してくれていたノートには MSの Fortran Powerstation4.0 とVisual C++4.0なるものを使っていたと書かれていました。 >>763 前の人が最後にコンパイルしていったプログラムはしっかり走るようなので 上記の環境用にソースは大丈夫だと思います。 新しい環境での問題は試して比べてみるしかありませんよね? 部屋にはMSVisual C++.netが一つ空いているのですが、 FORTRANのコンパイラはどれでもいいのでしょうか? またこのCとFORTRANのコンパイラなら大丈夫と言うお勧めはありますか?
772 名前:デフォルトの名無しさん [2006/07/26(水) 00:51:09 ] すいませんが誰かこの問題のプログラムを解ける人、教えていただけないでしょうか。 レポートの提出が明日の13時です。 (1)ニュートン法を用いて、 式ZIN=(√Ur/12.0)×tanh((J×6.28×5000000000)/(3000000000×(√12×Ur)×0.005))で、 ZIN=0.4296446とありUrを求めるプログラムです。 Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6となるはずです。 よろしくお願いします。
773 名前:デフォルトの名無しさん [2006/07/26(水) 00:54:36 ] >>772 Jの値がないんだが・・・・ 工学部で虚数単位をJと書いているようにも見えないし・・・ 問題文を全部かい手味噌
774 名前:デフォルトの名無しさん [2006/07/26(水) 00:59:45 ] すいません。 J=(0,−1)とおいてプログラムするそうです。
775 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 01:07:28 ] >>771 そのFortran PowerstationとVC++4.0はどこ行ったんだよ。 どうしてもコンパイルし直す必要があるならIntel Visual Fortranでも買ってもらえ。
776 名前:デフォルトの名無しさん [2006/07/26(水) 01:23:24 ] >>774 おk Jは虚数単位だったかw 複素のニュートン法か、めんどいな。 どうしてもっと早く持ってこない!もう眠いwww >>771 FortranPowerStationは、IO周りにメモリーリークのバグがあるので注意。 あと、VisualC++がマネージドコードしか出せないversionだと、 FortranとはLINKできなかったはず。IntelVisualFortranを買うなら環境は統合できるが そのへん注意が必要。 INTELのサイトから2週間試供品が落とせるので、まず試してみるのがよかんべ。 2週間以内にすべてを終わらせる勢いでがんばるという手もある。 インテルは一年ごとの更新料がかかる。 FORTRANコンパイラを買うとCコンパイラが付属してくるものもある。 LaheyやABSOFTのプロフェッショナル版を買うと、Cコンパイラが付属してくるので、 若干敷居が低くなるかもしれない。 Laheyのものは富士通のOEMだが富士通とちがってWindows版もある。 値段的には8万円コースか。 値段の安いものとしてはNAGの入門版があるが、使ったことはない。 ライセンス条件はうざい感じが漂っている。 NAGは文法に厳密だが、スピードは遅いという特徴がある。 www.nag-j.co.jp/FortranBuilder.htm
777 名前:迷子 [2006/07/26(水) 01:47:40 ] 夜遅くにレスありがとうございます。 >>775 コンパイラが入ってたPCは昨年に廃品回収されてしまいました〜 ソフト本体は前の人が持っていってしまったようです。 >>776 うーどれも結構なお値段ですね。 ちょっと比べてみて私に使える物をせびってみます。
778 名前:デフォルトの名無しさん [2006/07/26(水) 10:38:17 ] >>772 ちゃんと問題文写してるか? 質問がウンコだと、答えもウンコにならざる終えない。 そもそも式が良く分からん 5000000000)/(3000000000 こんな数が出るとは思えない。 Jは虚数単位なのか、そのマイナスなのか良く分からん。ルートのかかっている範囲も分からん。 >Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6 この意味も分からんが、実部と虚部ということにしておく。 上記の可能性を色々変えても、答えのUrは式を満たさない。 故にニュートン法を試そうにもどうにもならん。 もう時間もないし、素直に0点をもらいなさいw ローボコン 0点
779 名前:689にて質問したものです [2006/07/26(水) 15:49:52 ] PROGRAM main INTEGER,ALLOCATABLE:: sqmx(:,:)= 0 INTEGER:: l, m, n, i, sum = 0 PRINT'("正方行列の行数は? ",\)'; READ*, l ALLOCATE( sqmx(1:l, 1:l) ) DO i = 1, l DO m = 1, l PRINT'(A,I2,A,I2,A, \)',"第", i, "行", m,"列の要素は? " READ*, sqmx(i,m) ENDDO ENDDO PRINT*, det(sqmx) CONTAINS RECURSIVE FUNCTION det(sqmx) RESULT(res) INTEGER,INTENT(IN)::sqmx(:,:) INTEGER:: res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,1)-1) n = SIZE(sqmx,1); res = 0 IF(n == 1) THEN res = sqmx(1,1) ELSE DO i = 1, n wk(:,1:i-1) = sqmx(2:,1:i-1) wk(:,i:n-1) = sqmx(2:,i+1:n) res = res + sqmx(1,i)*det(wk)*(-1)**(i-1) ENDDO ENDIF ENDFUNCTION det END 「再起呼び出しをもちいてn×nの正方行列をもとめよ」 以前ヒントをいただき、うえのようなプログラムをつくったのですが、未だにうまく動かず 生き恥をさらしています。どこに問題があるのでしょうか?教えてください。1×1、2×2は うまくいくのですが3×3でうまくいかないのです。
780 名前:デフォルトの名無しさん [2006/07/26(水) 17:46:27 ] >>779 お答えしよう、問題は副関数がわでINTEGER::i,nの宣言をしていないために、 主プログラム側のi,nをグローバル変数として使用してしまい、 このために再帰で呼び出すたびに、i,nの値が書き換わってしまうからである。 主プログラム内で、CONTAINSを使うときは、これがおきるのでよっぽど簡単なサブルーチン 以外は面倒でも独立したMODULEで作ったほうが安全w グローバル変数コワスwwwww
781 名前:689にて質問したものです [2006/07/26(水) 19:18:01 ] 780さんありがとうございます。containsは使わないほうがよいということですね。 もう少し煮詰めてみます。
782 名前:デフォルトの名無しさん [2006/07/26(水) 19:26:33 ] >>781 いや、言葉が足りなかった。開発のときには使わないほうがいいということ。 おkなのが確認されたら一体化すればいい。 MODULEだってグローバル変数に関しては同じ危険があるのだが、 MODULEのグローバル変数に、i,j,nやx,y,aなど普段使う変数を入れるのは稀だ。 しかし、メインプログラムでは使わないことは少ない。それで、もし今回のようにCONTAINされる側で うっかりi,j,n等を宣言し忘れたらどうなるか?メイン側で使っていなければエラーがでるが、 メイン側で使っているとエラーがでないし、今回のように悪性の間違いになってしまう。 予防の問題だ。 CONTAINS RECURSIVE FUNCTION det(sqmx) RESULT(res) IMPLICIT NONE INTEGER,INTENT(IN)::sqmx(:,:) INTEGER:: i, n, res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,2)-1) 〜〜〜〜〜〜〜 n = SIZE(sqmx,1); res = 0 IF(n == 1) THEN res = sqmx(1,1) ELSE DO i = 1, n wk(:,1:i-1) = sqmx(2:,1:i-1) wk(:,i:n-1) = sqmx(2:,i+1:n) res = res + sqmx(1,i)*det(wk)*(-1)**(i-1) ENDDO ENDIF print *, n, res 〜〜〜〜〜〜〜これで再帰の挙動がみられるので、i,nを宣言した場合としない場合の違いが見れる ENDFUNCTION det
783 名前:689にて質問したものです [2006/07/26(水) 20:27:43 ] 782さん、具体例まで示していただき本当にありがとうございます。 プログラムが動きました!!自分のちからでないにしても感動があります。 逆に勉強不足も痛感していますが。本当にありがとうございました。
784 名前:デフォルトの名無しさん [2006/07/26(水) 22:45:41 ] 質問させてください。 配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?
785 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 22:58:59 ] >>784 普通に書式を指定すればおk
786 名前:デフォルトの名無しさん [2006/07/27(木) 00:02:52 ] >>785 うーん、formatとかつかうんですかねー? もう少し具体的に教えていただけないでしょうか?すみません
787 名前:デフォルトの名無しさん mailto:sage [2006/07/27(木) 00:46:10 ] >>786 普通の変数だろうが配列だろうが入出力の書式指定はいっしょ DOUBLE PRECISION X(5) DO 10 I=1, 4 X(I)=1.D0/I WRITE(6,100) X(I) 10 CONTINUE X(5) = 4.D0 * ATAN(1.D0) WRITE(6,'(1X,F12.9)') X(5) 100 FORMAT(1X,F6.3) END
788 名前:デフォルトの名無しさん [2006/07/27(木) 00:59:17 ] ありがとうございます。 うまくいきました。ホント初心者なんで助かりました。
789 名前:デフォルトの名無しさん [2006/07/27(木) 01:51:55 ] >>788 FORMATは、足りなくなったら直前のカッコの所までもどってそれを繰り返す。 ゆえに、1行目だけ特殊で、2行目以降繰り返しというようなことも出来る。 ■ print '(a, i7, 3f10.3,/ (5F10.3))', ' kintama okki', i, (x(i), i = 1, 13) ■ kintama okki 1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 (/は改行。) (x(i), i = 1, 13) は、入出力のとき使えるDO....LOOPの一種。F90になってからはあまり必要なくなったがF77だと便利。
790 名前:デフォルトの名無しさん [2006/07/29(土) 18:03:58 ] 質問です。 卒論でFortranを勉強する必要があって、普段は環境の整っている学校のパソコンを使っています。 しかし、夏休みで実家に帰るので、ノートPCにもFortranが作動する環境を入れたいのですが、 フリーで手に入るソフト類はないでしょうか? 可能なら、それをダウンロードするページも教えていただけたら助かります。
791 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 18:12:18 ] >>790 pc8.2ch.net/test/read.cgi/tech/1104724162/3
792 名前:790 [2006/07/29(土) 18:32:28 ] >>791 ありがとうございました。
793 名前:デフォルトの名無しさん [2006/07/30(日) 23:04:31 ] n(任意の整数)の4乗は何桁になるか表示せよ という問題が分かりません。お願いします。
794 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 23:19:23 ] 一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。
795 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 01:55:04 ] メモメモ
796 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 03:38:41 ] 高校で習う筈だが。
797 名前:デフォルトの名無しさん [2006/07/31(月) 08:36:28 ] 質問です。自作のプログラムがどうしてもコンパイルできないです。 経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?
798 名前:797 [2006/07/31(月) 09:18:44 ] 過去ログ読みましたorz >799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。 サブルーチンの関数を用いてa,v,xを更新していくプログラムです。
799 名前:797 [2006/07/31(月) 09:21:14 ] ! ---宣言文--- implicit none real yy,aa,vv,xx,aa2,vv2,xx2,tt,dt,mm,cc,kk,beta integer n,i tt=0 !---入力--- write(*,*) 'input m,c,k' !システム条件の入力 read (*,*) mm,cc,kk write(*,*) 'input beta' !βの入力 read (*,*) beta write(*,*) 'input a0,v0,x0' !初期条件の入力 read (*,*) aa,vv,xx
800 名前:797 [2006/07/31(月) 09:22:03 ] !---ファイルオープン--- open(10,file='jishindou.txt') open(20,file='outouchi.txt') read (10,*) n,dt !---初期値の書き込み--- write(20,*) tt,aa,vv,xx !---doループによる計算--- do i=1,n read (10,*) yy call reply(yy,aa,vv,xx,aa2,vv2,xx2) aa = aa2 vv = vv2 xx = xx2 tt=tt+dt write(20,30)tt,aa,vv,xx 30 format(f4.1,3f6.3) end do
801 名前:797 [2006/07/31(月) 09:23:00 ] !---ファイルクローズ--- close(10) close(20) stop end !---サブルーチン副プログラム--- subroutine reply(y,a,v,x,a2,v2,x2) real y,a,a2,v,v2,x,x2 a2 = -(y+cc*(v+a*dt/2)/mm+kk*(x+v*dt+a*dt**2*(1/2-beta))) & /(1+cc*dt/2/mm+kk*beta*dt**2/mm) v2 = v+dt*(a+a2)/2 x2 = x+v*dt+a*dt**2*(1/2-beta)+beta*a2*dt**2 end subroutine reply 以上です。
802 名前:デフォルトの名無しさん [2006/07/31(月) 10:05:41 ] >>797 固定フォーマットで書いたのか、自由形式で書いたのかよく分からないが、 自由形式なら継続行の1行目の尻に&を書いておく必要がある。 そうすればコンパイルは通るぞ。
803 名前:デフォルトの名無しさん [2006/07/31(月) 10:12:13 ] >>793 PROGRAM yasukuni WRITE(6, *) 'input n' READ(5, *) n x = REAL(n**4) k = INT(LOG10(x)) + 1 WRITE(6, *) n, '**4=', INT(x), ': ', k STOP END FORTRANでは普通のLOGは自然対数なので、10進法での桁を求めるには常用対数LOG10を 呼ぶ必要がある。
804 名前:797 [2006/07/31(月) 11:07:34 ] >>802 固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、 サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。 ご指摘いただいたのはそこの部分でしょうか?
805 名前:デフォルトの名無しさん [2006/07/31(月) 11:27:15 ] >>804 うい。固定フォーマットだったか。失敬。 FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。 とりあえずどっちでもコンパイルできたぞ。 いちおうエラーメッセージを貼ったほうが、皆の衆の助言はもらえやすいと思うぞ。 せめてエラー行とか。
806 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 19:23:14 ] >>797-801 subroutine reply の方でdt, mm, cc等の変数が宣言されておらず 値が不定のまま使われている。 たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは 変数の有効範囲が別々になるので注意が必要。
807 名前:デフォルトの名無しさん [2006/08/01(火) 22:08:22 ] DQNな質問で恐縮なのですが... write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか? 出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。
808 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 00:28:46 ] >>807 inquireを使えば何とかならないかな。 program nurupo logical :: opened character(len=6) :: string open(10,file="test10") i=10 do inquire(unit=i,opened=opened) if(.not.opened) then write(string,'("test",i2)') i open(io,file=string) write(*,'(i2," opened")') i exit endif i=i+1 enddo end program nurupo
809 名前:デフォルトの名無しさん [2006/08/02(水) 00:51:00 ] >>807 Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが これは標準出力ということだから意味ないし〜 同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。 F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。 3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。 FORTRANの装置番号は確かに改良の余地がある。 ISOにコネのある人は、次の規格で何とかするように提案してくださいw この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、 知らずに移植したりすると、奇怪な挙動を示して泣く。 まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と 数十年来の問題が規格において徐々に解決してきているので、装置番号問題も 日ごろから不平不満を漏らしていれば、いつかは解決すると思うw
810 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 04:00:00 ] 改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。 そんなもんは内部で決めてもらわないと。
811 名前:デフォルトの名無しさん [2006/08/02(水) 18:03:54 ] >>808-810 みなさん、いろいろとありがとうございました。 >>808 さんの方法を試しつつFortran2010(?)まで待つことにします。
812 名前:デフォルトの名無しさん [2006/08/03(木) 00:23:38 ] NEC 日立 富士通 あたりはISOと関わっているはずだから、 喚いているとそのうち声が届く可能性は無きにしも非ずだな。 2015年のジェッターマルス時代までには何とかなるだろうさ。
813 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:10:07 ] すいませんが、次の課題のヒントだけでももらえないでしょうか。 関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。 ・積分区間の下限値a,上限値bはキーボードから入力する。 ・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する) ・台形公式の計算にはサブルーチン副プログラムを用いる。 ・関数f(x) の計算には関数副プログラムを用いる。 台形公式とは。 与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に, S = S1 + S2 + ・・・ + Sn となる,ここでn等分した小区間の幅hは, h = (b-a)/n となるので,各台形の面積は S1 = h・(Y0+Y1) /2.0 S2 = h・(Y1+Y2) /2.0 ・・・ Sn = h・(Yn-1+Yn) /2.0 となる。したがって,全面積は, S = S1+S2+・・・+Sn = h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)} と近似できる。
814 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:32:18 ] >>813 program trapez read(*,*) a,b do n=5,20,5 call calc_area(a,b,n,area) print *,n,area enddo end program trapez real function fx(x) fx=x*x+1 end function fx subroutine calc_area(a,b,n,area) real,dimension(:),allocatable :: y allocate(y(0:n)) h=(b-a)/float(n) do i=0,n y(i)=fx(a+i*h) enddo area=h*((y(0)+y(n))/2.+sum(y(1:n-1))) deallocate(y) end subroutine calc_area
815 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 10:32:59 ] >>814 ありがとうございます。 でも、自分でなんとか作ってみました。 ものすごく拙いプログラムですけれど… 時間をとらせてしまってすいませんでした。
816 名前:デフォルトの名無しさん [2006/08/03(木) 21:48:03 ] 超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます 7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?
817 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:51:57 ] double precision
818 名前:デフォルトの名無しさん [2006/08/03(木) 22:04:25 ] >>817 ごめんなさい、どういう意味なんでしょうか・・・ そしてさらにわからない問題あるんでお願いします INTEGER I,J,K I=11 K=o DO 10 J=5,1,-2 IF (J.LE.I)THEN K=K-J END IF I=I+K 10 CONTINUE WRITE(*,*) K を実行したときに表示される数を求めよ これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・
819 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:16:05 ] 参考書嫁
820 名前:デフォルトの名無しさん [2006/08/03(木) 22:23:19 ] ごめんなさい、手元にある参考書っていうか教科書が 初心者の為に簡潔に書いているせいか、なんか意味がわからないんです 何回も読んでみたんですけど何でそうなるのか理解できないんです スレ汚して申し訳ありませんでした
821 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:58 ] >>818 Oと0、Iと1って間違いやすいよな。 今これが分からないのなら明日の試験は絶望的だぞい。
822 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:32:09 ] I と 1 は間違えてないと思うが。
823 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:20:29 ] 最悪なのは小文字のlと1だろう。 やっぱ大文字最高!!w
824 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:35:45 ] >>823 同意。 ただ全角スペースは見た目が半角とつかない。
825 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:06:37 ] 大文字でプログラムを書く人は CAPS LOCKにしているの? vi でプログラムを書いていると、 CAPS LOCK にすると意図に 反する編集をしてしまいそうで怖い。でもずっと shift を押し ながら打つのも面倒。 それで小文字で書いてます。
826 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:36:44 ] プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。
827 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 08:49:17 ] つまり、こんなフォントを使えば良いんだな。 ttp://www.geocities.com/TimesSquare/4965/
828 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:31:49 ] Osaka 等幅で十分
829 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:51:22 ] 必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に 等間隔に配置してくれるだけでも事は足りるから。
830 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:22:18 ] 質問があります。 ある文献のFORTRAN77で書かれたプログラムを、練習がてら そのまま書き写してbuildすると libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main test.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. test.exe - 2 error(s), 0 warning(s) とりあえず、build errorの中を調べてみたんですが、全く解決できません。 コンパイルエラーはゼロです。 どのような解決方法がありますか?教えてください。