[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 01/23 11:34 / Filesize : 200 KB / Number-of Response : 550
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その3



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

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


●前スレ
くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

●関連スレ
FORTRAN W
pc8.2ch.net/test/read.cgi/tech/1163319215/

2 名前:デフォルトの名無しさん [2007/11/30(金) 09:58:45 ]
2

3 名前:デフォルトの名無しさん [2007/12/01(土) 00:21:42 ]
>>1 乙!


4 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 23:07:06 ]
前スレ>>994
はどうなったの?

6 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/12/06(木) 13:04:21 ]
Fortranの記述の中で
左にCをたくさん書くと思うのですが
これは何を表しているのでしょうか?
また、何の頭文字なのでしょうか?


9 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 13:26:47 ]
>>8
行頭のCはFORTRAN77でコメント入れるときに使う。

10 名前:デフォルトの名無しさん [2007/12/06(木) 13:44:14 ]
>>9
回答ありがとうございます。
初心者質問で申し訳ないのですが
もう少しおつきあい願えないでしょうか?


まず、Σの計算をしたい場合、やはり
do 10 I=1,10
z=z+f[i]
10 continue
というような記述が必要なのですよね?
これをもっと簡単な記述にすることは出来ないのでしょうか?
また合計する範囲が1〜∞の場合どうやって記述すれば良いのでしょうか?




11 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 15:16:29 ]
バーナードきょうは やがて わがいをえたように いいました。
「ふっふっ。 きみのような がくせいに ふさわしい がっこうを わしは おもいだしたぞ!。
それは こうぎょうがっこう という がっこうじゃ。 きみの しりたいことは なんでも おしえてくれる!」

12 名前:10 [2007/12/06(木) 18:33:14 ]
どうなんでしょうか?
お願い致します。


13 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:43:35 ]
i = 1
10 z = z + f(i)
i = i + 1
goto 10


14 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:59:49 ]
>>10
>Σの計算をしたい場合
ここら辺は手続き型言語であれば多少の差はあれ同じ様な記述になる。
まあ、Fortran90以降で
z = sum(f(1:10))
とかやる手も有るがな。

>合計する範囲が1〜∞の場合どうやって記述すれば良いのでしょうか?
そもそもコンピュータは離散的な値を有限個しか取り扱えないので
「1〜∞」をそのまま記述するのは無理。
代わりに問題に対して「十分大きな値」を使ったりしてコンピュータで
処理できるような形にして計算させる。

>>13
^C

15 名前:デフォルトの名無しさん [2007/12/07(金) 20:22:46 ]
Fortran77を初めて使うのですが、複素数型で試したところこのようなエラーが出ました。
改善策がわかりませんので、ご教示ください
www.pen2so.com/upload/src/up1130.jpg

16 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 20:37:35 ]

ブラクラ危険

17 名前:デフォルトの名無しさん [2007/12/07(金) 20:47:48 ]
www.uploda.org/uporg1146845.jpg
え?あれ?ちゃんとうpできてませんでしたか?すいませんでした。
どこにあげればよいのかよくわからなくて変なところにあげてしまいました。

18 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 03:21:15 ]
>>15
> Missing ( from complex number

複素数は実部と虚部を括弧で囲んで表す。
(0.0, 1.0)

19 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 02:00:46 ]
初めまして。
Fortranというよりは数値計算の分野の質問かも知れませんが、
もし経験者がいらっしゃいましたらご教授いただきたく存じます。
ほぼスレ違いですが失礼します。

現在Fortran90で6段5次ルンゲ・クッタ-フェールベルグ公式による常微分方程式計算をしているのですが、
誤差が小さいとされるこの公式がを自前でプログラム作成しましたところ、
それまでに使用していた4段4次ルンゲ・クッタ法より遥かに大きな誤差が出てしまいました。
係数の誤りは何度も確認しましたがそのようには思えません。
他に考えられる原因はありますでしょうか。

20 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:45:03 ]
>>19
ものすごく荒く言えば、滑らかな曲線だと微係数を増やしたほうがよりよく予測できるが、
カクッと曲がったりフラフラ振動する曲線の場合あんまり予測のための点数を増やすと
かえってとんでもないところを予測したりする。
(ステップ幅のスケールで見ての話だが)

この手の話は、微分方程式の数値解法の本に載っている。
漏れは非専門なので詳しくは本で調べてね。
嘘だったらゴメンw




21 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん [2007/12/11(火) 16:44:03 ]
Fortranで一行に入る文字数制限が決まっていると聞いたのですが
正確には何文字なのでしょうか?
また、もし入りきらなかった場合にはどうやって二行に分けて書けば良いのでしょうか?

23 名前:デフォルトの名無しさん mailto:sage [2007/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 mailto:sage [2007/12/11(火) 23:07:34 ]
>>23
>固定形式は 7〜73桁
俺が持ってる教科書には
>文は第7桁目〜第72桁目に書き
とあるのですがこの教科書ミスってるんですかね?
頭が悪くてどうなのか自分では調べられません(><)

25 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 06:59:54 ]
72だな。

なぜそんな制限があるのかはこれを見れば分かる。
ttp://www.eecis.udel.edu/~mills/gallery/gallery9.html
ttp://www.eecis.udel.edu/~mills/pic/ibmcard.jpg

26 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 11:31:41 ]
>>26
もう少し、具体的に「かくかくしかじかになるはずが、これこれこうこうと成って、おかしいです」と
いった具合に聞かないと、答えるほうも面倒で考える気がしない。

情報をもっと付加してくれ。

28 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 21:43:25 ]
implicit real*8をやめたほうがいいとよく見るので、
既存ソースを書き換え中なのですが、
教えてください。

以下のソースだと、メインソースでintfuncが宣言されていないと
コンパイル時にエラーが出ますが、
自分で作成した関数の定義はどのように宣言すればいいのでしょう?



30 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/12/13(木) 01:12:00 ]
31番さん
ありがとうございます。
ってことは、iのdoループをなくしてkのdoループのみにしたらよいという事ですか?
そして、formatを書かずに読み込ませれば良いでしょうかね?

ちなみに26番の「do 30 i=1,144 」は間違いで、iではなくkです。


33 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 01:38:20 ]
>>32
いやちがうw
kに何の値も与えられていないのは無論問題だし、フォーマットとデータが対応していないのも問題だが
(単に2chに貼った時にスペースが削られたのかもしれないが),
z1,z2を整数にしないとフォーマット文と整合しないのでおかしな値が入ると思う。と言いたかった。

ついでにiのdoLoopの内か外にkのDoLoopも必要だろう。

34 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 05:01:53 ]
>>30

integer, external :: intfunc

をメインプログラムにいれるとおk

35 名前:デフォルトの名無しさん [2007/12/13(木) 11:45:45 ]
33番さん
ありがとうございます。
今のところ作っているプログラムはこんな感じなんですが
しっかり読み込めているか確認のためにa1(k)とa2(k)をwriteしようとしましたが、
a1(1)とa(2)までしかwriteされません。
doループの場所を変えれば全て表示されます。
↓↓↓

36 名前:デフォルトの名無しさん [2007/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 mailto:sage [2007/12/14(金) 00:33:31 ]
>>34
externalが必要だったんですか。

家に環境がないので明日試してみます。


どうもありがとうございました。

38 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 02:00:05 ]
>>37
EXTERNALでもいいが、F90式で行くなら、INTERFACEを書くほうがベター。


39 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 03:56:51 ]
>>38
たしかにそうですね。手抜きを教えてすみませんでした
>>37
パソコンがあればgfortranでちょっとしたテストコードは
試せますよ。Linux,Win始めいろんなOS用のバイナリがある
gcc.gnu.org/wiki/GFortran

40 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 00:25:07 ]
>>36
外側のループを1回終えた時点でjegm.txtのデータを全て読み終えてる。



41 名前:デフォルトの名無しさん [2007/12/19(水) 00:15:39 ]
最近、一番町とかをアメリカ人の男連れがぶらぶらしているが、
米軍の演習でもやっているのか?


42 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:16:28 ]
誤爆したwwwwすまんこwww

ABEND


43 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:36:56 ]
FORTRANの入門書はどこの本屋で売っていますか?w

44 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:38:42 ]
>>43
紀伊国屋や丸善クラスの大型書店 または アマゾン

45 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/12/20(木) 12:31:45 ]
>>45
Fortran90的にはエラーだから素直に書き直せw
FORTRAN77的にはありだが。


47 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 12:38:35 ]
>>46
もともとは77で書いてあったコードなんですよね.
説明用のサンプルをいつものくせで90で書いてしまいました.

コードの量が膨大なものでできればそのまま使いたいんですよー
ちなみに再コンパイルするのはCore2Duo用の最適化のためです.
どうか方法教えて頂けませんでしょうか?

48 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:58:27 ]
>>47
元コードがF77なら話は通る。
>>45でCVFで通ったと書いてあったが、通るわけないので勘違いだと思っていた。

解決法は簡単で、サブルーチンと呼び出しルーチンを別ファイルにして、分割コンパイルされるように
すればいい。多分、元は別ファイルになっていたのをまとめたりしているのでは?

F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
無いのでエラーは出ないはず。

同一ファイル内に書いてあると、コンパイラが親切にも引数の整合性チェックなどをしてくれる。


49 名前:48 mailto:sage [2007/12/21(金) 01:00:28 ]
ちょっと訂正

>F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
>無いのでエラーは出ないはず。

F77なら"分割コンパイル時や”リンク時の引数チェックは何もしないので


50 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 13:59:25 ]
read(1,*)
read(1,*) x(i),y(i),z(i)


52 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:12:39 ]
>>48
ありがとうございました.
解決しました.

53 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:55:41 ]
一般的かわからないけど自分はダミー変数作って読み飛ばしてる

do i = 1, 2
read(1,*) xdum, y(i), zdum
enddo


>>51
それって1「行」目を読み飛ばしてるのでは・・

54 名前:50 mailto:sage [2007/12/21(金) 21:29:14 ]
レスありがとうございます。
>>51
「列」方向(縦方向)のデータを取り出す方法なんですが…
>>53
ダミー…考えはしたんですが、いいのかどうか迷ってました。
書いていただいて自信が持てました。ありがとうございます。



55 名前:デフォルトの名無しさん [2007/12/21(金) 22:23:51 ]
F77を使用しています。
出力した値をエクセルに貼り付けたいと思っているのですが、出力方法がコマンドプロンプトに表示する方法しかわからず困っています。
出力した値をメモ帳などに保存する方法はないのでしょうか?


56 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 22:40:56 ]
>>55
WRITE文の出力先をファイルに変更する。

手っ取り早くやりたかったら、リダイレクトで
hoge.exe > output.txt

57 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 23:01:08 ]
>>56
できました!ありがとうございます。

58 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:38:50 ]
常微分方程式y´+y=e^(-x)を
関数 Function f(x,y)
   F=
Return
end

であらわすにはどうしたらいいのでしょうか? 77です。

59 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:11:36 ]
このスレだとPGIコンパイラ使ってる人いそうなのでお聞きします。
ホームを表す~ですが、Intelコンパイラだと解釈してくれますが、PGIだとしてくれませんよね。
何気に不便なのですが、何か方法ないでしょうか?

60 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:33:45 ]
getenv('HOME')



61 名前:59 mailto:sage [2007/12/27(木) 23:25:35 ]
>>60
HOMEには当然ホームの値が入ってますよ(これはコンパイラに拠らないと思いますが)

62 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:09:07 ]
うわ 2chだとタブ文字使えないんですね
ごめんなさい

65 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 13:13:51 ]
全角空白を使うのがお約束みたいね
コピペしたあと再編集が必要なのがめんどいけど

66 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/01/03(木) 16:05:13 ]
>66
ありがとうございます! どちらの方法でもできました!
管理のしやすさなら、後者の方法で書きためて行った方がよさそうですね。
分野毎にmoduleで分けて、1module1ファイルで。

これで大体わかったので、色々と役に立ちそうなものを書いていけます。
ありがとうございました。

68 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 11:55:29 ]
プログラムを実行させてみると
Segmentation fault (core dumped)
というエラーが出て止まってしまいます。
そこで原因を探ろうと
write(*,*)'OK'
見たいなのを打ち込んでいたら、不思議なことにプログラムが最後まで進みました。
変数の値を変更することもしないはずなのになぜおこるのでしょうか?
そしてSegmentation faultが出る原因はどのようにしたらよいのでしょうか?

69 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:49:08 ]
不正なメモリにアクセスしにいったときに関係ないデバッグ文で動くようになったりするよ。

宣言文、引数の整合性など、幅広く探すこと。

落ちた場所だけ見ても解決しないことが多いよ。

70 名前:68 mailto:sage [2008/01/08(火) 01:05:36 ]
な、なるほど。ありがとうございました。色々洗ってみることにします。



71 名前:デフォルトの名無しさん mailto:sage [2008/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)
{
  ...
}
-----------------
xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_03_05.htm
このサイトを参考にしましたが、
第1引数と第2引数の文字列の取得ができません。
なにがまちがっているのでしょう。。。
すみません。だれかおしえてください。

72 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:31:13 ]
すみません。まちがえました。
>!DEC$ ATTRIBUTES VALUE :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
です。

だれかおしえてください。。。。

73 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:02:34 ]
INTERFACE文を書いて、仮引数を定義しましょう

74 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:30:53 ]
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1=0.12

76 名前:デフォルトの名無しさん [2008/01/17(木) 14:32:18 ]
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1= 0.12
のように=と数値の間に半角スペースが一つ入ってしまいます。これをなくすことはできないんでしょうか?


途中で投稿してしまいました。すみません。

77 名前:デフォルトの名無しさん [2008/01/18(金) 00:58:57 ]
>>76
FORMATを使え!


78 名前:76 mailto:sage [2008/01/19(土) 00:29:52 ]
な、なるほど。ありがとうございます。色々みてみます。

