FORTRAN �W
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2006/11/12(日) 17:13:35FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。
・FORTRAN関連情報
お約束だが、まずは自分で調べよう
http://www.google.co.jp/
x86で動作するFortranコンパイラ
http://www.nminoru.jp/~nminoru/programming/x86-fortran.html
The Fortran Company
http://www.fortran.com/
Polyhedron Software
http://www.polyhedron.co.uk/
Google Directory - Fortran
http://directory.google.com/Top/Computers/Programming/Languages/Fortran/
・前スレ
FORTRAN III
http://pc8.2ch.net/test/read.cgi/tech/1104724162/
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0855デフォルトの名無しさん
2011/01/08(土) 02:07:10DOUBLE PRECISION はFORTRAN66時代に導入された倍精度の正規の宣言法でこちらが本家。
REAL*8などはFORTRAN77時代に使われるようになった記法。
またKINDはFortran90で導入された記法。
あと4倍精度はFORTRAN77までは規格外の拡張。90以降でも必須ではない。
よってKINDの一つとして存在していてもかまわないが、quadruple precisionのような
新たな命令を期待するのはお門違いとなる。
なお現在ではKIND方式で統一するのがよろしいとされている。
とにかく50年分くらい時代をごっちゃにしている。古文・漢文のノリで66、77を学ぶが吉。
AUTODBLの件だが、歴史的にFORTRANではINTEGERと単精度REALのワード長が一致することが
(暗黙に?)要求されてきたので、上品ならざる振る舞いをしていることになっていることを指摘しておきたい。
私個人は好みの問題で使うも使わぬも勝手だと思うが、しばらく前に
gfortranだったかg95だかのデフォールトREALが倍精度8byteで、デフォールトINTEGERの
4バイトと一致していなかったために、外人のおっさんたちがBizzare野郎呼ばわりで糞味噌に罵しっていたw
非常識かつ破廉恥な猥褻物陳列レベルの振る舞いとさみなされたようだ。
たしかにCOMMON、EQUIVALENCE、ホレリス使いまくりの昔のプログラムには不都合極まりない。
0856デフォルトの名無しさん
2011/01/10(月) 17:25:06レスどうもです。つか、詳しすぎる・・・
そういえば、real(8)やreal*8の数字の意味(精度なのかバイト数なのかそれ以外か)が
きちんと規格で統一されていないという話を聞いたことが。
たとえばcomplexだと、普通はcomplex*8で単精度だけど実装によっては倍精度の場合もあるとか。
その辺の解決策としてkindが導入されたんだと思うんだけど、苦肉の策というか
あんまスマートじゃないような・・・。つーか、complex(kind(0d0)) とか長ったらしいよw
0857デフォルトの名無しさん
2011/01/17(月) 19:56:03基本的なことは知ってますが、あまり深くは使ってないレベルの人間です。
これ一冊ありゃOKっていうのが理想ですが・・・
Amazon.comで以下を見つけました。お持ちの方いますか?
Fortran 95/2003 Explained, Michael Metcalf (2004年)
http://www.amazon.com/Explained-Numerical-Mathematics-Scientific-Computation/dp/0198526938
Fortran 95/2003 for Scientists & Engineers, Stephen Chapman (2007年)
http://www.amazon.com/Fortran-95-2003-Scientists-Engineers/dp/0073191574/ref=pd_sim_b_3
The Fortran 2003 Handbook, Jeanne C. Adams (2008年)
http://www.amazon.com/Fortran-2003-Handbook-Complete-Procedures/dp/1846283787
0858デフォルトの名無しさん
2011/01/19(水) 00:48:47まあ概ねアマゾンの書評と同じような感想ですが
「Fortran 95/2003 Explained」
言語リファレンス代わりに使うならこれが最適。
さすがMichael Metcalfさん。その代わりサンプルコードが少なめ。
「Fortran 95/2003 for Scientists & Engineers」
サンプルコードや演習問題が多いので具体的な使い方が理解しやすい。
ただしFortran 2003で追加された機能については解説が少なめ。
ISO_C_BINDING や IEEE_* の説明が見当たらないんですが・・・
分厚いのでリファレンス代わりにするのは少々不向き。
「The Fortran 2003 Handbook」は読んだことないのでわかりません。
「〜 Explained」はF2008に対応した新しい版がもうすぐ出る・・・と思ってたら
いつの間にか発売日が7月になってるのね・・・
0859857
2011/01/19(水) 12:37:23ありがとうございます。結局全部買ってしまいそうだ・・・w
>「〜 Explained」はF2008に対応した新しい版
これですね。
Modern Fortran Explained
http://www.amazon.com/Explained-Numerical-Mathematics-Scientific-Computation/dp/0199601410
というか今知ったのですが、Michael MetcalfはISOの規格メンバーなんですね。
こりゃ信頼性という意味でこの上ないですね。
0860デフォルトの名無しさん
2011/01/20(木) 08:59:54Google Booksなんかでわりと中身がのぞけたりする。
Guide to Fortran 2003 Programming, Walter S. Brainerd が割と入門者むけの古典的な教科書に近いと思う。
OOPとか2003固有の部分はそれほど多くなく、Fortran全般に書かれている。
Introduction to Programming with Fortran: with coverage of Fortran 90, 95, 2003 and 77,
Ian Chivers & Jane Sleightholme
これは、Fortran77あたりから拡張していった本なのですっきりしていない。あんま良くない。
Fortran 95/2003 for Scientists & Engineers, Stephen Chapman (2007年)
もってない。が上のIan Chiversの本と同じく、温泉旅館式の肥大化本だと思う。
Fortran 95/2003 Explained, Michael Metcalf (2004年)
1冊買うならこれかな?大概この本しか見ない。
ただ、入門者向きではない。>>858の書いているようにリファレンスに近い。
しかし、肝となる部分をがっちり書いているので便利。
The Fortran 2003 Handbook, Jeanne C. Adams (2008年)
FortranXX Explained よりもさらに言語規格書よりに書かれている。
これも入門者向きでない。辞書っぽい感じ。
0862デフォルトの名無しさん
2011/01/28(金) 22:24:290863デフォルトの名無しさん
2011/01/30(日) 10:16:200864デフォルトの名無しさん
2011/01/30(日) 12:05:300865デフォルトの名無しさん
2011/02/15(火) 13:15:27なんだろう
0866デフォルトの名無しさん
2011/02/16(水) 23:21:39COMMONは大域変数ではなく、自由に思いのままにガーベジコレクションのできる共有地だぜ!
0867デフォルトの名無しさん
2011/02/18(金) 15:02:30ifort -c -warn all test.f90
でコンパイルすると、Ver.10.1だとエラーが出ないが、Ver.11.1だと
test.f90(9): error #7137: Any procedure referenced in a PURE procedure, including one referenced via a defined operation or assignmnent, must be explicitly declared PURE. [PURE_FF]
xxx = pure_ff()
というエラーが出る。規格上は、(C,F77で書かれた)外部関数はpureにできない?
!test.f90
module A
interface
elemental real(8) function pure_ff()
end function
end interface
contains
pure real(8) function xxx ()
xxx = pure_ff()
xxx = pure_ff()
end function
end module
0868デフォルトの名無しさん
2011/05/02(月) 15:18:06.31ターミナルから
$ gfortran hoge.for
しました。それから$ ./a.outしてみましたが、
At line 22 of file hoge.f
Fortran runtime error: No such file or directory
22行目がおかしいってことみたいです。
本来であれば、ファイル名の入力を求められるらしいです。
しらべてみたら、.forって相当古いみたいですね。固定形式だとか。
もとはwindows用に書いたらしいのですが、OSやコンパイラの仕様に依存していたりするのでしょうか?
アドバイスよろしくお願いします。割り込みすいません。
0869デフォルトの名無しさん
2011/05/02(月) 23:44:21.50OS依存も、依存するようなコードの書き方をすれば依存する。
エラーメッセージの内容は理解できているかな?hoge.fの22行目は見てみた?
分からなければ、取り合えず22行目の前後数行をここにコピペしてみたらどうだろう。
0870デフォルトの名無しさん
2011/05/03(火) 12:07:16.39お言葉に甘え、hoge.fの19~26行目を張らせていただきます。
19 c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(8,file=' ')
23 write(7,'('' output file or devicename'')')
24 open(6,file=' ')
25 call input(ipro)
26 c
エラーに関しては、そんなファイルやディレクトリは無い!って怒ってるってことでいいんでしょうか。
取り合えず、cってのが昔のコメント行であること、openとwriteがファイル操作をしようとしてるってこと、7とか8とかが装置番号と呼ばれているってことは分かります。
0871デフォルトの名無しさん
2011/05/03(火) 15:37:42.14ファイル名の入力を求めるメッセージを、なぜ標準出力ではなくconに書き出しているのか?
標準出力として予約されている装置番号6番が、なぜファイルとしてopenされるのか?
なぜファイル名が' 'なのか?(自分で適宜書き換えろってことなのか?
それとも、file=' 'とすると、自動的にファイル名を尋ねてくれるコンパイラがあるのか?)
22、24行目のfile=' 'を自分で書き直す必要があると思う。
おそらく8番が入力データが入ったファイルで、6番が出力を書き出すファイルだろうから、適宜じぶんで書き直して。
自分なら念のため、装置番号の使われ方を調べるために"read.*8"とか"write.*6"がコード内で使われているところを検索する。
grep -ine"read.*8" ./*.for
それを頼りに、プログラムの挙動を追跡する。macでgrepって使えるのかな?
0872デフォルトの名無しさん
2011/05/03(火) 15:52:24.94>それとも、file=' 'とすると、自動的にファイル名を尋ねてくれるコンパイラがあるのか?
良く分かんないですけど多分そうだと思います。
人のPCで実行した.exeは、
マイクロソフトかな漢字変換 バージョン2.51
(C)Copyright Microsoft Corp. 1992-1993
input filename
File name missing or blank - please enter file name
UNIT 8?
ってでます。input filenameはhoge.fにありますよね。
>適宣自分で書き直して
とありますが、ファイル名だけを指定した場合、a.outのあるディレクトリにあるファイルとして読み込まれるのでしょうか?
ま、とにかくやってみます。
どうもありがとうございます!
0873デフォルトの名無しさん
2011/05/03(火) 16:13:07.68grepなるものは分かりませんが、とりあえずエディタで検索かけてみました。
現在、hoge.fはディスクトップ上にあり、コンパイル後のファイルa.outと読み込ませたいデータB1.txtもディスクトップ上にあります。
19c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(8,file='B1.txt')
23 write(7,'('' output file or devicename'')')
24 open(6,file='b1.out')
25 call input(ipro)
26c
に変更してみました。
結局のところ、
At line 22 of file fem3.f
Fortran runtime error: No such file or directory
とのことです。22行目から進みません。
ていうか、なぜ、input filenameってメッセージすら出ないのか。
お手上げです。
0874デフォルトの名無しさん
2011/05/03(火) 17:33:23.22試しにソースコードの拡張子.fを.f90にしてコンパイルしてみて。
0875デフォルトの名無しさん
2011/05/03(火) 17:36:12.73これは、conっていうファイルに書き込まれていないかな?
デスクトップにconっていうファイルができていると思う。
0876デフォルトの名無しさん
2011/05/03(火) 17:56:02.74.f90にしてコンパイルしてみました。結局エラーメッセージの嵐。
.fではcとすると、c言語でいう//になるみたいですが、.f90ではならないみたいです。fixcomという.fを.f90に変換するプログラムを見つけたので変換し、コンパイルしてみましたが、結果は変わらず。
At line 22 of file hoge.f90
Fortran runtime error: No such file or directory
ちなみに、変換後のコードは、ぱっと見、cを!に置き換えているだけみたいでした。
>>875
おっしゃるとおり、conってファイルができてました。
装置番号を6にかえてみましたが、ターミナルには出力されず、conってファイルができます。
0877デフォルトの名無しさん
2011/05/04(水) 10:14:28.68プログラムが極端に長くないならここに貼り付けちゃった方が早いかもよ
1行目から30行目ぐらいまででもいいけど
長文貼っても誰も怒らないしね
多分、22行目以外もバグってそう
他のモジュール(変数とかを書いておく所)を使ってグローバル変数があると面倒かな
0878デフォルトの名無しさん
2011/05/04(水) 12:20:54.73お言葉に甘えて、、、って全部で870行ぐらいあるので、、、
取り合えず、Cでいう、mainっぽいとこだけ張ります。必要があるようなら適宜。7~53行目です。
7 c main program
8 common/a/ ym1,ym2,pois1,pois2,thick,ntj,nte,npar,nst,nbc,nlc,
9 1 eqstx(5),eqsty(5),eqsts(5),mdir(5),mkind(5),jemk(600),
10 2 mtj(600,3),road(500),lc(500),mbc(500),p(800),lank(800),
11 3 disp(800),ddisp(800),foce(800),focem(800),ifail(600)
12 common/b/ ex(600),ey(600),ez(600),gxy(600),th(600),eqst(600),
13 1 sigmax(600),sigmay(600),sigmal(600),sigmat(600),
14 2 sigmaz(600),tauxy(600),tault(600),fract(600),
15 3 dela(3,3),com(3,6),elk(6,6)
16 common/c/ syk1(15000),index1(800)
17 common/d/ index2(800)
18c************************************************************************
19c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(18,file=' ')
23 write(7,'('' output file or devicename'')')
24 open(6,file=' ')
25 call input(ipro)
0879デフォルトの名無しさん
2011/05/04(水) 12:22:57.3226c
27 do 1000 inc=1,nst
28c
29 write(7,50) inc
30 50 format(' **** No.',i4,' *****'/)
31c
32 call alloc
33 call clasfy
34 write(7,'('' calsyk running'')')
35 call calsyk
36c
37 do 40 i=1,2*ntj
38 foce(i)=focem(i)/nst
39 40 continue
40c
41 write(7,'('' solver running '')')
42 call solver
43 write(7,'('' result running '')')
44 call result
45 write(7,'(/)')
46c
47 if (ipro.eq.0) goto 1000
48 call output
49 1000 continue
50 if (ipro.eq.0) call output
51c
52 stop
53 end
0880デフォルトの名無しさん
2011/05/05(木) 13:47:34.37すでに、871さんが書かれているとおりです。
Fortranでは、C言語の標準入力は5番、標準出力は6番に割り当てられています。
openする必要はありません。これらは、'*'で書くことができます。
したがって、878,979の
write(7,
を、すべて、
write(*,
にすれば、画面に表示されます。
22行目、24行目のopen文でfile名を指定していないのはよくないので、
きちんとファイル名を指定して下さい。24行目についてはさらに番号を
6以外に変更して下さい。
その他、気になる点は:
47行目:この様な目的でgoto文を使用しないほうがいいでしょう。
goto文は、よっぽどのことがない限り使用しないでください。
文番号の使用も止めましょう。doループの終わりはend do文としましょう。
common文はなるべく使わないようにしましょう。
基本的に、日本でFortranと言えば、Fortran2003なので(JISでそのように
決まっている)、FORTRAN77ではなく、新しめの文法で書くのがいいと思います。
環境がmacのようですが、unix系のOSの場合には、特にファイルをopen文で
開く必要はありません。デフォルトで、例えば7番の場合はfort.7、
8番の場合はfort.8から読み書きしようとしています(コンパイラによりますが)。
プログラム実行前に、シェルスクリプトで、シンボリックリンクを使って
'fort.番号'のファイルを作っておけば問題ありません。
0881デフォルトの名無しさん
2011/05/05(木) 18:20:02.26どうもありがとうございます。
やってみます。
やはりこれはFortran77なのですね。平成元年に作成されたようです。
Fortranについて調べても、しょっぱなから違っているので途方に暮れていました。
0882デフォルトの名無しさん
2011/05/05(木) 18:40:30.370883デフォルトの名無しさん
2011/05/05(木) 18:59:28.16軽く説明すると、
「このソフトつかって課題やってきてね。つhoge.exe」
「(macなんですけど、、、)コードあります?」
「つhoge.f」
「gfortran hoge.fっと。コンパイルできたー。実行できないorz えーっと?Fortranなんて分からん、、、」
と、まあ、こんな感じで。
Fortranを調べてみても、明らかに違うしで困ったいた訳です。
個人的な結論は
コード自体がめっちゃ古い。
しかも環境依存くさい。
です。
みなさん、どうもありがとうございます。
0884デフォルトの名無しさん
2011/05/05(木) 19:40:21.87無事に動きました。
どうもありがとうございます。
やったあ!やったよぉ!
0885デフォルトの名無しさん
2011/05/10(火) 04:05:10.32あーあぁあ〜はじめての〜ちゅ〜
君とちゅ〜I need you for my love〜
0886デフォルトの名無しさん
2011/05/10(火) 15:33:36.570887デフォルトの名無しさん
2011/05/21(土) 09:53:33.09(人類の歴史として語り継がれるべき事実)
【 利用基準(年間20ミリシーベルト)の責任者一覧 】
原子力災害対策本部本部長:菅直人(最高責任者)
原子力安全委員会委員長:斑目春樹(実質的な判断の最高責任者)
文部科学大臣:高木義明(当該通知に関する最高責任者)
文部科学省生涯学習政策局長:板東久美子(当該通知に関する責任者)
文部科学省初等中等教育局長:山中伸一(当該通知に関する責任者)
文部科学省科学技術・学術政策局長:合田隆史(当該通知に関する責任者)
文部科学省スポーツ・青少年局長:布村幸彦(当該通知に関する責任者)
※ 後で大問題になるから、このリストはみんなで共有しよう。全世界に拡散しよう。
0888デフォルトの名無しさん
2011/07/22(金) 17:06:33.14微分方程式をルンゲクッタを使って解こうと考えているのですが,
通常はt→∞方向に解くところを,今回t→0方向に解きたいのです.
刻み幅h等の符号を反転しただけでは,正しい答えがでません.
ざっくり書いたので,分からないところがあればコメントをお願いします.
0889デフォルトの名無しさん
2011/07/23(土) 01:33:06.53とると本質的に発散するよ。
物理方程式は特に。時間に関して情報量が
単調減少(非増大)なので、
遡る、という事が無理ぽな事多々。
チェックしる
0890デフォルトの名無しさん
2011/07/23(土) 07:42:53.84http://www.ffte.jp/
上記のサイトにあるFFTのサブルーチンをMPIとOpenMPのHybridで使おうと思っています。
tarをダウンロードして、解凍し、"ffte-4.1\mpi\tests\" にあるMakefileの
FFLAGS = -O3 -fomit-frame-pointer -I../.. を
FFLAGS = -O3 -fomit-frame-pointer -I../.. -openmp -openmp-report2
と書き換えてコンパイルをしました。
実行するとセグメンテーション違反と表示されてうまくいきません
-openmp -openmp-report2 を付け加えなければうまくいきます。
どうすれ、いいか教えていただけないでしょうか
よろしくお願いします。
0891デフォルトの名無しさん
2011/07/23(土) 11:43:50.25レスありがとうございます.
そうですか...別の方向からアプローチしてみます.
0892デフォルトの名無しさん
2011/07/28(木) 14:58:20.150893デフォルトの名無しさん
2011/08/06(土) 16:33:15.49\(ユーザー名)/FORTRANに保存し端末(コマンドライン端末)を使用し
そのプログラムへの入力と実行結果を生成する
ファイルのコマンドを忘れてしまいました
どなたかわかる方はいらっしゃいますでしょうか
0894デフォルトの名無しさん
2011/08/08(月) 13:33:55.540895デフォルトの名無しさん
2011/08/10(水) 00:07:13.86日本語でおk
0896デフォルトの名無しさん
2011/08/14(日) 17:20:24.31でっかい配列定義するとエラる
0897デフォルトの名無しさん
2011/08/14(日) 17:23:40.72コンパイラの問題だから、一般解はない。マニュアルを見るしかない。
0898デフォルトの名無しさん
2011/08/15(月) 07:44:26.69ulimit
ためすか、何か環境変数いじれば動くことがある、アル
0899デフォルトの名無しさん
2011/08/16(火) 19:32:51.42allocatable属性を指定した変数を宣言したプログラム単位の終わりまで来たら
自動的にdeallocateされるものですか?
0900デフォルトの名無しさん
2011/08/16(火) 20:37:08.77F90からF95へのマイナー改訂で不便が無くなった記憶がある・・・
POINTERの時は解放されなかったと思う。
間違ってたらゴメンwww謝罪はしても賠償はしない
0901デフォルトの名無しさん
2011/08/16(火) 20:51:47.70さらにいくつか質問させてください
リスト構造を作ってなんらかの処理をするsubroutineを作り、
そのsubroutineをdoループで何度も呼び出すようなプログラムを考えています
allocateした変数が自動的に解放されないと仮定すると、
�@subroutine呼び出すたびに使用しているメモリが増えて最終的にプログラムがストップすることになりますか?
�Aもしそうならsubroutineの最後でリスト構造を辿りながら手動でdeallocateしないといけないことになりますか?
�B「allocatable属性を指定した変数を宣言したプログラム単位の終わりまで来たら自動的にdeallocateされるのかどうか」
を確かめる簡単な方法はありませんか?
よろしくお願いします。
0902デフォルトの名無しさん
2011/08/16(火) 22:03:42.771.そういうことになる。いわゆる memory leak と呼ばれる状況。
2.そうなる。
3.1回試すだけなら、でっかい配列を allocate して、システムモニターやpsコマンドなどでメモリー使用量の変化を
見てみればいい。
たぶん、最近の Fortran コンパイラは皆 F95 だから、ローカルに確保された ALLOCATABLE は自動解放されると思う。
0903デフォルトの名無しさん
2011/08/16(火) 22:06:17.75二回目は ALLOCATE できないと思う。
そういう場合配列の STATUS が不定なので、動作が処理系に依存しそうで断言できないが。
0904デフォルトの名無しさん
2011/08/16(火) 22:38:39.47使っているコンパイラはintelです
確認してみます。
ありがとうございました
0905デフォルトの名無しさん
2011/08/18(木) 23:57:28.90の( )の中の数字ってなんですか?
初心者用参考書だと使ってなくて解説ないし
難しい参考書だと当たり前のように使ってるし
fortranって両極端ですね
0906デフォルトの名無しさん
2011/08/19(金) 00:23:14.760907904
2011/08/19(金) 10:43:45.35pointer属性だとdeallocateされないみたいです
0908デフォルトの名無しさん
2011/08/19(金) 11:50:36.72Fortran95の動作だとそうなると思います。
0909デフォルトの名無しさん
2011/11/15(火) 01:30:19.44モジュールのバージョンが違うとかで下記のエラーメッセージが出てきます。
Fatal Error: Parse error when checking module version for file 'functions.mod'
これってどう解決すればいいですか?
0910デフォルトの名無しさん
2011/11/15(火) 02:02:21.330911デフォルトの名無しさん
2011/11/19(土) 16:31:55.930912デフォルトの名無しさん
2011/11/19(土) 18:35:25.27http://hibari.2ch.net/test/read.cgi/tech/1261676778/213
http://hibari.2ch.net/test/read.cgi/tech/1272358443/83
http://hibari.2ch.net/test/read.cgi/tech/1321350331/22
http://hibari.2ch.net/test/read.cgi/tech/1318935200/82
http://hibari.2ch.net/test/read.cgi/tech/1290415962/444
http://hibari.2ch.net/test/read.cgi/tech/1314133332/444
http://hibari.2ch.net/test/read.cgi/tech/1315141054/25
http://hibari.2ch.net/test/read.cgi/tech/1321282584/4
http://hibari.2ch.net/test/read.cgi/tech/1156332916/186
http://hibari.2ch.net/test/read.cgi/tech/1177431417/279
http://hibari.2ch.net/test/read.cgi/tech/1295493964/744
http://hibari.2ch.net/test/read.cgi/tech/1300000513/237
http://hibari.2ch.net/test/read.cgi/tech/1163319215/911
0913デフォルトの名無しさん
2011/12/31(土) 11:50:50.12そのリストの内容を表示したり、リストを消したりするsubroutineを作るには
どうすればいいですか?
単方向リストを取り扱っています
subroutineにリストのrootを渡して
そのリストの内容を表示したり、リストを消したりしたいと思っています
しかし、リスト構造のtypeをあらかじめ知っていないと
subroutine側で仮引数を宣言できません
そうなるとtype毎にsubroutineを作らなければいけなくなります
そこで質問なのですが
任意のリスト構造に対して
そのリストの内容を表示したり、リストを消したりするsubroutineを作るには
どうすればいいですか?
0914デフォルトの名無しさん
2011/12/31(土) 12:33:24.540915デフォルトの名無しさん
2011/12/31(土) 12:44:27.73Fortran90がええのです・・・
とりあえず90じゃできないってことで理解します
お早い回答ありがとうございました
0916デフォルトの名無しさん
2011/12/31(土) 17:40:16.11どうしてもというなら、こういう論文がある。
A generic linked list implementation in Fortran 95
http://dl.acm.org/citation.cfm?id=1667141&CFID=75955509&CFTOKEN=91048213
内容はよく覚えていないが、確かTRANSFER関数で、ポインターを整数かなんかにいれて誤魔化してたと思う。
Fortran90/95はALGOL的になって、静的型チェックを厳しくしたから、任意構造を扱うには邪道をゆくしか無いと思う。
というわけでEQUIVALENCE的な意味でTRANSFER関数を使うしか無いんだと思う。
0917デフォルトの名無しさん
2012/01/02(月) 18:59:30.43ポインタ配列ってのはあるみたいなんですけど
これは部分配列を作るのに使うみたいです
単純にポインタを整数で添字付けて
一度にたくさん用意したいだけなんですが
0918デフォルトの名無しさん
2012/01/02(月) 21:31:26.40出来ない。
ポインターを要素に持つ構造体を定義して、その構造体の配列を作るのが定石。
0919デフォルトの名無しさん
2012/01/02(月) 22:09:01.22さらに質問したいのですが、
サブルーチンにポインタを渡す際に、直接渡すとエラーが出てしまいます
一時的に作ったポインタで、渡したいポインタの指している実体を指して
その一時的に作ったポインタをサブルーチンに渡すと上手く行きます。
要するに、下のコメントアウトしてるのだと上手く行くけれど
コメントアウトしていないものだとglibc detected とかいうエラーが出ます。
これはなんででしょうか?
implicit none
type(particle),pointer :: dumwork
type(particle),pointer :: tmpwork,aaa
! aaa=>dumwork
! call PrintParticleList(aaa,6)
call PrintParticleList(dumwork,6)
ソースファイルを以下のアップローダーに一週間ほど上げて起きますので
どなたかよろしくお願いします。
pmod.f90 の92行目と93行目です。
ttp://www1.axfc.net/uploader/Sc/so/306203
0920デフォルトの名無しさん
2012/01/02(月) 22:51:02.65まだよく分かってないのですが
どうにも別のところに原因があって、エラーが出てるようです
0921デフォルトの名無しさん
2012/01/02(月) 23:00:47.79コンパイルは出来たぞ。Intel ifort 12.0.5.221
互換性チェックでもf95規格違反は見当たらない。
実行時エラーが問題なら、簡単なメインプログラムも頼む。
0922921
2012/01/02(月) 23:04:41.860923デフォルトの名無しさん
2012/01/02(月) 23:29:25.71直接渡すのと、別のポインタを使って間接的に渡すのことで違いが出ます。
なんでかは分かりません。
現在、以下の作業をしています。
2次元の粒子の座標を10個用意する
それを単方向リストにする subroutine AddParticleList
リストを表示する subroutine PrintParticleList
リストを解放する subroutine FreeParticleList
これらを10回繰り返します
二つのparticle typeのポインタを用意して
type(particle),pointer :: proot, pwork
prootをallocateしました。
上に書いた3つのサブルーチンにポインタを渡す際に
pwork=>prootととして、pworkを渡した時と
prootを直接渡した時で異なる3つの結果がでます
0924デフォルトの名無しさん
2012/01/02(月) 23:40:42.13�@一回目は上手くいくが、二回目はリストが解放されず、三回目で止まる
�Aうまくいく
�B十回全てで、リストは表示されるが、解放はされない
Add、Print、Freeに対するworkとrootの組み合わせをまとめると
(A, P, F)=
�@(w, w, w)、(r , w, w)
�A(w, w, r )、(r , w, r )
�B(w, r , r )、(r , r , w)、(r , r , r)
です
ソースファイルは以下のURLです
どなたかよろしくお願いします
ttp://www1.axfc.net/uploader/Sc/so/306237
パスはfortranです
コンパイルするのは source comp です。
問題の箇所はtmod.f90の36行目あたりです。
0925デフォルトの名無しさん
2012/01/03(火) 00:44:19.78組み合わせというのがいまいちよく分からんのだが、
subroutine PrintParticleList(dumwork,filenum) で引数 dumwork が書き換えられて、リストの最後まで行ったまま返されるので、
解放しようにもできないように見える。
subroutine AddParticleList(dumwork,dumi,dumrr) でのように一旦テンポラリに入れないと駄目なのではないか?
あと、module tmod で、 np が real(dp),parameter :: np=10 と実数になってるが INTEGER の間違いじゃないか?
まぁ動くが規格からは外れている。
0926デフォルトの名無しさん
2012/01/03(火) 01:30:34.90ポインタをサブルーチンに渡して、
サブルーチンの中で指してる実体が変わると
サブルーチンを出たあとでも変わったまま
という理解でいいんでしょうか
組み合わせというのはsubroutineに渡す引数の組み合わせのことで
例えば
call AddParticleList(pwork, tmpnum, tmprr )
call PrintParticleList(proot, 6)
call FreeParticleList(proot)
と書いた時は
(A, P ,F)=(w, r , r )で
結果は�Bの
十回全てで、リストは表示されるが、解放はされない
となる。
というつもりです。
また、指摘された通り
subroutine PrintParticleList(dumwork,filenum)
でdumworkをtmpworkに入れるように書き換えて見ましたが
引数の組み合わせによっては>>924に書いた�@と�Aの
どちらかの結果になります。
0927デフォルトの名無しさん
2012/01/03(火) 02:02:18.49そうFORTRANは参照渡し。F2003なら値渡しにもできるが・・(ポインタはできないかな)。
組み合わせを変えたときに、最後のdeallocateの名前も変えるとか(サブルーチンで尻までポインタが移動しているため)、
きっちり整合していないからエラーが出るのでは?見た感じ問題なく動いているぞよ。内容を問わずに見た目だけだがwww
サブルーチンごとに、引数のポインターが変更されては困るものと、変更されないと困るものが混じっている。
その辺で混乱しているのでは?
例(w,w,w)の時
pwork => proot
do i=1,np
tmpnum=i
tmprr(1:2)=rr(1:2,i)
call AddParticleList(pwork,tmpnum,tmprr)
end do
! pwork=>proot
call PrintParticleList(pwork,6)
! pwork=>proot
call FreeParticleList(pwork)
! deallocate(proot,stat=i)
deallocate(pwork,stat=i)
0928デフォルトの名無しさん
2012/01/03(火) 04:51:51.85解決できました!
ありがとうございます
0929デフォルトの名無しさん
2012/01/03(火) 13:41:00.19メモリがかつかつと言うのなら仕方ないけど。
0930デフォルトの名無しさん
2012/02/19(日) 02:02:25.680931デフォルトの名無しさん
2012/03/01(木) 07:57:57.88知ってる人がいるかもと思い,書きこませていただきます。
Fortran の後継言語として SUN が開発していた Fortress って,
今どうなっているのでしょうか?
ググっても2008年3月31日現在の仕様書(Ver.1.0) より新しい情報が
見つかりません。
開発中止?
0932デフォルトの名無しさん
2012/03/01(木) 16:11:28.68ここは確認した? ttp://projectfortress.java.net/
0933デフォルトの名無しさん
2012/03/01(木) 17:55:53.39見たのは多分初めてです。ありがとうございました。
# それにしても,英単語をそのまま言語名にされると,
うまく検索できないですね。" Fortran " みたいに
造語にしてくれると検索しやすいのに‥‥ σ(-_-;)
0934933
2012/03/01(木) 18:05:23.12Fortress (programming language) ページからリンクが張られていましたね。
きっと,見たんだけど,よく見てなかったというパターンです。
お騒がせして,すみませんでした。
0935デフォルトの名無しさん
2012/03/01(木) 18:30:12.25有用度の高そうな情報を重点的に探すとかするとうまくいく(こともある)。
0936デフォルトの名無しさん
2012/03/01(木) 22:20:28.28Fortress は、IBM,SUN,CRAYがそれぞれ米政府の次世代並列言語として
開発していたものの一つで、SUNはコンペに負けた。
X10とかChapelとかが競っていたような。これらもどうなったのかよく知らん。
UPC(Cの系統だが)とCAF(これはF2008に規格として入った)は地道に進んでいる
コンペに負けた頃に大々的に公開されてニュースになった。
SUNがコンペに負けた時点でもう開発中止に近いのでは。
SUN自体もオラクルに買収されたし。
Fortranの後継などと言われるが、それは(コンペ用の?)煽り文句で
JAVAの上にテスト実装されている状態では物好き言語マニア以外触らんだろう。
GuySteeleJr.も外の世界ではカリスマかもしれんが、Fortranの世界では
せいぜいイマイチだったHPFの規格をつくった人、くらいのイメージだし。
0937933
2012/03/02(金) 08:48:59.25なるほど,そうすればいいのですね (^ ^)
>>936
詳しい情報,ありがとうございます。
昨日,Amazon で見つけたんですが,去年の8月に
”Fortress (Programming Language) ”という洋書が出版されていました。
もしかして巻き返しを図っているんでしょうか (・_・)?
0938デフォルトの名無しさん
2012/03/03(土) 10:40:15.770939デフォルトの名無しさん
2012/03/03(土) 11:03:36.44その本だけど、wikipediaとかをプリントしただけの本みたいよ。
なんかしらんけど、最近wikipediaとかネット情報丸コピーの100~200ページの妙に値段の高いオンデマンド出版本が山のように出ている。
詐欺なのか何なのか知らんがw
0940デフォルトの名無しさん
2012/03/03(土) 12:10:42.33ていうか、その本、「(Programming Language)」ってウィキペディアの記事名まんまじゃねぇかw
あと Fortress は日本語の本が俺の知ってる限りで 1 冊出てる。一応それなりの内容。
0941デフォルトの名無しさん
2012/03/03(土) 13:36:41.17電子出版はせずサンプル立ち読みもさせないし値段が妙に高いから、プリント+バインドサービスとも思われぬ。
表紙絵を見ればとりあえず区別がつく。
Germain Adriaan 編集
Brev Publishing 出版
ぐぐっても情報でない。
しかし、アマゾンが結構在庫を持っている所を見ると、こういうインチキ本を作って、機械的に在庫を買う
アマゾンとか大手小売に売りつける手口は、新世代詐欺のビジネススキームとしてありかもしれないw
ソフトバン○とかが始めそうw
0942933
2012/03/03(土) 17:59:25.10重要な情報,ありがとうございました。
昨日,Amazonで注文したのですが,今,慌ててキャンセルしました。
言われてみれば確かに,表紙には
High Quarity Content by WIKIPEDIA articles!
と書いてあるし,裏表紙にも
Please note that the content of this book primarily consists of
articles available from Wikipedia or other free sources online.
と書いてありました。まったく大損するところでした。
自分のメディア・リテラシーの低さを自覚しました‥‥。
ともあれ,アドバイスして下さり,本当にありがとうございました!
0943デフォルトの名無しさん
2012/03/06(火) 20:11:36.890944デフォルトの名無しさん
2012/03/06(火) 22:28:46.610945デフォルトの名無しさん
2012/03/06(火) 22:48:57.51富士通だったかがHPFをMPIに変換するトランスレータをフリーで供給していた記憶がある。
もしかしたらLinuxだったかもしれない。
あとPGIのFortranCompilerの古いヴァージョンはHPFに対応していた。今のもしているかも。
0947デフォルトの名無しさん
2012/03/08(木) 00:08:02.12f(x) = x^2+1
f(y) = sin(x)
の積分をするにはどのようにプログラムすればいいでしょうか?
1, 変数を変換して積分 x-y = r
2, そのまま積分
どちらでやればいいでしょうか?
もしかしてどちらでもできますか?
0948デフォルトの名無しさん
2012/03/14(水) 12:35:28.450949デフォルトの名無しさん
2012/03/14(水) 22:46:09.43社会保険庁の年金システムもFORTRAN。
何年か前にANAがシステム入れ替えで発券機トラブルを起こしたけど、元の問題なく動いていたのはFORTRANだお。
0950デフォルトの名無しさん
2012/03/14(水) 23:09:55.880951デフォルトの名無しさん
2012/03/14(水) 23:32:06.210952デフォルトの名無しさん
2012/03/28(水) 23:46:43.47並び替えの後、エラトステネスのふるいの要領で求める値を出すプログラムを作ろうとしたところで頭がごちゃごちゃになって挫折しました
初心者が、求める結果の出せるプログラムを書くにはやはり参考書やネットの入門編を1から読んでFORTRANの体系のようなものから学ぶしかないのでしょうか。
自分の今まで作ったものとは全く異なる文章をプログラミングの上級者がプログラムにどうやって変換しているのか、そのプロセスというかコツをもしよければ教えてください。
息抜きがてらの愚痴ですみませんがお願いします
0953営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 00:55:31.20> FORTRANの体系のようなものから学ぶしかないのでしょうか。
全然何もしてないなら、それはやるべきだが。
アルゴリズムの勉強と、それをFORTRANで書く勉強とは別だからねー
前者ができていれば、極端な話、後者は泥縄でもいいんだけど
0954952
2012/03/29(木) 01:36:02.22やはりアルゴリズムの勉強がやや不足してたようで、
そこをはっきりさせてから書くようにしたら何とか出来そうです。
プログラミングに触れるのはFORTRANが初めてでアルゴリズムを勉強する、という意識がそもそもありませんでした…
(ifやdo文を覚えるだけで後は皆さん自力で何とかしてるものとorz
初歩の初歩ですが自分の躓いている所がはっきりしました、大変助かりました
レス数が950を超えています。1000を超えると書き込みができなくなります。