07/11/30 09:55:26
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)
スレリンク(tech板)
くだすれFORTRAN(超初心者用)その2
スレリンク(tech板)
●関連スレ
FORTRAN Ⅳ
スレリンク(tech板)
2:デフォルトの名無しさん
07/11/30 09:58:45
2
3:デフォルトの名無しさん
07/12/01 00:21:42
>>1 乙!
4:デフォルトの名無しさん
07/12/01 22:19:53
Q 任意の文字列C、整数Nを入力して、これらを連結してファイル名に使いたい。
A 内部ファイルを使う。
PROGRAM F90test
IMPLICIT NONE
CHARACTER(20) :: str1 = "test", str2
INTEGER :: i
DO i=1,3
WRITE(str2,'(A,I3.3,".dat")') trim(str1), i
WRITE(*,'(A)') trim(str2)
END DO
END PROGRAM F90test
PROGRAM F77TEST
CHARACTER*10 C
CHARACTER*20 STR
INTEGER N, I
READ(*,*) C
READ(*,*) N
I = INDEX(C,' ') - 1
IF (I .LE. 0) I = LEN(C)
WRITE(STR, '(A, I3.3, ''.dat'')') C(1:I), N
WRITE(*,*) STR
END
出力例
test001.dat
test002.dat
test003.dat
5:デフォルトの名無しさん
07/12/02 23:07:06
前スレ>>994
はどうなったの?
6:デフォルトの名無しさん
07/12/03 01:07:59
>>5
回答としては前スレでもレスがあったけど
open(10, file='hoge.dat', access='direct', form='unformatted' ,recl=2)
とするとレコード長とか余計なデータが付く場合があるので
処理系依存の機能で
open(10, file='hoge.dat', form='binary')
などとするとか、F2003先取りのコンパイラで
open(10, file='hoge.dat', access='stream')
などの方法があるけど
あとは質問者の環境ややりたいことにもよるんで
これ以上はにんともかんとも
7:デフォルトの名無しさん
07/12/06 01:18:27
FORTRAN77(F77)とFortran90/95(F90)は大きく異なるので質問する時にF77なのかF90なのか
もしくはそれ以外なのかを明記した方が、より適切な回答が得られるかもしれません。
どちらなのか分からない場合以下にF77とF90の特徴をまとめたので参考にして下さい。
F77
固定形式:1~5桁は文番号、6桁は継続行の印、7~72桁と桁ごとに書く内容が決まっています。
非構造化言語:昔ながらのGO TO文を多用したプログラムが書けます。
拡張子:.f .for
F90
自由形式:132桁以内なら、どの桁に何を書くと言うような制限はありません。
構造化言語:DO WHILE文などが追加されGO TO文を使わないプログラムが書けます。
拡張子:.f90
何となく作ってみた。丁寧な言葉使いは調子が狂ってよくねえ
8:デフォルトの名無しさん
07/12/06 13:04:21
Fortranの記述の中で
左にCをたくさん書くと思うのですが
これは何を表しているのでしょうか?
また、何の頭文字なのでしょうか?
9:デフォルトの名無しさん
07/12/06 13:26:47
>>8
行頭のCはFORTRAN77でコメント入れるときに使う。
10:デフォルトの名無しさん
07/12/06 13:44:14
>>9
回答ありがとうございます。
初心者質問で申し訳ないのですが
もう少しおつきあい願えないでしょうか?
まず、Σの計算をしたい場合、やはり
do 10 I=1,10
z=z+f[i]
10 continue
というような記述が必要なのですよね?
これをもっと簡単な記述にすることは出来ないのでしょうか?
また合計する範囲が1~∞の場合どうやって記述すれば良いのでしょうか?
11:デフォルトの名無しさん
07/12/06 15:16:29
バーナードきょうは やがて わがいをえたように いいました。
「ふっふっ。 きみのような がくせいに ふさわしい がっこうを わしは おもいだしたぞ!。
それは こうぎょうがっこう という がっこうじゃ。 きみの しりたいことは なんでも おしえてくれる!」
12:10
07/12/06 18:33:14
どうなんでしょうか?
お願い致します。
13:デフォルトの名無しさん
07/12/06 18:43:35
i = 1
10 z = z + f(i)
i = i + 1
goto 10
14:デフォルトの名無しさん
07/12/06 18:59:49
>>10
>Σの計算をしたい場合
ここら辺は手続き型言語であれば多少の差はあれ同じ様な記述になる。
まあ、Fortran90以降で
z = sum(f(1:10))
とかやる手も有るがな。
>合計する範囲が1~∞の場合どうやって記述すれば良いのでしょうか?
そもそもコンピュータは離散的な値を有限個しか取り扱えないので
「1~∞」をそのまま記述するのは無理。
代わりに問題に対して「十分大きな値」を使ったりしてコンピュータで
処理できるような形にして計算させる。
>>13
^C
15:デフォルトの名無しさん
07/12/07 20:22:46
Fortran77を初めて使うのですが、複素数型で試したところこのようなエラーが出ました。
改善策がわかりませんので、ご教示ください
URLリンク(www.pen2so.com)
16:デフォルトの名無しさん
07/12/07 20:37:35
↑
ブラクラ危険
17:デフォルトの名無しさん
07/12/07 20:47:48
URLリンク(www.uploda.org)
え?あれ?ちゃんとうpできてませんでしたか?すいませんでした。
どこにあげればよいのかよくわからなくて変なところにあげてしまいました。
18:デフォルトの名無しさん
07/12/08 03:21:15
>>15
> Missing ( from complex number
複素数は実部と虚部を括弧で囲んで表す。
(0.0, 1.0)
19:デフォルトの名無しさん
07/12/10 02:00:46
初めまして。
Fortranというよりは数値計算の分野の質問かも知れませんが、
もし経験者がいらっしゃいましたらご教授いただきたく存じます。
ほぼスレ違いですが失礼します。
現在Fortran90で6段5次ルンゲ・クッタ-フェールベルグ公式による常微分方程式計算をしているのですが、
誤差が小さいとされるこの公式がを自前でプログラム作成しましたところ、
それまでに使用していた4段4次ルンゲ・クッタ法より遥かに大きな誤差が出てしまいました。
係数の誤りは何度も確認しましたがそのようには思えません。
他に考えられる原因はありますでしょうか。
20:デフォルトの名無しさん
07/12/11 01:45:03
>>19
ものすごく荒く言えば、滑らかな曲線だと微係数を増やしたほうがよりよく予測できるが、
カクッと曲がったりフラフラ振動する曲線の場合あんまり予測のための点数を増やすと
かえってとんでもないところを予測したりする。
(ステップ幅のスケールで見ての話だが)
この手の話は、微分方程式の数値解法の本に載っている。
漏れは非専門なので詳しくは本で調べてね。
嘘だったらゴメンw
21:デフォルトの名無しさん
07/12/11 15:01:10
与えられたデータ1の1列目と3列目の範囲内にデータ2の1列目の値が、
データ1の2列目と4列目の範囲内にデータ2の2列目の値が当てはまれば、
データ1の5列目と6列目の値をwriteしたいのですが上手く表示されません。
わかるかたいましたら教えていただけますか?
**** main program ****
program ex1
implicit real*8(a-h,o-z)
dimension x1(1000000),x2(1000000),y1(1000000),y2(1000000)
dimension z1(1000000),z2(1000000),a1(1000000),a2(1000000)
open(10,file='jegm.txt')
open(11,file='ans.dat')
open(12,file='iti.dat')
read(10,602)(x1(i),y1(i),x2(i),y2(i),z1(i),z2(i),i=1,85509)
602 format(4f16.4,i8,i1)
read(5,*)a1(k),a2(k)
do 30 i=1,144
if(a1(k).gt.x1(i).and.a1(k).le.x2(i).and.a2(k).gt.y1(i).and.a2(k).
1le.y2(i)) write(11,*) z1(i),z2(i)
30 continue
stop
end
**** データ1 ****
139.9875 38.6917 140.0000 38.7000 5 3
139.9875 38.6833 140.0000 38.6917 5 3
139.9875 38.6750 140.0000 38.6833 5 3
**** データ2 ****
138.4337 38.2584
138.4398 38.0745
138.3226 37.9976
22:デフォルトの名無しさん
07/12/11 16:44:03
Fortranで一行に入る文字数制限が決まっていると聞いたのですが
正確には何文字なのでしょうか?
また、もし入りきらなかった場合にはどうやって二行に分けて書けば良いのでしょうか?
23:デフォルトの名無しさん
07/12/11 21:20:14
>>21
実数変数に 'i' 編集記述子でデータを読み込んだり、
キーボード(5)からa1, a2を1回だけ読み込んだりしてるが
こういうことか?
program ex1
implicit none
real*8 x1, x2, y1, y2, z1, z2, a1, a2
open(10, file='jegm.txt', status='old')
open(11, file='ans.dat', status='replace')
open(12, file='iti.dat', status='old')
10 continue
read(10, *, END=99) x1, y1, x2, y2, z1, z2
read(12, *, END=99) a1, a2
if ((a1 .gt. x1) .and. (a1 .le. x2)
& .and. (a2 .gt. y1) .and. (a2 .le. y2)) write(11,*) z1, z2
goto 10
99 continue
close(10)
close(11)
close(12)
stop
end
>>22
自由形式の場合は1行132文字まで。行末に & を付ければ次の行に継続できる。
固定形式は 7~73桁までの66文字。足りないときは次の行の6桁目に 0 か
空白以外の文字を書けばその行に続きを書ける。
これくらいの情報はほとんどの入門書の最初の方に載っているので
自分で調べられるようにならないといかん。
24:kidding
07/12/11 23:07:34
>>23
>固定形式は 7~73桁
俺が持ってる教科書には
>文は第7桁目~第72桁目に書き
とあるのですがこの教科書ミスってるんですかね?
頭が悪くてどうなのか自分では調べられません(><)
25:デフォルトの名無しさん
07/12/12 06:59:54
72だな。
なぜそんな制限があるのかはこれを見れば分かる。
URLリンク(www.eecis.udel.edu)
URLリンク(www.eecis.udel.edu)
26:デフォルトの名無しさん
07/12/12 11:24:29
23番さん
ありがとうございます。
a1,a2はキーボードじゃなくてファイルからでした。
そして以下のようなプログラムでも走りません。
**** main program ****
program ex1
implicit real*8(a-h,o-z)
dimension x1(1000000),x2(1000000),y1(1000000),y2(1000000)
dimension z1(1000000),z2(1000000),a1(1000000),a2(1000000)
open(10,file='jegm.txt')
open(11,file='ans.dat')
open(12,file='iti.dat')
read(10,602)(x1(i),y1(i),x2(i),y2(i),z1(i),z2(i),i=1,85509)
602 format(4f16.4,i8,i1)
read(12,603)a1(k),a2(k)
603 format(f16.4,f8.4)
do 30 i=1,144
if(a1(k).gt.x1(i).and.a1(k).le.x2(i).and.a2(k).gt.y1(i).and.a2(k).
1le.y2(i)) write(11,*) z1(i),z2(i)
30 continue
stop
end
**** データ1 ****
139.9875 38.6917 140.0000 38.7000 5 3
139.9875 38.6833 140.0000 38.6917 5 3
**** データ2 ****
138.4337 38.2584
138.4398 38.0745
わかるかたいましたらよろしくお願いします。
27:デフォルトの名無しさん
07/12/12 11:31:41
>>26
もう少し、具体的に「かくかくしかじかになるはずが、これこれこうこうと成って、おかしいです」と
いった具合に聞かないと、答えるほうも面倒で考える気がしない。
情報をもっと付加してくれ。
28:デフォルトの名無しさん
07/12/12 11:43:05
26番さん
そのとうりですね。
データ2から読み込んだa1(k)の値がx1(i)とx2(i)の間に、
a2(k)の値がy1(i)とy2(i)の間にふたつともくるときz1(i)とz2(i)を表示しなさい。
という風なプログラムを作りたいんです。
しかしオープンしたファイルには何も表示されません。
できていればk個のz1(i)とz2(i)が表示されているはずです。
よろしくお願い致します。
29:デフォルトの名無しさん
07/12/12 21:43:25
implicit real*8をやめたほうがいいとよく見るので、
既存ソースを書き換え中なのですが、
教えてください。
以下のソースだと、メインソースでintfuncが宣言されていないと
コンパイル時にエラーが出ますが、
自分で作成した関数の定義はどのように宣言すればいいのでしょう?
30:デフォルトの名無しさん
07/12/12 21:44:00
program test
implicit none
integer:: n
real(8):: x = 2.5d0, y = 3.3d0
n = intfunc(x, y)
print *, n
stop
end
integer function intfunc(x, y)
implicit none
real(8), intent(in):: x
real(8), intent(in):: y
intfunc = int(x) + int(y)
end function
サンプルなので、特に意味ある処理をしてあるわけじゃないですが、、。
31:デフォルトの名無しさん
07/12/12 22:19:26
>>28
read(10,602)(x1(i),y1(i),x2(i),y2(i),z1(i),z2(i),i=1,85509)
602 format(4f16.4,i8,i1)
これを見る限り、z1,z2は整数で無ければならないのに倍精度実数で読んでいるところか?
他にも間違いが大量にあって、なんとも言いがたいが、本体が動いているならそれか?
>>29
INTERFACEを書くか、FUNCTIONをMODULEに入れて、USEすればおk
32:デフォルトの名無しさん
07/12/13 01:12:00
31番さん
ありがとうございます。
ってことは、iのdoループをなくしてkのdoループのみにしたらよいという事ですか?
そして、formatを書かずに読み込ませれば良いでしょうかね?
ちなみに26番の「do 30 i=1,144 」は間違いで、iではなくkです。
33:デフォルトの名無しさん
07/12/13 01:38:20
>>32
いやちがうw
kに何の値も与えられていないのは無論問題だし、フォーマットとデータが対応していないのも問題だが
(単に2chに貼った時にスペースが削られたのかもしれないが),
z1,z2を整数にしないとフォーマット文と整合しないのでおかしな値が入ると思う。と言いたかった。
ついでにiのdoLoopの内か外にkのDoLoopも必要だろう。
34:デフォルトの名無しさん
07/12/13 05:01:53
>>30
integer, external :: intfunc
をメインプログラムにいれるとおk
35:デフォルトの名無しさん
07/12/13 11:45:45
33番さん
ありがとうございます。
今のところ作っているプログラムはこんな感じなんですが
しっかり読み込めているか確認のためにa1(k)とa2(k)をwriteしようとしましたが、
a1(1)とa(2)までしかwriteされません。
doループの場所を変えれば全て表示されます。
↓↓↓
36:デフォルトの名無しさん
07/12/13 11:46:32
*** main program ***
program ex1
implicit real*8(a-h,o-z)
dimension x1(1000000),x2(1000000),y1(1000000),y2(1000000)
dimension z1(1000000),z2(1000000),a1(1000000),a2(1000000)
open(10,file='jegm.txt')
open(11,file='ans.dat')
open(12,file='iti.dat')
open(13,file='ans1.dat')
open(14,file='ans2.dat')
do 30 k=1,144
read(12,*) a1(k),a2(k)
write(13,606) a1(k),a2(k)
606 format(2f16.4)
do 40 i=1,85509
read(10,*) x1(i),y1(i),x2(i),y2(i),z1(i),z2(i)
write(14,605) z1(i),z2(i)
605 format(f4.1,5x,f3.1)
if(a1(k).gt.x1(i).and.a1(k).le.x2(i).and.a2(k).gt.y1(i).and.a2(k).
1le.y2(i)) write(11,610) z1(i),z2(i)
610 format(f4.1,5x,f3.1)
40 continue
30 continue
stop
end
37:29、30
07/12/14 00:33:31
>>34
externalが必要だったんですか。
家に環境がないので明日試してみます。
どうもありがとうございました。
38:デフォルトの名無しさん
07/12/14 02:00:05
>>37
EXTERNALでもいいが、F90式で行くなら、INTERFACEを書くほうがベター。
39:デフォルトの名無しさん
07/12/14 03:56:51
>>38
たしかにそうですね。手抜きを教えてすみませんでした
>>37
パソコンがあればgfortranでちょっとしたテストコードは
試せますよ。Linux,Win始めいろんなOS用のバイナリがある
URLリンク(gcc.gnu.org)
40:デフォルトの名無しさん
07/12/15 00:25:07
>>36
外側のループを1回終えた時点でjegm.txtのデータを全て読み終えてる。
41:デフォルトの名無しさん
07/12/19 00:15:39
最近、一番町とかをアメリカ人の男連れがぶらぶらしているが、
米軍の演習でもやっているのか?
42:デフォルトの名無しさん
07/12/19 00:16:28
誤爆したwwwwすまんこwww
ABEND
43:デフォルトの名無しさん
07/12/19 00:36:56
FORTRANの入門書はどこの本屋で売っていますか?w
44:デフォルトの名無しさん
07/12/19 12:38:42
>>43
紀伊国屋や丸善クラスの大型書店 または アマゾン
45:デフォルトの名無しさん
07/12/20 11:20:29
人からもらった下のようなプログラムなのですが
program main
implicit none
integer :: dim, hoge
hoge = 1
dim = 1
call sub(hoge, dim)
end program main
subroutine sub(hoge, dim)
implicit none
integer :: dim
integer :: hoge(dim)
print *,"hoge = ", hoge(1)
end subroutine
Intel fortran コンパイラ 10.0でデフォルト設定でコンパイルすると下記のビルドエラーが出ます.
Error: If the actual argument is scalar, the corresponding dummy argument shall be scalar unless the actual argument is an element of an array that is not an assumed-shape or pointer array, or a substring of such an element. [HOGE]
プログラム作成者はCompaq Visual Fortran 6.6でコンパイルして動いたそうなのですが・・・
コンパイルオプション等の指定で解決できると思うのですが,
何かアドバイス頂けませんでしょうか?
46:デフォルトの名無しさん
07/12/20 12:31:45
>>45
Fortran90的にはエラーだから素直に書き直せw
FORTRAN77的にはありだが。
47:デフォルトの名無しさん
07/12/20 12:38:35
>>46
もともとは77で書いてあったコードなんですよね.
説明用のサンプルをいつものくせで90で書いてしまいました.
コードの量が膨大なものでできればそのまま使いたいんですよー
ちなみに再コンパイルするのはCore2Duo用の最適化のためです.
どうか方法教えて頂けませんでしょうか?
48:デフォルトの名無しさん
07/12/21 00:58:27
>>47
元コードがF77なら話は通る。
>>45でCVFで通ったと書いてあったが、通るわけないので勘違いだと思っていた。
解決法は簡単で、サブルーチンと呼び出しルーチンを別ファイルにして、分割コンパイルされるように
すればいい。多分、元は別ファイルになっていたのをまとめたりしているのでは?
F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
無いのでエラーは出ないはず。
同一ファイル内に書いてあると、コンパイラが親切にも引数の整合性チェックなどをしてくれる。
49:48
07/12/21 01:00:28
ちょっと訂正
>F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
>無いのでエラーは出ないはず。
F77なら"分割コンパイル時や”リンク時の引数チェックは何もしないので
50:デフォルトの名無しさん
07/12/21 09:48:30
F77を使用しています。
データから、2列目の数値のみをメインプログラムに入力したいんですが、
方法がわかりません。
例えば、下のようなデータの2列目のみを取り出すにはどうすればいいんでしょうか。
1.0 2.0 3.0
4.0 5.0 6.0
do 10 i=1,2
read(1,*) x(i),y(i),z(i)
10 continue
とするのは1列目も取り出してるので反則なんです…
read(1,*) (y((i+1)/3),i=2,5,3)
としてもうまくいきません。
超初歩かもしれませんがほんとわからないです。アドバイスお願いします。
51:デフォルトの名無しさん
07/12/21 13:59:25
read(1,*)
read(1,*) x(i),y(i),z(i)
52:デフォルトの名無しさん
07/12/21 14:12:39
>>48
ありがとうございました.
解決しました.
53:デフォルトの名無しさん
07/12/21 16:55:41
一般的かわからないけど自分はダミー変数作って読み飛ばしてる
do i = 1, 2
read(1,*) xdum, y(i), zdum
enddo
>>51
それって1「行」目を読み飛ばしてるのでは・・
54:50
07/12/21 21:29:14
レスありがとうございます。
>>51
「列」方向(縦方向)のデータを取り出す方法なんですが…
>>53
ダミー…考えはしたんですが、いいのかどうか迷ってました。
書いていただいて自信が持てました。ありがとうございます。
55:デフォルトの名無しさん
07/12/21 22:23:51
F77を使用しています。
出力した値をエクセルに貼り付けたいと思っているのですが、出力方法がコマンドプロンプトに表示する方法しかわからず困っています。
出力した値をメモ帳などに保存する方法はないのでしょうか?
56:デフォルトの名無しさん
07/12/21 22:40:56
>>55
WRITE文の出力先をファイルに変更する。
手っ取り早くやりたかったら、リダイレクトで
hoge.exe > output.txt
57:デフォルトの名無しさん
07/12/21 23:01:08
>>56
できました!ありがとうございます。
58:デフォルトの名無しさん
07/12/27 19:38:50
常微分方程式y´+y=e^(-x)を
関数 Function f(x,y)
F=
Return
end
であらわすにはどうしたらいいのでしょうか? 77です。
59:デフォルトの名無しさん
07/12/27 20:11:36
このスレだとPGIコンパイラ使ってる人いそうなのでお聞きします。
ホームを表す~ですが、Intelコンパイラだと解釈してくれますが、PGIだとしてくれませんよね。
何気に不便なのですが、何か方法ないでしょうか?
60:デフォルトの名無しさん
07/12/27 21:33:45
getenv('HOME')
61:59
07/12/27 23:25:35
>>60
HOMEには当然ホームの値が入ってますよ(これはコンパイラに拠らないと思いますが)
62:デフォルトの名無しさん
08/01/03 02:58:13
fortran90の練習で自分でライブラリを作ってみようとしているのですが、
interface文での総称指定がどうもうまく行きません。
あまりmodule文やinterface文がよくわかっていないのが原因と思っていろいろ調べてるのですが
行き詰ってしまい、ここで質問させてください。
以下のソースだと、コンパイルする段階で
main.o: In function `MAIN__':
main.o(.text+0x11a): undefined reference to `check_vector_int_'
main.o(.text+0x12c): undefined reference to `check_vector_double_'
main.o(.data+0xa0): undefined reference to `check_vector_double_'
main.o(.data+0xa4): undefined reference to `check_vector_int_'
という表示が出てa.outは出てきません
63:デフォルトの名無しさん
08/01/03 03:02:14
module inte !interfaceで総称指定
interface check_vector
subroutine check_vector_int(x)
integer,intent(IN) :: x(:)
end subroutine check_vector_int
subroutine check_vector_double(x)
double precision,intent(IN) :: x(:)
end subroutine check_vector_double
end interface check_vector
end module inte
module check !引数ベクトルにintとdoubleがある
private
public :: check_vector_int,check_vector_double
contains
subroutine check_vector_int(x)
integer,intent(IN) :: x(:)
write(*,*) (x(i),i=1,size(x))
end subroutine check_vector_int
subroutine check_vector_double(x)
double precision,intent(IN) :: x(:)
integer :: i
write(*,*) (x(i),i=1,size(x))
end subroutine check_vector_double
end module check
program main !主プログラム
use inte
use check
integer :: a(5)
double precision :: b(5)
data a/1,2,3,4,5/b/5.0d0,4.0d0,3.0d0,2.0d0,1.0d0/
call check_vector(a); call check_vector(b)
end program main
64:デフォルトの名無しさん
08/01/03 03:09:07
うわ 2chだとタブ文字使えないんですね
ごめんなさい
65:デフォルトの名無しさん
08/01/03 13:13:51
全角空白を使うのがお約束みたいね
コピペしたあと再編集が必要なのがめんどいけど
66:デフォルトの名無しさん
08/01/03 13:25:10
>>62
module inteの部分を
module inte
use check
implicit none
interface check_vector
module procedure check_vector_int, check_vector_double
end interface check_vector
end module inte
として module check よりも後ろに持って行く。
(checkモジュールができるよりも後にコンパイルされるようにする)
または、module checkの先頭部分を以下の様にする。
module check
implicit none
private
public :: check_vector
interface check_vector
module procedure check_vector_int, check_vector_double
end interface check_vector
contains
・・・
67:62
08/01/03 16:05:13
>66
ありがとうございます! どちらの方法でもできました!
管理のしやすさなら、後者の方法で書きためて行った方がよさそうですね。
分野毎にmoduleで分けて、1module1ファイルで。
これで大体わかったので、色々と役に立ちそうなものを書いていけます。
ありがとうございました。
68:デフォルトの名無しさん
08/01/07 11:55:29
プログラムを実行させてみると
Segmentation fault (core dumped)
というエラーが出て止まってしまいます。
そこで原因を探ろうと
write(*,*)'OK'
見たいなのを打ち込んでいたら、不思議なことにプログラムが最後まで進みました。
変数の値を変更することもしないはずなのになぜおこるのでしょうか?
そしてSegmentation faultが出る原因はどのようにしたらよいのでしょうか?
69:デフォルトの名無しさん
08/01/07 19:49:08
不正なメモリにアクセスしにいったときに関係ないデバッグ文で動くようになったりするよ。
宣言文、引数の整合性など、幅広く探すこと。
落ちた場所だけ見ても解決しないことが多いよ。
70:68
08/01/08 01:05:36
な、なるほど。ありがとうございました。色々洗ってみることにします。
71:デフォルトの名無しさん
08/01/11 14:04:11
教えてください。
FORTRANからC(C++)の関数を呼ぼうとしていますが、文字列の受け渡しがうまくいきません。
開発環境はVisualFortranです。
FORTRAN側のソースコード
---
subroutine hogefor(str1,str2,isw)
!DEC$ ATTRIBUTES C :: hogec
character str1*(*)
!DEC$ ATTRIBUTES VALUE :: str1
character str2*(*)
!DEC$ ATTRIBUTES REFERENCE :: str2
!DEC$ ATTRIBUTES REFERENCE :: isw
call hogec(str1,str2,isw)
return
end
-----------------
C側のソースコード
void hogec(char str1[],char str2[],int isw)
{
...
}
-----------------
URLリンク(xlsoft.com)
このサイトを参考にしましたが、
第1引数と第2引数の文字列の取得ができません。
なにがまちがっているのでしょう。。。
すみません。だれかおしえてください。
72:デフォルトの名無しさん
08/01/11 16:31:13
すみません。まちがえました。
>!DEC$ ATTRIBUTES VALUE :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
です。
だれかおしえてください。。。。
73:デフォルトの名無しさん
08/01/11 19:02:34
INTERFACE文を書いて、仮引数を定義しましょう
74:デフォルトの名無しさん
08/01/12 13:46:06
program main
interface
subroutine hogec(str1, str2, isw)
!DEC$ ATTRIBUTES C, ALIAS: '_hogec' :: hogec
character(len=*) :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
character(len=*) :: str2
!DEC$ ATTRIBUTES REFERENCE :: str2
integer :: isw
end subroutine hogec
end interface
character(len=10) :: s1, s2
s1 = "Hello"C
s2 = "World!"C
call hogec(s1, s2, 123)
end program main
75:デフォルトの名無しさん
08/01/17 14:30:53
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1=0.12
76:デフォルトの名無しさん
08/01/17 14:32:18
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1= 0.12
のように=と数値の間に半角スペースが一つ入ってしまいます。これをなくすことはできないんでしょうか?
途中で投稿してしまいました。すみません。
77:デフォルトの名無しさん
08/01/18 00:58:57
>>76
FORMATを使え!
78:76
08/01/19 00:29:52
な、なるほど。ありがとうございます。色々みてみます。
79:デフォルトの名無しさん
08/01/20 20:22:50
出力しようとすると、ハンドルされてない例外が発生しました。
ってでるんだけどどうすればいいでしょうか?
80:デフォルトの名無しさん
08/01/20 20:52:10
>>79
エラーメッセージを貼ってくれ。
81:デフォルトの名無しさん
08/01/20 20:56:09
>>80
コンパイルにエラーはないんですが、出力しようとすると、新しい画面がでてきて、
ハンドル・・・とでるんです。
82:デフォルトの名無しさん
08/01/20 21:47:51
その「新しい画面」の内容を何とか工夫して伝えないと
伝わらないぞ
83:デフォルトの名無しさん
08/01/20 22:09:44
>>81
それがランタイムエラーだっちゅーの。
エラーメッセージは省略せず一字一句表示された通り書け。
使ってるOSとコンパイラの種類もな。
84:デフォルトの名無しさん
08/01/22 07:41:38
開発環境 :Conpaq Visual Fortran 6
言語Ver :Fortran77+Fortran90(混在状態)
OS :Windows 2000
の上記の開発環境があります。
質問はプログラムを走らせたとき、途中の過程がどこまで行われたか知りたいと考えています。
上記のソフトでFortranを実行したときコマンドプロントが出るのですが、ここに計算課程を表示させたいです。
現在のプログラム内では結果の出力にWRITE文を使用し、OPEN文で出力装置を宣言させています。
私はOPEN文の出力装置の宣言をコマンドプロントに変えることで実行できると考えています。
しかし、出力装置の宣言にコマンドプロントを宣言する方法がわかりません、どなたかご教授お願いいたします。
ちなみに現在は以下のように使用しています。
:
OPEN (5,FIEL = 'OUTPUT.dat')
:
WIRTE (6,*) Func1, Func2,
:
どなたかお願いいたします。
85:デフォルトの名無しさん
08/01/22 11:38:50
>>84
すでに標準出力をデフォの6番に割る振っているのだから、この上5番までも割り振ることは出来ない。
ただ、UNIXとかだとerr出力を割り振ったりできるのでCVFで絶対出来ないとは言わない。
マニュアル読めば出来るかもしれない。
しかし、ここは素直にコピーを作って、それのWRITE(5 をWRITE(6,に置換すれ。
目的はそれで達成できる。
オリジナルをいじると元に戻せなくなるので注意w
86:デフォルトの名無しさん
08/01/23 14:48:20
>85氏
返答どうもありがとうございました。
指示通り、プログラムのコピーを作成し、マニュアルを探って検証した結果うまくいきました。
方法はすごく単純で、以下のように書き換えるだけでした。
:
OPEN (5,FIEL = 'OUTPUT.dat')
OPEN (6,FILE = 'CON')
:
WIRTE (6,*) Func1, Func2,
:
と書き加えたところ、コマンドプロントへ結果が出力されました。
ご教授ありがとうございます!
87:デフォルトの名無しさん
08/01/23 15:45:53
f77をしようしています。
2つの整数の約数と、最大公約数と最小公倍数を求めるという
プログラムを書いてもらえませんか?
88:デフォルトの名無しさん
08/01/23 18:40:48
>>87
最大公約数 最小公倍数 fortran でググレ
89:デフォルトの名無しさん
08/01/26 23:51:56
>>87
素直に宿題で出ました。困ってます
と書いたら、誰か書くかも。
90:デフォルトの名無しさん
08/01/27 00:00:34
宿題は自分でやれ
91:88
08/01/27 14:55:01
>>87
最大公約数 最小公倍数 fortran でググったのか?
検索結果の一番上に出てくるが。
92:デフォルトの名無しさん
08/01/28 17:49:50
自分も宿題なんですけど質問します
数値積分で、n個の台形の総和で近似する場合のプログラムなんですけど、
繰り返し文使いますよね?
DOからCONTINUEの間に、面積の総和をSWA、何番目かの台形の面積をSとして
SWA=SWA+S
って書き込みました
SWA=0.0みたいにSWAを初期化する言葉は必要ですか?
家のパソコンではプログラミングできないので教えてください
93:デフォルトの名無しさん
08/01/28 21:38:46
FORTRAN の仕様としては初期化は必要ないが、
中には 0 初期化してくれないコンパイラもあるので
初期化しておいた方が無難。
94:88
08/01/28 21:45:51
>>93
むしろ、subroutine 化したときの暗黙save属性の方が怖くない?
オレは A = A + B 型の処理があれば、
脊髄反射でA = 0d0 を加える癖にしている。
95:92
08/01/28 22:19:21
レスどうもです
初期化したほうが良さそうですね
失礼します
96:デフォルトの名無しさん
08/01/28 22:37:58
fortranのプログラムを書くソフトは何を使えばいいのでしょうか?
講義では秀丸をつかってたのですが有料で買えません。
代わりのソフトウェアは何をつかえばいいのでしょうか?
97:デフォルトの名無しさん
08/01/28 23:04:49
>>96
汎用フリーエディターなら、TeraPad
URLリンク(www5f.biglobe.ne.jp)
をよく聞くね。
CPad for Salford FTN77
URLリンク(www.vector.co.jp)
なんてどう?
98:デフォルトの名無しさん
08/01/28 23:30:49
>>93
FORTRANの規格では初期値は不定じゃなかったけ?
IBM育ちなので、方言なのかもしれんが。
おすえて。
99:デフォルトの名無しさん
08/01/29 07:53:37
>>97
ありがとうございました。
下のリンクのほうつかってみます。
100:デフォルトの名無しさん
08/01/29 07:57:34
fortran77をダウンロードしセットアップして再起動したのですが、
すべてのプログラムのsalford software というところには
デバッッカー(?)と説明文みたいなものだけでfortran77本体らしきものが
ありません。
何か問題があるのでしょうか?
101:デフォルトの名無しさん
08/01/29 12:55:24
>>100
Cpadを使え
102:デフォルトの名無しさん
08/01/29 15:59:59
本に載っていたコード何ですが文番号やらgotoがいっぱいついていてややこしいので
文番号などを使わない形に書き換えようとしています。
自分でやってみたのですが一部分からないところがあったのでみていただきたいと思います。
103:102
08/01/29 16:01:49
do 90 lz=lun,lup
do 80 lx=llf,lrg
略
if (j.le.0) goto 80
if (j.eq.i) goto 80
do 11 jj=1,10
if (je(i,jj).eq.j) then
jk=jj
goto 70
end if
11 continue
do 12 jj=1,10
if (je(i,jj).eq.0) then
略
goto 70
end if
12 continue
70 xj=x0(j)
略
104:102
08/01/29 16:02:19
if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then
if (i.gt.j) then
略
do 555 jj=1,10
if (je(j,jj).eq.i) then
j0=jj
goto 554
endif
555 continue
554 call actf(i,j,jk,as,ac,gap)
略
endif
else
85 en(i,jk)=0.d0
略
endif
80 continue
90 continue
105:102
08/01/29 16:10:06
以上が本のコードです。
条件文以外は削除しております。
doループの80,90やgoto80などは何とか分かったのですが
goto70や、goto554がどうなってるのかがさっぱりで・・・
申し訳ないですがアドバイスお願いします。
先ほどの投稿では書き忘れてましたが
最後の方にある文番号85に関しては無視していただいて結構です。
探して見たところどこにもgoto85はなかったので
本のコードにゴミが残っていたと思われます。
106:デフォルトの名無しさん
08/01/29 17:36:49
>>105
f90 を使っていいかどうかと、使用コンパイラーを書こう。
f77 では、cycle exit が(標準では)使えない。
107:105
08/01/29 17:57:47
失礼致しました。
一応はFortran77なのですが
コンパイラはg77なのでcycle,exitなどは使えたと思います。
108:デフォルトの名無しさん
08/01/29 18:44:49
85は放置、70はjeを探しているだけなので合併で大丈夫なはず、
554のexit はif構文に無関係
do lz=lun,lup
do lx=llf,lrg
略
if (j.le.0) cycle
if (j.eq.i) cycle
do jj=1,10
if (je(i,jj).eq.j) then
jk=jj
exit
end if
if (je(i,jj).eq.0) then
略
exit
end if
end do
xj=x0(j)
略
109:デフォルトの名無しさん
08/01/29 18:45:10
if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then
if (i.gt.j) then
略
do jj=1,10
if (je(j,jj).eq.i) then
j0=jj
exit
endif
end do
call actf(i,j,jk,as,ac,gap)
略
endif
else
85 en(i,jk)=0.d0
略
endif
end do
end do
110:デフォルトの名無しさん
08/01/30 11:06:40
>>108
11と12のdoループは、
je=jとje=0の両方が真になることがあれば,合併不可
常に、少なくとも一方は「10回全て偽」になれば、合併可
111:105
08/01/30 16:06:53
返事が遅くなって申し訳ないです。
みなさまレスありがとうございます。
11,12ループの所だけを省略せずに抜き出してみました。
do 11 jj=1,10
if (je(i,jj).eq.j) then
jk=jj
goto 70
end if
11 continue
do 12 jj=1,10
if (je(i,jj).eq.0) then
jk=jj
je(i,jj)=j
goto 70
end if
12 continue
70 xj=x0(j)
je=jとje=0の両方が真になるかどうかなんですが
これをみるかぎり、やってることは両方jk=jjを代入してるだけなんで
do jj=1,10
if (je(i,jj).eq.0) then
je(i,jj)=j
end if
if (je(i,jj).eq.j) then
jk=jj
exit
end if
end do
xj=x0(j)
にしてもいいのかな、と思ったのですが。どうでしょうか?
112:デフォルトの名無しさん
08/01/30 17:26:11
>>111
111のプログラムは間違い。
je(i,7)=j je(i,3)=0 それ以外は偽、のとき、
jkに何が入るべきか、考えてごらん。
je の取りうる値がわからないので、
この部分だけでは判断できない。
多分、合併はダメ。
113:デフォルトの名無しさん
08/02/02 18:24:44
すみません、fortranのプログラムで助けて欲しいのですが
open(50,file='test.txt')
do i=1,ii
read(30,4000)dummy3,(a(i,j),j=1,jj)
write(50,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)
pause
というプログラムの144F8.2について
144を変数として扱いたいのですがどのようにすればよいでしょうか・・・
line=144としたとき
format(A7,'line//F8.2')
format(A7,'line'//F8.2)
などではダメでした。整数だと144F8.2の状態だと問題なく走ります。
お助け下さい
114:デフォルトの名無しさん
08/02/02 18:36:34
すみません、もっと簡略化して以下でお願いします
do i=1,ii
read(40,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)
115:デフォルトの名無しさん
08/02/02 19:11:48
>>113
>>4 内部ファイルを参考にする。
Intel 系コンパイラなら、書式に<>が使える。
number = 144
4000 format(A7,<number>F8.2)
116:デフォルトの名無しさん
08/02/02 22:06:06
俺の方法は
character(len=50):: fmt
integer:: line
write(fmt,*) "A7,", line, "F8.2"
do i = 1, ii
read(40,fmt) dummy3,(a(i,j),j=1,jj)
enddo
てやると思う。
数字書き出すときに1桁、2桁、3桁それぞれ別書式にする場合に使ってる。
117:デフォルトの名無しさん
08/02/03 01:45:46
しかし、FORMAT文の動的変更は200レス毎に1回くらいは必ず来るなw
これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。
漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。
他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw
改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。
文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw
118:デフォルトの名無しさん
08/02/03 13:36:12
良くも悪くも数値計算用言語ですから、
数値を上手く取り扱う方法に目がいって
その辺の所は教科書書く人も勉強する人も興味ない。
119:デフォルトの名無しさん
08/02/03 14:25:45
>>115
>>116
無事にいけました☆本当にありがとうございました!
120:デフォルトの名無しさん
08/02/03 18:55:37
>>118
読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。
まぁ、
1.フォーマット文が文字列や文字変数で与えられる。
2.内部ファイルによって、文字列⇔数値変換が出来る。
という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。
121:デフォルトの名無しさん
08/02/03 20:23:33
執筆者予備軍としての一言
・VB やJAVA のようにさまざまな発刊企画があれば、
上級者向け書籍が作れるが、Fortran では無理。
・初心者向け書籍では、内容を厳選するよう要請される。
頁数を少なく、文字数を少なく、挿し絵を充実、などなど。
common や内部ファイルは真っ先に削除対象となる。
122:デフォルトの名無しさん
08/02/03 20:27:04
COMMON文の説明なんて要らないから
純粋なFortran95の解説書出してよー
F2003でもいいけど
123:デフォルトの名無しさん
08/02/03 20:55:12
COMMON 文は F77 では必要悪だが
F95 だとバグを産む素でしかない。
124:デフォルトの名無しさん
08/02/03 21:35:44
>>121
コラムとか付録のサンプルとかで、何とか突っ込んでくれ。
125:デフォルトの名無しさん
08/02/04 00:53:35
動的の説明を書かないにせよ
character(len=20):: fmt
fmt = 'A5,2X,I10'
100 format(fmt)
って例が載っているだけでも、
あーこんな使い方できるんだ~
って思えるよなあ。
126:118
08/02/04 01:00:23
>>120
質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、
より実用的、応用的なプログラムを組んでる人だと思うんだよね。
Fortranは数値計算とセットでやる事が多いだろうから
優秀な大学じゃないと内部ファイルまでやれないよ。
無理してそこまでやっちゃったら、大切な部分が疎かになったり
数%しか単位取れませんでしたとか言う事態になっちまう。
127:デフォルトの名無しさん
08/02/04 16:50:31
symbol A is not an array
こんなエラーが出るんですが何がいけないんでしょう?
128:デフォルトの名無しさん
08/02/04 18:59:12
シンボルAは配列ではありません
129:デフォルトの名無しさん
08/02/04 19:58:45
Statement function statement cannot occur here
invalid forward reference to label 117
>>128ありがとうございます
ちなみにこれはどうすればいいんでしょう?
130:デフォルトの名無しさん
08/02/04 21:17:37
>Statement function statement cannot occur here
文関数はここに存在することが出来ません
実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。
配列や関数の引用の書き方が間違っている可能性もある。
>invalid forward reference to label 117
ラベル117の無効な前方参照
文番号117が参照されているが見つからない。
どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので
エラーメッセージは自分でよく読むように習慣づけよう。
131:デフォルトの名無しさん
08/02/05 01:17:27
>>129
>>130氏を補足しよう。
>Statement function statement cannot occur here
これは未宣言の配列を用いるとよく出てくるメッセージだ。
配列を宣言し忘れていたり、綴りを間違い、かつ添え字に変数を使っていると出てくる。
FORTRAN77では文関数なるものが導入された。
これは一行で書ける関数を宣言文のところで宣言しておくと、実行文のところで利用できるというものなのだか
大して役に立たないのでほとんど使われない。それだけならよかったのだが、とんでもない副作用が生じてしまった。
実行文のところに、たまたま変数を添え字とする宣言し忘れの配列を使ったとする。
すると見かけ上は文関数の定義のように見えるので、(そういうパターンにマッチしてしまうので)
上のようなエラーメッセージが現れることになる。
例
f(i) = 5 * i + 1
これが宣言文のとこに現れば、f(x) = 5 x + 1 という関数を文関数で宣言したことになるし、
DIMENSION f(10)
i = 1
f(i) = 5 * i + 1
....
のような形で現れれば、配列fのi番目の要素に、5i + 1を入れる代入式と解釈される。
この文関数がらみのエラーは、だされるメッセージと実際のエラーの内容が食い違っているので、
FORTRAN77初心者を惑わす罠になっている。
これは必ず通る道なので、まぁ文句言わずにあるがまま受け入れろw
132:デフォルトの名無しさん
08/02/05 07:36:18
>こんなエラーが出るんですが何がいけないんでしょう?
俺なら「おまえの頭」っていうところだけどな
133:デフォルトの名無しさん
08/02/05 11:07:31
>>132
うっせー おまえこそ すっこんでろ!w
ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!
134:デフォルトの名無しさん
08/02/06 02:24:45
FORTRANってなんですか?
アプリケーションを作れたりするプログラミング言語なんですか?
135:デフォルトの名無しさん
08/02/06 10:59:57
科学研究をするログラミング言語です
136:デフォルトの名無しさん
08/02/07 15:48:50
Linuxでの実行モジュールを作るには、Linuxで開発・コンパイルするしかないんでしょうか?
WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・
137:デフォルトの名無しさん
08/02/07 20:42:45
Linuxでやるしかないかな。
だけど、コーディングをLinuxでやる必要はないので、
そんなに大変じゃないと思う。
コンパイルオプションをLinux版に変えるだけで
頑張ってMakefile書くくらいで終わりっしょ。
特にVisual Studio + Intel fortran
から
Intel fortran Linux
に行くだけなら
つまづくこともかなり少ないと思われ。
138:デフォルトの名無しさん
08/02/07 21:12:16
gcc をクロスコンパイル用にコンパイルしてしまえば
別に Windows 上でも Linux 用のバイナリを作ることはできるが、
Visual Studio 上となると・・・。
自分で makefile 書けば一応いけるのか?
まあ、一番の問題はデバッグが大変ってことか。
139:デフォルトの名無しさん
08/02/07 22:58:55
./a.out
140:136
08/02/08 00:16:57
>>137
ということはWindowsとLinux両方買わないといけない、ってことですよね?
コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・
>>138
gccはGNUなだけにその辺偉いのですが、速度が・・・
数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。
141:136
08/02/08 00:21:06
今気づいたのですが、Intel FortranコンパイラをVisual Stuido上で使った場合
出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?
142:デフォルトの名無しさん
08/02/08 01:52:57
>>140
学術目的ならLinux版は無期限ライセンス版が落とせる。
>>141
普通のEXEバイナリを吐く。
143:136
08/02/08 10:07:16
>>142
>学術目的ならLinux版は無期限ライセンス版が落とせる。
↓ですね。
URLリンク(www.intel.com)
コンパイラ以外も可とは、気前いいですね。
ただ、いくつかはPage Not Foundになってたりしますが・・・
>普通のEXEバイナリを吐く。
そうですよね、安心しました。
そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ
どうもありがとうございました。勉強になりました。
144:デフォルトの名無しさん
08/02/08 19:45:07
VisualStudioがあるのにIntel C++コンパイラ必要?
Intelのほうが速いから?
145:デフォルトの名無しさん
08/02/08 23:58:28
>>144
FORTRANと組み合わせるならIntelC++の方が楽。
BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。
またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。
無論C++でWin32API叩いたりするならMSの方が有利だろう。
146:デフォルトの名無しさん
08/02/09 01:56:22
>>145
なるほど
thxです
147:デフォルトの名無しさん
08/02/11 17:58:08
かなりどうでも良いことなんですが、
vimで.f90のソースを書いていると、
勝手にインデントをスペースに置き換えられるんですよね。
まあnoexpandtabすればタブ文字で書けるんですが、
syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。
これもsyntaxファイルを改変すれば変えられるのでしょうけど。
fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?
148:デフォルトの名無しさん
08/02/11 20:12:21
常識
1行72文字とか132文字とか制限があるのに
何文字にカウントされるか分からないタブ文字を使うなんて
プラットフォーム依存性を無駄に招いているとしか思えない
149:147
08/02/11 20:42:23
>148
なるほど。文字数の制限があるからですね。
fortran90から入ったので、
ほとんど文字制限を気にした事が無かったから気づきませんでした。
ありがとうございました。
150:デフォルトの名無しさん
08/02/11 21:25:04
>>148
> 常識
> 1行72文字とか132文字とか制限があるのに
f90 は自由形式だからその制限は無いはず。
f77 は制限アリ。
151:デフォルトの名無しさん
08/02/11 21:50:24
>>150
文法書をもう一度読め。
Fortran90は132カラムだ。
Fortran2003ではもう少し増やす。機械生成のコードだと、変数名などが長くなりやすいから。
それにしてもインデントでタブが入るエディターは本当にむかつく。
152:デフォルトの名無しさん
08/02/11 21:55:05
行頭のスペースを勝手にタブ文字に変えられると「タブ形式」と間違えられちゃうよー
153:デフォルトの名無しさん
08/02/12 00:05:18
少なくとも Intel Fortran は1行の文字制限はないよ。
他のコンパイラも大概独自で対応しているんじゃないかな。
154:デフォルトの名無しさん
08/02/12 10:37:30
NagのFortran Builder という開発環境を使ってる方いましたら、どんなものか教えてくれますか?
URLリンク(www.nag-j.co.jp)
他社A他社Bってどこでしょうかね?
155:デフォルトの名無しさん
08/02/12 12:19:44
>>153
まぁFortranの規格はISOが決めているから。
各ベンダーの拡張は拡張として。
Intelは確かに原則制限無し、7200文字のようだ。
>Free Source Form
>In free source form, statements are not limited to specific positions on a source line.
>In Fortran 95/90, a free form source line can contain from 0 to 132 characters.
>Intel Fortran allows the line to be of any length.
>Fortran source line length
> fixed form: 72 (or 132 if /extend_source is in effect) characters;
>free form: 7200 characters
156:デフォルトの名無しさん
08/02/12 13:54:10
目が悪くて文字解像度をあげられず、
エディターの一行表示上限が94文字しかないオレ様にしてみれば、
132文字も7200文字も無限と同じ。
157:デフォルトの名無しさん
08/02/12 17:17:43
makedepf90、Windowsでビルドできないかなぁ。
みなさんオブジェクトの依存関係とか、どうやって調べてますか?
基本的に1ファイルに1個モジュールで書いてるから
use文を抽出さえすれば簡単にできそうか
158:デフォルトの名無しさん
08/02/13 00:40:42
うほっ!
前スレに自己出力プログラムが出ていたが、俺も作ってみた。
IntelFortranで確認した。
一応F90の規約にのっとっている。以前上げられていた奴より分かりやすいのではと思うが如何?
ここでCHR(39)は『'』。
CHARACTER(LEN=68)::f
f='("CHARACTER(LEN=68)::f"/"f=",3a/"PRINT f,CHAR(39),f,CHAR(39)"/"END")'
PRINT f,CHAR(39),f,CHAR(39)
END
159:デフォルトの名無しさん
08/02/13 16:52:02
Vistaで使えるフリーのfortran90コンパイラってありますか?
160:デフォルトの名無しさん
08/02/13 17:24:29
どうやってもこのエラーが消えないけどどうしたらいいんだろう?
assignment between arrays of differing rank
161:デフォルトの名無しさん
08/02/13 17:38:11
>>159
Vista + Cygwin + gfortran or g95
162:デフォルトの名無しさん
08/02/14 00:50:54
>>159
Silverfrost の FTN95 かな。Vistaで動くかは知らんがw
URLリンク(www.silverfrost.com)
>>160
配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。
163:デフォルトの名無しさん
08/02/16 22:44:10
FORTRAN90 を勉強している者ですが構造体を下記のプログラムのように
使いたいのですがエラーがでてしまいます。m と n は、上位ルーチンのみ
で固定させたい(下位ルーチンにはサブルーチンの引数でサイズを渡したい)
のですが上手い方法をお教え頂けますでしょうか?構造体を使わず、
a(n,m) i(n,m) と配列にすればいいのでしょうが構造体を使って
書きたいので質問させて頂きました。よろしくお願い致します。m(_ _)m
program test
implicit none
integer,parameter::m = 1
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou)::data(m)
call dataset(data,m)
write(*,*) data(1)%a(1)
write(*,*) data(1)%l(1)
end program
subroutine dataset(data,m,n)
implicit none
integer,intent(in)::m,n
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou),intent(out)::data(m)
data(1)%a(1) = 3.0d+00
data(1)%l(1) = 2
return
end
164:デフォルトの名無しさん
08/02/17 01:23:42
>>163
記憶が正しければ、それはFortran95以前では出来ない。
TYPEの中の型やサイズを引数にするのは、Fortran2003で導入される機能だ。
Fortran95以前で実現するには、POINTER属性で宣言してメインでALLOCATEするのかな?
ただ、単にTYPEの宣言を1ッ箇所で済ませたいだけならば、独立したMODULEでTYPEを宣言して
あとは残りのルーチンでそれをUSEすればよいと思う。
MODULE m_type
IMPLICIT NONE
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(out)::data_(m)
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
(以下略 (ここではm_typeをカスケードに呼んだが
165:デフォルトの名無しさん
08/02/17 11:02:41
スレチと思うけど質問させてください。
計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって
何て言う名前ですか?フリーウェアですか?
166:デフォルトの名無しさん
08/02/17 12:10:40
>>165
それはジョブ管理システムというものだ。
ググレばなんか出てくるだろう。
普通はメーカー毎・OS毎に独自のものがある。
LinuxとかだとLSFというのが主流の気がする。
UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。
167:165
08/02/17 14:40:22
>>166
ググって色々調べてみたところ「Generic NQS」ってのが
フリーみたいですね。
自宅で数値計算をして遊んでみようと思いまして(;^_^A
どうも返答有り難うございました。
168:デフォルトの名無しさん
08/02/17 17:25:42
Intel Visual Fortran での、Windows用グラフィック・ルーチンを作っています。
プロトタイプができているので、興味がある人は見てみてください。
URLリンク(d.hatena.ne.jp)
やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、
普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。
変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。
大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと
思っています。
169:163
08/02/17 23:44:38
>>164 さん
丁寧なご回答どうもありがとうございます!! 返信が遅くなり
申し訳ございません。今、intel fortran compiler 10.1 で
メイン部分を下記にして動くことを確認できました。
Fortran2003で導入される機能ということで驚いています。
program test
use m_subs
implicit none
integer,parameter::m = 1
type(kouzou)::data_(m)
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
end program
170:163
08/02/17 23:45:55
実は、私がやろうとしていたのは、構造体のサイズ m とその中の要素の
サイズ n を下記のように入力データのようなものから動的に取得して
構造体の確保を実現させようと考えておりました。
下記のようなプログラムの構造体バージョンが目標でした。
下記の配列バージョンだと確保した配列全部をサブルーチンの
引数でひきずっていかなければならないと思うのですが構造体で
定義しておけば配列をパックにした構造体 1 つを引数で渡せると
考えました。
164 さんに教えて頂いたプログラムの MODULE m_type での
構造体の中の要素のサイズ n は、動的(データで決定)ではなく
parameter 文で静的にコンパイル時に確定させなければ
ならないんですよね?
長々と書いてしまって申し訳ありません。m(_ _)m
171:163
08/02/17 23:46:47
program test
implicit none
integer::m,n
read(5,*) m,n
call test2(m,n)
end program
!
subroutine test2(m,n)
implicit none
integer,intent(in)::m,n
real(8),allocatable::a(:,:)
integer,allocatable::l(:,:)
allocate(a(n,m),l(n,m))
call dataset(a,l,n,m)
write(*,*) a(1,1)
write(*,*) l(1,1)
deallocate(a,l)
return
end
!
subroutine dataset(a,l,n,m)
implicit none
integer,intent(in)::m,n
real(8),intent(out)::a(n,m)
integer,intent(out)::l(n,m)
a(1,1) = 3.0d+00
l(1,1) = 2
return
end
172:デフォルトの名無しさん
08/02/18 02:32:34
>>170 そういうことなら、以下のように出来る。
MODULE m_type
IMPLICIT NONE
type kouzou
real(8), POINTER::a(:)
integer, POINTER::l(:)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(in out)::data_(m) ← INOUTにしないと駄目みたい。
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
implicit none
integer,parameter::m = 1
INTEGER :: n = 2
type(kouzou)::data_(m)
ALLOCATE(data_(1)%a(n), data_(1)%l(n))
call dataset(data_,m)
(以下略
ただALLOCATEは配列の全要素にいちいちやらないと駄目。解放も面倒。コンパイラによってはPOINTERはALLOCATEでも可。
173:163
08/02/18 14:44:48
>>172 さん、本当に感謝です!! 上手くいきました。
ありがとうございます!! m(_ _)m
下記にすることで動的に確保できました。
上手い方法があるもんですね...
ただ、指摘された以下の場所は、私が試したところでは、inout で
なくても OK でした。
type(kouzou),intent(out)::data_(m)
あと、解放ですが deallocate(data_) 一発で OK?
program test
use m_subs
implicit none
type(kouzou),allocatable::data_(:)
integer::i,j,m,n
read(*,*) m,n
allocate(data_(m))
do j = 1,m
do i = 1,n
allocate(data_(j)%a(i),data_(j)%l(i))
end do
end do
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
deallocate(data_)
end program
174:デフォルトの名無しさん
08/02/18 23:15:43
>>173
多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。
Fortran2003で可能になる機能だが実装されている。
>あと、解放ですが deallocate(data_) 一発で OK?
多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。
少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ
175:163
08/02/19 00:01:59
>>174
構造体とポインタの使い方が分かって非常にためになりました。
ありがとうございます。色々と変えてみて試してみます。m(_ _)m
176:デフォルトの名無しさん
08/02/26 22:37:08
単精度をコンパイルオプション一発で倍精度にすることってできますか?
177:デフォルトの名無しさん
08/02/26 22:59:45
>>176
> 単精度をコンパイルオプション一発で倍精度にすることってできますか?
コンパイラは何?
178:デフォルトの名無しさん
08/02/27 00:01:57
>>176
一般的に、コンパイラには自動で倍精度にするautodblオプションがあることが多いので、マニュアル見ろ。
IMPLICIT REAL*8(A-H,O-Z)を入れるやり方もあるが、定数も倍精度にしないと下の桁にごみが入るので中々
容易い道ではない。
179:490
08/02/27 02:25:14
ちょっとずれた質問かもしれませんが、
皆さんプログラムを書く(デバッグ)するときに使っているツールで「これは便利だ」と思うツールを教えていただけませんか?
わたしは大体vimで書いているのですが、tagexplorer.vimというスクリプトを使って、関数などを別のウィンドウに出したりしているのですが...
最近emacsで書いてみたいなあと思うようになって情報を集めているのですが、あまり情報が見つからないんです。
Cだとcscopeとか便利なツールがあるみたいなんですが...
180:デフォルトの名無しさん
08/02/27 13:43:03
>>176
intel fortran だと、 -r8 で一発、
fujitsu だと -RR8 かなにか、でまぁとにかく一発。
念のためにと、parameter文や sin などの intrinsic な関数を適当に使った、
適当に1000回くらいiterateする短いコードを
最初から倍精度で書いたやつと、
単精度で書いたコードをオプションつけてコンパイルして計算したら、
計算の結果はbinary で一致した。
ほかのコンパイラでも似たようなもんだろう。
181:176
08/02/28 20:15:57
>>178
Intelコンパイラでした。マニュアル見たら速攻見つかりました・・すいませんでした。
autodblはHPやIBMのコンパイラでの名前みたいですね。
>>180
さすがにロードモジュールはバイナリ一致じゃないですよね。
わざわざ調べて頂いてありがとうございました。
182:180
08/02/29 13:13:23
>>181
べっ、別にあんたのためになんたらかんたら。
昔作ったのをもっかいコンパイル&実行してみただけ。
intel fortranはまめにバージョンを上げてくれてありがたいんだけど、
時々挙動が変わるからね。以前やったときはできあがった実行ファイルも
同一になったよ。バージョンによっては実行ファイル作成時の日時が
格納されるのか(推定)、全く同じファイルを全く同じオプションでコンパイルしても
同一でない実行ファイルが出来ることがあったけど。
今使っている version 9.1 だとサイズは同じで先頭部分の100バイトくらい微妙に違う。
183:デフォルトの名無しさん
08/02/29 13:24:30
>>182
うわ、ツンドラだツンドラだ
184:デフォルトの名無しさん
08/02/29 21:19:56
>全く同じファイルを全く同じオプションでコンパイルしても
>同一でない実行ファイルが出来ることがあったけど。
「このファイル同じだっけ?」って確認をcmpでやる癖のある自分としては、ちょっと厄介だなぁ
IntelFortranは今10.1だっけ?
185:デフォルトの名無しさん
08/03/01 14:27:05
Windowsの実行形式ファイルのヘッダには作成日時が入る箇所があるので、
IVFに限らず仕様通りに実行ファイルを生成するコンパイラ、というかリンカを使えば
同一ソースを同じオプションでコンパイルしても完全に同じ実行ファイルにはならない。
URLリンク(www.interq.or.jp)
まあ、頭の方がちょっと違ってくるだけなので、違っている部分の位置で
同じ内容かどうかは判断できると思うが。
186:デフォルトの名無しさん
08/03/02 00:44:48
Debian+gfortranでやっています。
勉強で、以下のようなプログラムを作ってみたのですが、コンパイルエラーとなってしまいます。
program test
implicit none
real y
y=hoge(3.0)
stop
end
real function hoge(x)
real x
hoge=2.0
return
end
コンパイルするとy=hoge(3.0)のところで、
Function 'hoge' at (1) has no IMPLICIT type
といわれます。どのように対処すればよいのでしょうか。
187:デフォルトの名無しさん
08/03/02 01:39:51
>>186
IMPLICIT NONEなのに関数hoge()の宣言がないから。
対処法としては
・関数hoge()を主プログラムtestの内部手続きにする。
・testの中にhoge()のINTERFACE宣言を書く。
・hoge()を含むMODULEを作る。
など。
188:デフォルトの名無しさん
08/03/02 14:47:26
real hogeをtestで宣言するかimplicit noneを削れ
189:デフォルトの名無しさん
08/03/07 00:40:07
ここって、Linux環境でのFortranのインストールの仕方って
質問していいんでしょうか?
Linuxの方でも場違いな気がいたしまして。。
190:デフォルトの名無しさん
08/03/07 01:18:17
>>189
GCC入ってないのか?
191:デフォルトの名無しさん
08/03/07 14:40:22
えっと、説明不足ですみません。
ここで質問してもいいかわかりませんが、とりあえず
Intel Fortran を Ubuntuにインストールしようとしたのですが、
まず、Ubuntuにデフォルトで開発環境が入っていないとか
libstdc++.so.5が
libstdc++5 だという話は解決したのですが、
コンパイラ、デバッガのインストールが終わって
Please Enter to Continue
で
Enter
を押しても、反応がなく、ただ改行する所で止まってます。
いろいろ調べて、Ubuntuのコミュニティで同様の投稿があったのですが、
なんだかよくわからず。(英語のページだからというのもありますが。。)
Intelが発表している内容は、
ifort とかのファイルにある
"/bin/sh"を"/bin/bash"に書き換えろとか書いてあるんですが、
すでに書き換わっていたりして。
もうお手上げです。。。
助けて下さい。。よろしくお願いします。
192:デフォルトの名無しさん
08/03/07 16:53:48
>>191
> インストールしようとした
どうやって?
例えばl_fc_p_10.1.011_ia32.tar.gzをダウンロードして、
展開して出来たl_fc_p_10.1.011_ia32に移動して、
install.shを実行したということ?
ubuntuのパッケージはdebだから、それにrpmのパッケージをそのまま
インストール出来るのだろうか。
私はalienでdebに変換してインストールした。
193:デフォルトの名無しさん
08/03/07 18:28:14
HPUX上の fortran90 にて
プログラムコードに”program main”と書かないと実行時に
/usr/lib/hpux64/dld.so: Unsatisfied code symbol 'main' in load module '/usr/lib/hpux64/libc.so.1'.
って表示されるんですが、”program main”を省略出来ないのは何故でしょうか?
何か環境変数で設定すればよきに計らってくれるのでしょうか?
194:デフォルトの名無しさん
08/03/07 20:25:15
>>192
仰るとおり、install.shからです。
intelのインストーラが起動すると、
ubuntuではg++が入ってないと出来ないとは書いてましたが、
debとかrpmという言葉は出てきませんでした。
宜しければ、どうやってインストールされたか
詳しく教えていただくと有難いです。。
195:デフォルトの名無しさん
08/03/07 21:57:43
>>194
私はDebianは使っているけど、Ubuntuは使ったことがない。
以下はDebian使いの私のインストール方法なので、Ubuntuに
そのまま適用出来るかどうかは知らない。また、あくまで私のやり方なので、
もっと楽なやり方があれば指摘して欲しい。
$ tar zxf l_fc_p_10.1.013_ia32.tar.gz
$ cd l_fc_p_10.1.013_ia32/data
$ fakeroot -u alien intel-ifort101013-10.1.013-1.i386.rpm
$ fakeroot -u alien intel-iidb101013-10.1.013-1.i386.rpm
$ su
# dpkg -i intel-ifort101013_10.1.013-2_i386.deb
# dpkg -i intel-iidb101013_10.1.013-2_i386.deb
# cd /opt/intel/fc/10.1.013/bin
ifort, ifortvars.csh, ifortvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/fc/10.1.013に置換する。
私の場合、viで開き、
:%s/<INSTALLDIR>/\/opt\/intel\/fc\/10.1.013/g
を実行した。
# cd /opt/intel/idb/10.1.013/bin
idbvars.csh, idbvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/idb/10.1.013に置換する。
ログイン時に上の*vars.shか*vars.cshファイルを読みこむように、
シェルの設定ファイルを変更する。私の場合はbashを使っているので、
~/.bashrcに
. /opt/intel/fc/10.1.013/bin/ifortvars.sh
. /opt/intel/idb/10.1.013/bin/idbvars.sh
を追加した。
196:デフォルトの名無しさん
08/03/08 01:03:43
>>193
考えにくいな。もっと詳しく。
最小例で。
197:デフォルトの名無しさん
08/03/08 01:28:57
>>195 さん
ありがとうございます。
実は、Linux自体初心者で勉強し始めたばかりでなかなか困ってます。
195さんのように、ファイルをrpmからdebに直してされている方はUbuntuの方でいらっしゃいました。
僕もやってみましたが、こちらはデフォルトのエディタで、optファイル内は書込み禁止になっているらしくて、
その対処法がなくストップしてしまいました。
つまり、<INSTALLDIR>の置換操作が出来なかったところです。
あと、ログイン時に読み込むファイルの設定の仕方がとか、
そういったファイルの場所がわからなくて、困っていました。
やはり普通に実行しては無理っぽいんですね。
ありがとうございました。そのあたりを勉強しなおして、もう一度やってみます。
どうやら、問題はLinuxの操作の知識不足にあるようですから。。。
198:192,195
08/03/08 02:08:25
>>197
さようなら。
199:デフォルトの名無しさん
08/03/08 11:49:08
サブルーチンsabuで計算結果をディスプレイに一行出力するのですが、
open文の後ではその出力がなぜかNANになってしまいます。
program main
implicit real*8 (a-h,o-z)
call sabu(1.0, 2.0)
call sabu(1.0, 2.0)
open(unit=24, file='gomi.txt', status='unknown')
call subu(1.0, 2.0)
call sabu(1.0, 2.0)
close(24)
stop
end
のように呼ぶと、必ずopen文の次から全てNANになります。
sabuの引数を変えたり、open文の装置識別子やファイル名を変えてみてもダメでした。
また、open文前後のsabuをcallする回数を変えてもダメでした。
sabu中では何個かのサブルーチンをcallしていて、その中でopen文は合計1行だけあります。
その装置番号は2で、装置識別子が重複しているわけでは無いようです。
原因は何でしょうか?宜しくお願いします。
cygwinでg77を使っています。
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
200:デフォルトの名無しさん
08/03/08 11:59:22
今の時代FORTRAN使うメリットってあるんですか?
201:デフォルトの名無しさん
08/03/08 12:29:51
TSS
202:デフォルトの名無しさん
08/03/08 12:35:40
>>199
sabu() の中で開けたものは、sabu() を出る前にちゃんと閉じてる?
sabu() の中身が分からないので何とも…。
203:199
08/03/08 14:30:47
>>202
レス有難うございます。
sabu()中で、
open(2,file='input.dat',status='old')
に続いて、read()した後close()があり、
write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'
とwriteで挟んでみたところ正しく表示されるので、
close文は実行されているのだと思います。
204:199
08/03/08 14:31:49
担当の先生によるとsabu以下は公開してだめだそうで、
一部を以下に写してみます(中略が要領を得ないときはご指摘ください)
cccccccccccccccccccccccccccccccccccccccc
subroutine sabu (xvalue,zvalue)
implicit real*8 (a-h,o-z)
< 中略(commonとdimension) >
open(2,file='input.dat',status='old')
< 中略(doとcontinueに挟まれてread) >
write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'
call sub1
<中略(ifとdoに挟まれて変数へ代入)>
call sub2(x,eps)
write(*,2000)(df(i),i=1,10)
2000 format(10e15.3)
return
end
205:デフォルトの名無しさん
08/03/08 21:49:47
よくわかりませんが、
mainとsabuでそれぞれにopen文があるので多重openになっていませんか?
206:デフォルトの名無しさん
08/03/08 23:50:39
>>204
情報が足りなくて全くのあてずっぽで書くが、昔のプログラムはAUTOMATIC変数がSAVE属性が
あるかのごとく仮定していることがあるので、コンパイラのオプションでSTATIC属性にしてみそ。
207:199
08/03/09 11:51:38
>>205
レス有難うございます。
今writeでデバッグした限りですが、同じファイルを2回openはしてないように見えます。
流れとしては、メインprogramから、
open(unit=24, file='gomi.txt', status='unknown')
↓
サブルーチンをcall
↓
open(2,file='input.dat',status='old')
↓
close(2)
↓
サブルーチンからreturn
↓
close(24)
となっています。
>>206
レス有難うございます。
アドバイスの通りg77で'-fno-automatic'を付けてみたらNANが無くなりました!
URLリンク(www-jlc.kek.jp)
>-fno-automatic: を指定すると、変数を static にアロケート します。
>これは、全てのルーチンに SAVE を付けるのと同値です。
大変感謝です。2週間これで詰まってました。
sabu含むすべてのサブルーチンでSAVEはありませんでした。
208:206
08/03/09 16:16:07
>>207
解決おめ。
少し補足すると、サブルーチンを呼んで帰った後、もう一回同じサブルーチンを呼んだときに、
サブルーチン内のローカル変数が前回の値を保持するかどうかが問題になっている。
FORTRAN77ではSAVE文ないしオプションが定義されて、明示的に前回の結果を取っておくことが
出来るようになった。規格ではFORTRAN77では前回の値を保障していなかったはず、
FORTRAN66では未定義かな?
しかし慣習的に、FORTRAN66時代から、前回の結果が残っているような処理系の実装が主流だったために、
かつては大抵のFORTRAN77処理系ではSAVEが暗黙にデフォになっていた、と思う。
Fortran90時代になって、動的にメモリーを取ることが普通になって、SAVEを明示的に指定しないと、
毎回任意のメモリーが割り当てられることがデフォになった気がする。ゆえにローカル変数内に
非数値的なビット列(NaN)のごみが入っていたりする。
昔のプログラムではFORTRAN77でもSAVEを仮定していることが多い。大抵はそれで動いていた。
メモリーを動的に確保せず、リンク・ロード時に静的にメモリーを割り付けていた。
というわけでg77が歴史的事情を尊重しないのが悪いと言ってみるw
NaNは配列はみだしか初期値のごみででることが多いのと、77スタイルのサブルーチンを出してきたので
推論した。
209:デフォルトの名無しさん
08/03/10 21:14:08
初めまして。超初心者なんで宜しくお願いします。
使っている環境はF90 g++ debian です。
以下 ソースです
program dotp4
implicit none
real(8), allocatable :: u(:), v(:) !allocatable属性を付けて割り付け配列を宣言
integer :: n
write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)
read (*,*) n
allocate (u(n), v(n)) !nを用いて配列の割り付けを行う
write(*,'(a\)') 'input u(1 : n)'
read(*,*) u(1 : n) !配列uの要素の値を読みとる
write(*,'(a\)') 'input v(1 : n)'
read(*,*) v(1 : n) !配列vの要素の値を読みとる
write(*,*) 'dp = ' , dot_product(u,v) !内積の計算
deallocate (u ,v)
end program dotp4
エラーは (col. 23) remark: LOOP WAS VECTORIZED.
です。
DO 文でベクトルを使うと大抵この文がでて来ます。
どうぞ宜しくお願いします (ちなみにallocateが赤くなりません)
210:デフォルトの名無しさん
08/03/10 23:22:28
>>209
> write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)
ここの '(a\)' に対してなら文句を言われた。なので '(a\)' を全て * に変えてコンパイルしたら通った。因みに gfortran でだ。g95 ではもとのママでも何も言われなかった。実行については共に特に問題無さそうだった。
211:デフォルトの名無しさん
08/03/10 23:50:00
>>209
>エラーは (col. 23) remark: LOOP WAS VECTORIZED.
>です。
これはエラーじゃない。リマークであって、警告ですらない。
単にDO-LOOPをベクトル化したという事を念のため教えてくれているに過ぎない。
つまりSSEを用いた最適化をしたという事を教えてくれている。
初心者なら、気にしなくてよい。
212:デフォルトの名無しさん
08/03/11 08:32:04
>>211
そのリマークってオプションなしのコンパイルでも出るんでしょうか?
213:デフォルトの名無しさん
08/03/11 11:48:37
>>212
処理系によって違うのでマニュアルを読んでもらうのが一番確実。
たとえば Intel Fortran の場合は、SSEによるベクトル化に関しては、
オプションを指定しないと何も言わない。
一般的に言えば、error, warning, info ( ここでは remark ) のような、
おおよそ3分類で、完全なるあやまち、分かってやってるならOK、念のための御注進
にあたるメッセージをデフォールトで言う。
うざいならオプションで抑止できるのが普通。
まぁコンパイラのオプションの説明嫁。
214:デフォルトの名無しさん
08/03/11 15:47:45
>>210
>>211
ありがとうございます。
ちゃんと実行できました!
remarkはエラーでは無いんですね。把握しました。
精進します
215:デフォルトの名無しさん
08/03/13 03:18:38
教えて下さい。
0の二乗が正しく計算できません。
なぜでしょうか?
MacOSXでもg95で同じような計算結果になります。
プログラム hoge.f95
program hoge
write(*,*) 0**2, 0.e0**2, 0.d0**2
end program hoge
以下、コマンド
> g95 hoge.f90
> a.exe
1 1. 1.
> g95 -v
Using built-in specs.
Target:
Configured with: /src/G95/gcc-4.1.2/configure --prefix=/mingw
--enable-languages=c --with-ld=/mingw/bin/ld --with-as=/mingw/bin/as
--host=i386-pc-mingw32 --enable-threads --disable-nls
--disable-win32-registry --enable-sjlj-exceptions --enable-libgcj
--without-x
Thread model: win32
gcc version 4.1.2 (g95 0.91!) Feb 7 2008
環境
Windows XP Professional Service Pack 2
216:デフォルトの名無しさん
08/03/13 11:25:15
>>215
> MacOSXでもg95で同じような計算結果になります。
MacOSX の g95 では上手く行っていますが?ちなみに PPC 版 Tiger。なので言っている事の意味ワカラン。
217:デフォルトの名無しさん
08/03/13 23:11:50
>>215
おまい、質問が下手だなw
うまい質問をするとうまい答えが返ってくるし、まずい質問をするとまずい答えしか返ってこないぞよ。
とにかくそれだけでは答えようが無い。
218:215
08/03/17 02:47:25
>>216
マカーの友人もTigerだそうです。
コンパイラのバージョンを教えてください。
>>217
他にどういった情報が必要でしょうか?
分かりにくいということですか?
この問題を解決したいので教えてください。
この「0の巾乗が計算出来ない」という問題はあまり有名ではないのでしょうか?
a=0.のときに
a**2が計算できないのは致命的なバグなような気もします。
周りのg95ユーザに聞いても解決しませんでした。
(やはり、他のシステムでも0の巾乗は計算出来ていません。)
ちなみに私は普段はgfortranをvine上で使っていますが、このような結果にはなりませんでした。
219:216
08/03/17 05:38:14
>>218
同じソースを g77 でコンパイルしても正しい結果が出た。ln -s hoge.f95 hoge.f で偽装(?)した。
% ./a.out
0 0. 0.
gfortran は試してない。fink でやったら簡単だけど、意義を感じない。
因みに g95 と gfortran のどっちが良さげ?>識者の皆様
> MacOSXでもg95で同じような計算結果になります。
はヲマイがやったんぢゃないのか?自分で確認したことと、他人に聞いた事は切り分けてクレ。
% g95 --version
G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)
Copyright (C) 2002-2005 Free Software Foundation, Inc.
----------
% g77 --version
GNU Fortran (GCC) 3.4.4
Copyright (C) 2004 Free Software Foundation, Inc.
220:215
08/03/17 14:13:34
>>216
ありがとうございます。
わかりにくくて申し訳ありません。
MacOSXは友人がやりました。
g95(windows),gfortran(vine),ifort(ubuntu)は私がまわしました。
(ifortでも同じプログラムを回してみました。)
gfortran,ifortは正しい結果が得られます。
g95だけ正しく計算できません。
バージョンの問題でしょうか?
友人にバージョンを聞いてみます。
221:デフォルトの名無しさん
08/03/17 21:57:57
>>220
The G95 project にバイナリが色々置いてあったので試してみたら
Stable Version (G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)) だと
0 0. 0.
になったが、
Current Snapshot (G95 (GCC 4.0.3 (g95 0.91!) Feb 27 2008)) だと
1 1. 1.
になった。
-S オプションでアセンプリ出力を見てみると
いきなり定数の 1 を書き込んでいるようなので
コンパイラのバグだろうな。
まあ、Snapshot なんでバグの1つや2つ有るだろう。
Stable Version の方を使うかバグ報告出して直してもらえ。
>>219
ちょっと前まではg95の方が安定してたような気がする。
でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
こちらの方が一般的になるのだろうな。
#それにたしかg95の方はまだOpenMPに対応してなかったはず。
222:216
08/03/18 17:47:26
> >>219
> ちょっと前まではg95の方が安定してたような気がする。
> でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
> こちらの方が一般的になるのだろうな。
> #それにたしかg95の方はまだOpenMPに対応してなかったはず。
有り難うございます。確かに最近導入したLinuxはほぼ gfortran が付いていますね。
g95 は付いて無いですが。私は並列はしないので、OpenMP は対応していなくても
良いのですが、周りから聞かれたら gfortran の方を勧めることにします。
223:デフォルトの名無しさん
08/03/18 21:13:10
Windowsで使う分にはg95も手軽でいいんだがな。
224:デフォルトの名無しさん
08/03/31 14:46:06
>>222
できるよ。
以上。
はい、次。
225:デフォルトの名無しさん
08/03/31 21:02:15
ん?
226:デフォルトの名無しさん
08/04/01 00:26:18
$OMP imifu
227:デフォルトの名無しさん
08/04/01 01:48:45
本当に初心者なのですが失礼します
分関数定義文について勉強してるんですが、
プログラムが読めても、作れないくらいのレベルです
文関数定義分を使って、関数f(x)=x^2+x+1を
0≦x≦1の区間について、0,1ごとにxを変化させた場合の
結果を出力するプログラムを作りたいのですが、
わかる方いましたらお願いします
228:デフォルトの名無しさん
08/04/01 13:49:39
>>227
ドイツとかフランスで教育を受けた人?小数点がそっち風なんですけど
FTN77で作動確認、間違ってたりナンセンスでも許してね。
DO 10 I=0,10,1
X=0.1*I
Y=F(X)
10 WRITE (6,20) X,Y
STOP
20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3)
END
C
FUNCTION F(X)
F=X**2+X+1
RETURN
END
229:デフォルトの名無しさん
08/04/01 21:00:37
志村ー、文関数!文関数!
230:デフォルトの名無しさん
08/04/01 22:13:38
文関数はobsoleteで、今は使えてもいずれ使えなくなる筈。
231:志村228
08/04/01 22:26:01
間違えちまっただ~
F(X)=X**2+X+1
DO 10 I=0,10,1
X=0.1*I
Y=F(X)
10 WRITE (6,20) X,Y
STOP
20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3)
END
232:デフォルトの名無しさん
08/04/01 23:00:00
>>230
心配すんな!
obsolete指定されても大概のコンパイラは機能を残すから。
今までもそうだったし、これからもそうだろうw
Fortranは、地層が積み重なった言語で面白い。直交性の悪さが自然言語っぽいw
233:デフォルトの名無しさん
08/04/02 00:01:34
Fortran95の廃止事項もほとんどの処理系で残ってるからなぁ
234:デフォルトの名無しさん
08/04/03 01:03:12
とは言え初心者に廃止事項を進めるわけにもいかんだろ
お行儀の良いコーディングした方がバグは減るだろうし
235:デフォルトの名無しさん
08/04/09 13:09:47
FORTRAN77で書かれたサブルーチンプログラム(sub.for)を
fortran90のメインプログラムmain.f90で呼び出して使うにはどうすれば良いのでしょうか。
コンパイラはg95/cygwinを使ってます
236:デフォルトの名無しさん
08/04/09 19:17:15
テスト
237:デフォルトの名無しさん
08/04/09 19:34:30
>>235
g95 main.f90 sub.for
ぢゃだめなん?(めんどくさいので、確認はしてない)
238:デフォルトの名無しさん
08/04/09 23:00:33
>>237
レスありがとうございまs
私も並べてコンパイルすれば良いと思ってたんですけど駄目でした。
main.f90の中にuse文を作れば良いのでしょうか?
239:デフォルトの名無しさん
08/04/09 23:16:59
>>238
1.EXTERNAL文で外部関数であると表明する。
2.INTERFACE BLOCKでINTERFACEをちゃんと書く。
3.MODULEの中に置いて、USE文で引用する。
1から3の順で面倒くさいが、F90的にはこのましく行儀よくなる。
240:デフォルトの名無しさん
08/04/10 00:06:08
>>239
すみません、折角頂いたアドバイスを理解しきれていないのですが
sub.forの中身をfortran90で書き直して、モジュール化するということですか?
77のままでは無理でしょうか?粘着に質問してしまい恐縮でs
241:デフォルトの名無しさん
08/04/10 00:47:43
>>240
1.
PROGRAM f90
IMPLICIT NONE....
EXTERNAL f77noName....
....
CALL f77noName...
...
2.
PROGRAM f90
IMPLICIT NONE
INTERFACE
SUBROUTINE f77... 云々
END INTERFACE
MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko
PROGRAM homosexual
USE unko
IMPLICIT NONE
CALL f77(....)
END
242:241
08/04/10 00:49:04
すまん 行Overで肝心の3番を消してしまった。
スレ汚しご容赦。
3.
MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko
PROGRAM homosexual
USE unko
IMPLICIT NONE
CALL f77(....)
END
243:240
08/04/10 09:32:50
おお!うまくいきそうです!
ご教授どうもありがとうございます!!
244:デフォルトの名無しさん
08/04/11 13:16:37
質問です。read文で数字の羅列とコメントで構成されたテキストファイルから値を読み取ろうとしています。
OPEN (3,FILE='a.dat',STATUS='OLD')
.....
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
READ(3,*)
READ(3,*) FTMP
READ(3,*)
......
という感じです。読み込むファイルの方はテキストで
.....
FNUM=
1.5E16
DTM=
0.5E-6
FTMP=
303.
......
というようになっています。ところが、他の値と同じように読み込んでいるのに
FNUM=
1.5E16
DTM=
0.5E-6
のところだけうまく読み込めず、値が0になってしまいます。何度も確認しましたが、ちゃんとその場所を読んでいるはずですし、
別の場所で代入していたりはしません。しょうがないので、テキストの末尾に読み込めなかった値をダブって記入し、
そこから読み込むとうまく読めました。ひとまずこれで問題はないのですが、原因が思い当たらずあまりにも気持ち悪いので、
思い当たる原因があれば教えていただけないでしょうか?よろしくお願いします。
245:デフォルトの名無しさん
08/04/14 02:01:04
>>244
これだけでは情報が足りない。
もう少しkwsk
246:244
08/04/14 18:09:41
えーと、すみません。普段数式の部分しかいじってないものでFORTRAN自体の
知識があまりないのでどのあたりが必要な情報なのかいまいち分からないのですが、
とりあえず計算用のコードで、パラメータの設定をソースコードと分離したくて
SUBROUTINE PARAMETER
COMMON /COMP / FNUM,DTM....
FNUM=1.5E16
DTM=0.5E-6
....
のような記述を
SUBROUTINE PARAMETER
COMMON /COMP / FNUM,DTM....
OPEN (3,FILE='a.dat',STATUS='OLD')
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
....
と、以下のようなtxtファイル
FNUM=
1.5E16
DTM=
0.5E-6
....
の組み合わせで行うようにしたいのです。で、問題は前レスに書いたようなことなのですが、他に必要な情報ありますでしょうか?
247:デフォルトの名無しさん
08/04/15 16:07:47
245ではないが、やってみた。
$ cat test0415.f90
PROGRAM TEST0415
OPEN (3,FILE='a.dat',STATUS='OLD')
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
CLOSE(3)
WRITE(*,*) FNUM
WRITE(*,*) DTM
PROGRAM TEST0415
$ cat a.dat
FNUM=
1.5E16
DTM=
0.5E-6
$ gfortran --version
GNU Fortran (Debian 4.3.0-3) 4.3.1 20080401 (prerelease)
Copyright (C) 2008 Free Software Foundation, Inc.
$ gfortran -o test0415 test0415.f90
$ ./test0415
1.50000004E+16
4.99999999E-07
$
ということで、問題無く読めた。
248:デフォルトの名無しさん
08/04/15 17:21:33
>>247
> ということで、問題無く読めた。
ということはコンパイラ依存か?
>>244 はそういう情報を出していないし。
249:デフォルトの名無しさん
08/04/16 14:35:39
>>247
えーと、すみません、基本的には問題なく読めるのですが、全く同じやりかたを
してるはずの別の行で、何故か値がおかしくなる部分が存在するんです。
ここには書ききれませんでしたが本当はもっと膨大な値を読み込んでます。
>>248
コンパイラはSalfordFTN77ですが、別のコンパイラでやっても同じ結果になります。
250:デフォルトの名無しさん
08/04/16 14:52:33
>>249
「値がおかしくなる」ための条件を自分で見付け出して。
サブルーチン内で正しく読めているか確認。そして、呼び出し元の
メインプログラムで同じ値を返すか確認。
問題の提示が曖昧でどうにもできない。
251:244
08/04/18 16:50:45
>>250
うーん、多分なんですが自己解決しました。読み込みの都合上、
a.datの中では、読み込みの都合上(DO文で回すためです)
使わない要素にもダミーの数値を入れてたんですが、
COMMON文のがわで、「使わないんだからいいだろ」と思って
ダミーの文まで次元を用意してませんでした。
要するに存在しない配列の要素に数値を代入してました。
つまり
LIM(1,1)=10
LIM(1,2)=10
TEMP(1)=273
LIM(2,1)=20
LIM(2,2)=20
TEMP(2)=0←ダミーの数値
っていう場合に、
COMMON/SURFACE/LIM(2,2),TEMP(1)
としてました。
COMMON/SURFACE/LIM(2,2),TEMP(2)
にしたら直ったようです。ダメだったんですね…
252:デフォルトの名無しさん
08/04/22 02:48:59
>>251
その説明ではよく分からんが、COMMONは記憶領域の共有であって、
グローバル変数だと思っていると正しくない。
COMMONの最後の要素の長さが違うだけなら、問題は起きないと思うが
(これは無名COMMONだけだったか?最近COMMONを使わないから細部を忘れた)
途中の要素の長さを変えたらそこから先の番地が全部ずれることになる。
253:デフォルトの名無しさん
08/04/22 18:25:11
integer hoge(100)と宣言すると1が始点になり、hoge(1)~hoge(100)までのメモリが確保されますが、
hoge(0)はどこかを指しているんでしょうか?
hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?
254:デフォルトの名無しさん
08/04/22 18:49:45
>>253
> hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?
そりゃやらん方がえぇ。そもそもソレをする事にどんな意味があるの?
そういうのは C でも怒られないよね。で、メモリ絡みのバグに繋がるんだっけ?
コンパイラによるけど、定義範囲外にアクセスしたときに(プログラムを)強制中断するオプションがある。
255:253
08/04/22 22:27:34
>>254
やはりそうですよね、常識で考えれば・・・
pgi6.4です。普通にコンパイルできて、結果も問題なかったんですが、アレって思いまして。
256:254
08/04/23 13:20:16
>>255
文法上の違反ではない(はずだ)からコンパイルは出来る。
コンパイルオプションで警告を出すようにでもすれば、何
か言われるかもしれないが、何も付けなければ、文法上の
問題が無いからスルー。実行結果まで保証しない。
257:デフォルトの名無しさん
08/04/23 13:25:28
2次元座標(x,y)を(r,theta)に変換する関数って用意されてないですか?
atan(y/x)とyの符号で場合分けしてましたが
258:デフォルトの名無しさん
08/04/23 18:01:36
F77の勉強始めて3日目のの初心者なんですが、練習にオセロのプログラムを作ろうとして行き詰まってます。
BAN(8,8)の数列で、オセロのマスを指定してるんですが、あるマスBAN(m,n)に石を置いた時にその周り8方向のマスを調べる方法がわかりません。
だれか教えてください。
259:デフォルトの名無しさん
08/04/23 23:54:16
>>255
Fortranはスピード優先なので、配列のはみだしは普通チェックしない。
コンパイラの実行時オプションでチェックするように出来るのが普通だが、あくまでデバッグ用の位置づけ。
今の場合、配列をはみだして他の変数を上書きしている可能性が高い。
MAPオプションでメモリー上に変数がどうアロケートされているかを調べれば、どの変数が壊されているか
見当がつく。
>>257
そういう関数はFortranの標準には無い。
今の場合、ATAN(y/x)よりもATAN2(y、x)を使うほうが適切、X=0.0の場合の0割エラーなどを避けられる。
詳しくはマニュアル味噌。
>>258
素直に前後左右斜めを調べるしかないべ。
DO i=-1,1
DO j = -1,1
CALL check(ix + i, iy + j)
END DO
END DO
枡をはみだす端っこの処理を簡素化するには、配列を0~9までで宣言して端っこマスは
別途の方法で処理するとかできる。空=0、白=1、l黒=2、マスの外=-999とか。