くだすれFORTRAN(超初心者用)その6
■ このスレッドは過去ログ倉庫に格納されています
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その5 http://toro.2ch.net/test/read.cgi/tech/1269704830/ ●過去スレ くだすれFORTRAN(超初心者用)その4 http://pc12.2ch.net/test/read.cgi/tech/1232789521/ くだすれFORTRAN(超初心者用)その3 http://pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 http://pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) http://pc8.2ch.net/test/read.cgi/tech/1138063703/ 連投すんません S(x(i),y(i),z(i))は新しい関数ですm(__)m よろしくお願い申し上げます。 求めた解はどこかで使うんでしょ?なら,使う直前にwrite文を書けばいいのではないか? というか, >二分法かなんか 『なんか』ってなんだ?そんなきき方でどう答えろというんだろうか? その例の書き方だと,そもそも二分法の使い方を理解しているのかと,そっちの方が心配になる. >>741 すまん!書き方悪かった。 「なんか」と書いたのは二分法等イテレーションする場合と言いたかった。 debugをしたら user breakpoint called from code at 0x7c94120e と出てきたのですが、どういった意味なんでしょうか 環境書こうよ…… まず、>>1 の注意事項を読んでくれ >>743 デバッガがプログラムを呼び出して実行してブレークポイントに到達して止まった つまり意図通り ブレークポイントを誰がどうやって設置したかは環境次第 Rの関数(cor(x,y)など)をFortranプログラム上で使えるようにできないでしょうか Rに入っている関数のsoファイルを利用してなどできたりしないでしょうか >>749 あなたは Fortran ではなく R を使うべきなのではないのでしょうか Rがコマンドから使えるなら普通にSYSTEMすればいいんじゃないの >>750-751 事情がありFortranで組む必要があったので仕方なく・・ ありがとうざいました そもそもFORTRANにはRなんか手も足もでないような統計ライブラリが存在するはずだが >>753 IMSLかMKLの統計サマリーですかね? 使いたいのは比較的新しめの統計量で、 そこには用意されていないけどRにはあったので・・ 相関係数求めるだけだろ? http://tama.green.gifu-u.ac.jp/ ~tama/soft/sample_prog/correlation/ 今更ながらなんだがフォートランとオクターブの組み合わせ最高だよな。 今まではfortran とgnuplot だったけど オクターブってMATLABのパチモンだっけ? 最近もメンテされてるの? >>757 余裕でお絵描きできるよ。 お絵描き機能は gnuplot のを踏襲してるぽ >>758 まだまだ現役 お絵かきとは2chのお絵かき機能のこと。 この板はできないのか? 3/3から2chのapi始動するけど移住しなくても大丈夫かね とりあえずdat廃止されるまではここはNavi2chで巡回するけど とりあえずおーぷん2chにたてるだけたてといた http://toro.open ☆2ch.net/test/read.cgi/tech/1425031440/ (☆はNGワード対策) 何事もないことが一番だけどそんときは避難所代わりに使ってください 現に今人多杉状態だけど ここ質問スレだけど他にfortranスレないしfortran全般に関する喋り場ならおーぷんでいいよね?転載嫌いとかアフィリエイト嫌いとかのひとがいたらすまんが 純粋な質問に関してはstackoverflow日本語版も始まったしそっちも賑わってほしいなあと思ってる(現在3件しかない) 本家stackoverflowの方はfortranに関してもかなりお世話になってるし お若い方。 この世間に疎い爺に何が起きているのか3行くらいで教えてくれんかね? カチュ〜シャが使えなくなってから専ブラともお別れじゃよアッハッハ 2chがたらこのものでなくなったらしい話は風のうわさに聞いたども、 移住とは何のことじゃね? >>763 おーぷん2chは知らなかった。何かあればそちらを使わせてもらいます。 stackoverflowの方はgoogleでの検索がヒットした時ぐらいしか行かなかったけれど、 日本語版はありがたいね。こちらも覗きに行きます。 >>764 私もよく知らないが、現在の専ブラが使っているdatが廃止される。2chを専ブラで利用するためには 2chが提供するAPIが必須となるが、このAPIは2chから使用許諾を受ける必要がある。 よって今のようなオープンソースの専ブラの開発、提供は難しいようだ。 >>492 私も見たいと思ったのですが… 該当章はなくなってしまったようですね. (もう8か月以上だから仕方ないか) おいおいTip集に分離されただけで記事は残ってるぞ nagのトップページから見てみ Hey!Yo!Brother! Fortran2003でOOPを勉強してみたいんだが、NAGしか入門する門は無いのかい? ジーザスは狭き門より入れと言ったが、おじちゃんは滅びの道でもいいから 広き門から入って太い道を通りたいんだYo! できればジーザスの言葉と同じアラム語かおじちゃんと同じ言葉の日本語で頼むよ! 敵性語はノンノン! >>784 ああ、それは腹立つな Fortran Graphic、Fortran OpenGLで検索するとそこそこ出てくる けど、まともにメンテナンスされてるのが無さげでもある…… プログラム中のx行目?y行目のソースコードを出力させるwrite文の書き方はないでしょうか >>771 プログラム単体では無理 単純に任意のファイルのx行目を表示するプログラムなら簡単 指定行まで読み飛ばして、指定行を十分長い文字列で読み込めば良い それでソースファイルを読んで表示するならできるけど ソースファイルは常に必要 >>773 なるほどopenして目的行寸前まで空readしてread×行数すればいいということですね 解決できそうです。ありがとうございました >>774 初めて聞きました。勉強になりました 3次元のスカラーデータを吐く、x,y,zのdoループをompにしようとしたんだけど、スタックオーバーフローだなんて怒られた どーすんべ? 安直にはコンパイラ、リンカのオプションでスタック増やせ。 MinGWのGCC4.9.2ののFORTRANで, -fcase-upperのようなオプションってありますかね? 昔のバージョンにはあったみたいなんですが, 現在のは削除されたようで. Gfortran とIntel fortran のそれぞれの利点って何かね( ´ ▽ ` )ノ え、gfortranに利点なんかあるの? ああ、うん、gccツールチェインの一部なのは便利だよね ハードウェアで二倍の性能出す金払うくらいだったら、Intelのコンパイラ買えよ。 ソフトには金出せないってどんだけ唯物論のアカなんだよw >>784 10年くらい前は差は歴然としてました。 最近はどうなのでしょうね? intelは自動並列化があるから中級者は使用を薦める このレス数からしてFortran使ってる人はほとんどいないのかな? ここでの質問は学生がほとんどのように見える 一般人は使わないだろうから少ないのは確かだろうけど 調べたり相談できる人が多いんじゃない? >>788 なるほど じゃあ私遠慮無く質問しまくっちゃっおうかな fortran の組み込み関数でminval ってのがありますよね. ある配列a(要素は一つだけ)に関して minval(a,dim=1,mask=a>0.0d0)すると値が1e-324みたく値がおかしくなるんですが原因として考えられるものは何でしょう? ちなみに配列aの中身は a(1)= 4.2e-2です。 なので期待する値は minval(a,dim=1,mask=a>0.0d0)=4.2e-2になるはずなんですが。。。 >>790 なんとなく初期化してない変数が引っかかっている気がする minvalの動作不良を疑うならコンパイラとか環境を書こう 違うならソースをできるだけ書こう 長くてソース貼れないならこんな感じに晒すと検証が楽 https://ideone.com/JstGnQ >>790 単精度を入れているのに倍精度で値が返ってきているのが気になる。 なんか倍精度と単精度をまぜこぜにしているか、コンパイラが間違っていてまぜこぜにしている。 g95はデフォの変数長を変えたせいで混乱に陥った。その辺かな? FortranはRealとIntegerの長さが等しくないといけないのにそれを崩した。 まぁ64Bit時代には8バイト整数にしたいのはわかるけど、 そうなると倍精度がRealになって、倍精度が4倍精度になってハードウェア対応せずで憤死する。 https://ideone.com/m11vQN こんな感じかな? program test2ch implicit none real(8) :: a(1) real :: b(2) equivalence(a, b) b(1) = 4.2e-2 b(2) = 0.0e0 print *, minval(a, dim = 1, mask = a > 0.0) end program test2ch 実行結果 5.070575254129006E-315 >>792 ideoneってfortranいけるのかw 変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね? ちなみにgfortran 4.2 でDebian 8.0 64bit版での話なんだが。 >>794 ?? ASSOCIATED とか ALLOCATED じゃダメなのか? 普通の変数の場合はどうしようもないよな。 >>795 >>>794 ?? >ASSOCIATED とか ALLOCATED じゃダメなのか? 配列やらポインタ使えってこと? >普通の変数の場合はどうしようもないよな。 やはりそうなのかね?値がない場合をやって見たら、0.00000って表示されたのには吹いた >>796 変数について何か勘違いしてないか??? ただどうしてもというなら、F2003ならスカラーのALLOCTABLEというのがあるので それを使えばいい。 >>797 多分何か勘違いしてるかも。 俺の意識では、変数という箱に計算された数値データが格納されるってイメージなんだよなぁ。 まったくの初心者なのですが質問失礼します f77形式で書かれたプログラムをf90形式に変換した所plplotという描画用プログラムがエラーだらけで動きません 具体的には、「関数plwid に対する定義されてない参照です」のようなメッセージがいっぱいでてきます どうしたらよいのか教えていただけませんか?お願いします >>791 すみません補足します OSはLinux beanでコンパイラはgfortranです >>799 もとのプログラムはf77で正常にコンパイルできてるの? gfortranでそのままいけるやろ Fortran未だに使ってる人いますか? やっぱり昔に構築しちゃった遺産をそのまま使う方ばかりですか? 天文学の計算で有効数字が16桁以上で計算したいものが あり、C/C++では桁数の関係で微妙なので、Fortran の4倍長精度を使って計算しています。 64ビットあるいは80ビットでなくて128ビット で計算できるのが有りがたいです。 >>803 なるほどご丁寧にありがとうございます そういった分野があるんだと勉強になりました >>803 補足します。 NASAが太陽・月・冥王星を含む惑星の位置を計算 するための基礎データを発表しているのですが、 そのデータがたとえば 0.149597870691000015+09 という有効数字18桁で当れられて います。 この一定間隔で与えられたデータを数値積分して 位置を計算する必要があります。 C++などのlong doubleでは、有効数字が16桁程度 なので、fortranの4倍長kind(16)を指定すると、 三角関数も4倍精度で計算でき、安心できるわけです。 ソフトウェアに興味なくて、ほとんどプログラムやったことない学生が、 専門分野の研究に必要になってから勉強を始めて、曲りなりに必要なプログラム 書けるようになるのが早いのはやっぱFortranだな。 余計なことを覚えなくていいし、行列の添え字とかが(1から始まる、カラムメジャー等)、 教科書・文献などの数学の常識に近い点が良いらしい。 式とプログラムで表記が同じである必要は全くないが、 ある程度は形式を保っていないと焦点がボケてダメなようだ。 ソフトウェアの板でいうと叱られるかもしれないが、 時間かけるならプログラム言語の勉強するより専門分野の勉強する方がいい。 maxvalを使って上から2番めに大きいものなど抽出したりできませんよね? 挑発されてるようで不快だが 配列に同じ値がないか、重複を排除した2番目に大きい値 (例えば配列a=(/1, 2, 5, 3, 5/)なら3)を返してほしいなら maxval(a, mask = a < maxval(a))でいい 配列を降順に並べた時の2番目の値(上の例なら5)を返してほしいなら maxlocで最初の最大値の位置を特定して、それを除外した配列のmaxvalをとる >>808 ありがとうございます。書き方悪かったですすいません・・ 今のプログラムがスマートに書るようになりそうで大変助かりました もしかすると、3番目とかなら b=maxval(a, mask = a < maxval(a)) !b=2番目に大きい c=maxval(a,mask=a<b) !c=3番目に大きい で良いでしょうか、試してみます a(i,j) b(j,k)という変数があって、 maxval(a(i,j+5:j+10)) - b(j,k) という計算をしたいのですが、結果がおかしくなります。 もしかするとmaxvalを使って四則演算するときは配列が同じものを使用しないといけないのでしょうか 次のようなプログラムを試しに走らせたところ、 ファイルの作成には成功するのですがファイルの読み込みでセグメントエラーが出ます。 原因が分かりません、教えてもらえないでしょうか。windows7, 64bit, gfortran を使用しています。 program fileIO implicit none integer i, j, k open(17,file='mydata.dat') write (17,*) 100, 200, 300 write (17,*) 400 write (17,*) 500, 600 close(17) ! 同じファイルを今度は読み込み用にオープンする open(18,file='mydata.dat', status='old') read (18,*) i, j, k print *, i, j, k read (18,*) i print *, i read (18,*) i, j print *, i, j close(18) end program fileIO >>813 エラー内容書いて linux のgfortran 、intel fortranなら普通にいけるが 次のエラーが出ました。 Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error: #0 ffffffffffffffff #1 ffffffffffffffff #2 ffffffffffffffff #3 ffffffffffffffff #4 ffffffffffffffff #5 ffffffffffffffff #6 ffffffffffffffff #7 ffffffffffffffff #8 ffffffffffffffff #9 ffffffffffffffff #10 ffffffffffffffff #11 ffffffffffffffff #12 ffffffffffffffff #13 ffffffffffffffff #14 ffffffffffffffff #15 ffffffffffffffff #16 ffffffffffffffff #17 ffffffffffffffff #18 ffffffffffffffff Window7,64bitのgfortranを使ってコンパイル実行して みましたが, 100 200 300 400 500 600 と出力されて無事終了しました。 ちなみに,gfortran64のVersionは4.9.2です。 ソフトのバージョンは gfortra,64bit, ver 5.1.0 のおそらく最新版です。 とりあえず別のコンパイラを試してみます。 FTN95 でうまくいきました やっぱり gfortran ってクソだわ ファイルggshoki.f90に、800成分の配列を返すサブルーチンggshokiを書き、他のファイルと一緒にコンパイルしたところ、 ggshoki.f90:1:20: subroutine ggshoki(Z(800)) 1 Error: Unexpected junk in formal argument list at (1) というエラーが出てしまいました。 どう直せばいいのでしょうか。アドバイスお願いします。 上げてしまいました、すみません。 OS:Windows8(64bit) コンパイラ:gfortran バージョン:fortran90 です。 >>819 subroutineの内部で宣言するなら書き方が違うはず 引数で宣言するより別の行で宣言した方が見やすくない? とりあえず自分はこんな感じで書く https://ideone.com/HCzWB6 >>822 リンク先のように書いたらうまくいきました。 自分のプログラムの他の部分も確認したところ、配列の書き方が全て間違っていました(配列A(1:N)をA(N)などと書いていました)。 ありがとうございました。 教えてください。 サブルーチンに渡された配列引数2つが同一かどうか (値が同じかどうかではなくて、値を格納するアドレスが同じかどうか) を確認するすべはありますでしょうか…? ポインタとか使えるのでしょうかね?よく分かっていません。 自己解決してしまいました… program test implicit none real(8)::a,b a=1 b=2 call sub(a,b) call sub(a,a) end program subroutine sub(a,b) real(8),target::a,b real(8),pointer::p1,p2 write(*,*) '=====',a,b p1=>a p2=>b if(p1.eq.p2)then write(*,*) 'identical' else write(*,*) 'independent' end if end subroutine いや、すみません間違ってました。値を比較してるだけみたいです。 どうしたらいいんだ。 (日記みたいになってしまってですまんです) 最近出た『FORTRANハンドブック』 買ったほうがいいかな? ifortです。associated(pointer,target) で行けそうなんですが、 targetの変数にopitional属性がついていて… ><という状況です gfortranならlocでアドレス取得できるの確認した なんか独自拡張みたいだが、ifortにもあるよね module内のcontainsのところに書いているfunctionをincというフォルダのsample.f90にまるごと持って行き、 include 'incl/sample.f90' としたのですが、moduleに書いていた時はは参照できていた変数が 定義されていない参照 となりコンパイルできません。 functionまるごともっていくとかやったらいけないものなのでしょうか? >>831 内部関数を別ファイルにするなら注意が必要 includeを書く位置によるけどエラーになるなら外部関数扱いになっている 内部関数はメインプログラムの変数も参照できる 外部関数の扱いになるとメインの変数、他の内部関数、サブルーチンが参照できなくなる だから、使っている変数や関数、サブルーチンを確かめないとエラーになる 解決方法はいろいろあるけど変数だけなら引数で渡せば使える containsの後にinclude文を書けば内部関数扱いになるからそのまま使える ちなみに、includeは廃止予定とかじゃないけど非推奨らしい http://www.nag-j.co.jp/fortran/tips/tips_AboutInclude.html http://www.mri-jma.go.jp/Project/mrinpd/coderule.html >>832 詳しく教えて頂いてありがとうございます。試してみようと思います。 includeってもう非推奨なんですね。代替はmoduleで分割とかできるのかな include以外のやり方も考えてみます >>825 Fortranって規約では、引数に番地の重なる変数や配列を送っちゃ駄目じゃなかったけ? まぁ大抵のコンパイラは無警告で通すけど。 昔だとWATFORなんかが文句を言ってきた。今だとNAGあたりがなんか言いそう。 >>830 loc 相当を規格内でやるには c_loc と transfer で代替するはず。 Fotranで作成された古いプログラムをVBAに移しているのですが 符号がついていないためIF文の解釈がよくわかりません。 どなたか教えて頂けないでしょうか。 IF(J-K) 2,3,2 3 B(J)=1./Y C(J)=1. GOTO 4 2 B(J)=-A(K,J)/Y C(J)=A(J,K) 4 A(K,J)=0. >>835 IF (L) a,b,c X:負 go to a X:0 go to b X:正 go to c >>836 ご回答ありがとうございました。 助かりましたm(_ _)m >>835 >>836 いわゆる計算型go toはもう忘れられいるのですね。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる