くだすれFORTRAN(超初心者用)その3 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/11/30 09:55:26
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
スレリンク(tech板)

くだすれFORTRAN(超初心者用)その2
スレリンク(tech板)

●関連スレ
FORTRAN W
スレリンク(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上で使った場合
出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4381日前に更新/200 KB
担当:undef