79 名前:デフォルトの名無しさん [2008/01/20(日) 20:22:50 ]
出力しようとすると、ハンドルされてない例外が発生しました。
ってでるんだけどどうすればいいでしょうか?

80 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:52:10 ]
>>79
エラーメッセージを貼ってくれ。




81 名前:デフォルトの名無しさん [2008/01/20(日) 20:56:09 ]
>>80
コンパイルにエラーはないんですが、出力しようとすると、新しい画面がでてきて、
ハンドル・・・とでるんです。

82 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:47:51 ]
その「新しい画面」の内容を何とか工夫して伝えないと
伝わらないぞ

83 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:09:44 ]
>>81
それがランタイムエラーだっちゅーの。

エラーメッセージは省略せず一字一句表示された通り書け。
使ってるOSとコンパイラの種類もな。

84 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 11:38:50 ]
>>84
すでに標準出力をデフォの6番に割る振っているのだから、この上5番までも割り振ることは出来ない。
ただ、UNIXとかだとerr出力を割り振ったりできるのでCVFで絶対出来ないとは言わない。
マニュアル読めば出来るかもしれない。

しかし、ここは素直にコピーを作って、それのWRITE(5 をWRITE(6,に置換すれ。
目的はそれで達成できる。
オリジナルをいじると元に戻せなくなるので注意w


86 名前:デフォルトの名無しさん [2008/01/23(水) 14:48:20 ]
>85氏
返答どうもありがとうございました。
指示通り、プログラムのコピーを作成し、マニュアルを探って検証した結果うまくいきました。

方法はすごく単純で、以下のように書き換えるだけでした。

:
OPEN (5,FIEL = 'OUTPUT.dat')
OPEN (6,FILE = 'CON')
:
WIRTE (6,*) Func1, Func2,
:

と書き加えたところ、コマンドプロントへ結果が出力されました。

ご教授ありがとうございます!

87 名前:デフォルトの名無しさん [2008/01/23(水) 15:45:53 ]
f77をしようしています。

2つの整数の約数と、最大公約数と最小公倍数を求めるという
プログラムを書いてもらえませんか?

88 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:40:48 ]
>>87
最大公約数 最小公倍数 fortran でググレ

89 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:51:56 ]
>>87
素直に宿題で出ました。困ってます
と書いたら、誰か書くかも。

90 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:00:34 ]
宿題は自分でやれ



91 名前:88 mailto:sage [2008/01/27(日) 14:55:01 ]
>>87
最大公約数 最小公倍数 fortran でググったのか?
検索結果の一番上に出てくるが。

92 名前:デフォルトの名無しさん [2008/01/28(月) 17:49:50 ]
自分も宿題なんですけど質問します
数値積分で、n個の台形の総和で近似する場合のプログラムなんですけど、
繰り返し文使いますよね?
DOからCONTINUEの間に、面積の総和をSWA、何番目かの台形の面積をSとして
SWA=SWA+S
って書き込みました
SWA=0.0みたいにSWAを初期化する言葉は必要ですか?
家のパソコンではプログラミングできないので教えてください

93 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:38:46 ]
FORTRAN の仕様としては初期化は必要ないが、
中には 0 初期化してくれないコンパイラもあるので
初期化しておいた方が無難。

94 名前:88 mailto:sage [2008/01/28(月) 21:45:51 ]
>>93
むしろ、subroutine 化したときの暗黙save属性の方が怖くない?
オレは A = A + B 型の処理があれば、
脊髄反射でA = 0d0 を加える癖にしている。

95 名前:92 mailto:sage [2008/01/28(月) 22:19:21 ]
レスどうもです
初期化したほうが良さそうですね
失礼します

96 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:37:58 ]
fortranのプログラムを書くソフトは何を使えばいいのでしょうか?
講義では秀丸をつかってたのですが有料で買えません。
代わりのソフトウェアは何をつかえばいいのでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:04:49 ]
>>96
汎用フリーエディターなら、TeraPad
www5f.biglobe.ne.jp/~t-susumu/
をよく聞くね。

CPad for Salford FTN77
www.vector.co.jp/soft/win95/prog/se153699.html
なんてどう?

98 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:30:49 ]
>>93
FORTRANの規格では初期値は不定じゃなかったけ?
IBM育ちなので、方言なのかもしれんが。
おすえて。


99 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:53:37 ]
>>97
ありがとうございました。
下のリンクのほうつかってみます。




100 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:57:34 ]
fortran77をダウンロードしセットアップして再起動したのですが、
すべてのプログラムのsalford software というところには
デバッッカー(?)と説明文みたいなものだけでfortran77本体らしきものが
ありません。
何か問題があるのでしょうか?








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef