くだすれFORTRAN(超初心者用)その3
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/11/30(金) 09:55:26もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
●関連スレ
FORTRAN �W
http://pc8.2ch.net/test/read.cgi/tech/1163319215/
0002デフォルトの名無しさん
2007/11/30(金) 09:58:450003デフォルトの名無しさん
2007/12/01(土) 00:21:420004デフォルトの名無しさん
2007/12/01(土) 22:19:53A 内部ファイルを使う。
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
0005デフォルトの名無しさん
2007/12/02(日) 23:07:06はどうなったの?
0006デフォルトの名無しさん
2007/12/03(月) 01:07:59回答としては前スレでもレスがあったけど
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')
などの方法があるけど
あとは質問者の環境ややりたいことにもよるんで
これ以上はにんともかんとも
0007デフォルトの名無しさん
2007/12/06(木) 01:18:27もしくはそれ以外なのかを明記した方が、より適切な回答が得られるかもしれません。
どちらなのか分からない場合以下にF77とF90の特徴をまとめたので参考にして下さい。
F77
固定形式:1〜5桁は文番号、6桁は継続行の印、7〜72桁と桁ごとに書く内容が決まっています。
非構造化言語:昔ながらのGO TO文を多用したプログラムが書けます。
拡張子:.f .for
F90
自由形式:132桁以内なら、どの桁に何を書くと言うような制限はありません。
構造化言語:DO WHILE文などが追加されGO TO文を使わないプログラムが書けます。
拡張子:.f90
何となく作ってみた。丁寧な言葉使いは調子が狂ってよくねえ
0008デフォルトの名無しさん
2007/12/06(木) 13:04:21左にCをたくさん書くと思うのですが
これは何を表しているのでしょうか?
また、何の頭文字なのでしょうか?
0009デフォルトの名無しさん
2007/12/06(木) 13:26:47行頭のCはFORTRAN77でコメント入れるときに使う。
0010デフォルトの名無しさん
2007/12/06(木) 13:44:14回答ありがとうございます。
初心者質問で申し訳ないのですが
もう少しおつきあい願えないでしょうか?
まず、Σの計算をしたい場合、やはり
do 10 I=1,10
z=z+f[i]
10 continue
というような記述が必要なのですよね?
これをもっと簡単な記述にすることは出来ないのでしょうか?
また合計する範囲が1〜∞の場合どうやって記述すれば良いのでしょうか?
0011デフォルトの名無しさん
2007/12/06(木) 15:16:29「ふっふっ。 きみのような がくせいに ふさわしい がっこうを わしは おもいだしたぞ!。
それは こうぎょうがっこう という がっこうじゃ。 きみの しりたいことは なんでも おしえてくれる!」
001210
2007/12/06(木) 18:33:14お願い致します。
0013デフォルトの名無しさん
2007/12/06(木) 18:43:3510 z = z + f(i)
i = i + 1
goto 10
0014デフォルトの名無しさん
2007/12/06(木) 18:59:49>Σの計算をしたい場合
ここら辺は手続き型言語であれば多少の差はあれ同じ様な記述になる。
まあ、Fortran90以降で
z = sum(f(1:10))
とかやる手も有るがな。
>合計する範囲が1〜∞の場合どうやって記述すれば良いのでしょうか?
そもそもコンピュータは離散的な値を有限個しか取り扱えないので
「1〜∞」をそのまま記述するのは無理。
代わりに問題に対して「十分大きな値」を使ったりしてコンピュータで
処理できるような形にして計算させる。
>>13
^C
0015デフォルトの名無しさん
2007/12/07(金) 20:22:46改善策がわかりませんので、ご教示ください
http://www.pen2so.com/upload/src/up1130.jpg
0016デフォルトの名無しさん
2007/12/07(金) 20:37:35ブラクラ危険
0017デフォルトの名無しさん
2007/12/07(金) 20:47:48え?あれ?ちゃんとうpできてませんでしたか?すいませんでした。
どこにあげればよいのかよくわからなくて変なところにあげてしまいました。
0018デフォルトの名無しさん
2007/12/08(土) 03:21:15> Missing ( from complex number
複素数は実部と虚部を括弧で囲んで表す。
(0.0, 1.0)
0019デフォルトの名無しさん
2007/12/10(月) 02:00:46Fortranというよりは数値計算の分野の質問かも知れませんが、
もし経験者がいらっしゃいましたらご教授いただきたく存じます。
ほぼスレ違いですが失礼します。
現在Fortran90で6段5次ルンゲ・クッタ-フェールベルグ公式による常微分方程式計算をしているのですが、
誤差が小さいとされるこの公式がを自前でプログラム作成しましたところ、
それまでに使用していた4段4次ルンゲ・クッタ法より遥かに大きな誤差が出てしまいました。
係数の誤りは何度も確認しましたがそのようには思えません。
他に考えられる原因はありますでしょうか。
0020デフォルトの名無しさん
2007/12/11(火) 01:45:03ものすごく荒く言えば、滑らかな曲線だと微係数を増やしたほうがよりよく予測できるが、
カクッと曲がったりフラフラ振動する曲線の場合あんまり予測のための点数を増やすと
かえってとんでもないところを予測したりする。
(ステップ幅のスケールで見ての話だが)
この手の話は、微分方程式の数値解法の本に載っている。
漏れは非専門なので詳しくは本で調べてね。
嘘だったらゴメンw
0021デフォルトの名無しさん
2007/12/11(火) 15:01:10データ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
0022デフォルトの名無しさん
2007/12/11(火) 16:44:03正確には何文字なのでしょうか?
また、もし入りきらなかった場合にはどうやって二行に分けて書けば良いのでしょうか?
0023デフォルトの名無しさん
2007/12/11(火) 21:20:14実数変数に '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 か
空白以外の文字を書けばその行に続きを書ける。
これくらいの情報はほとんどの入門書の最初の方に載っているので
自分で調べられるようにならないといかん。
0024kidding
2007/12/11(火) 23:07:34>固定形式は 7〜73桁
俺が持ってる教科書には
>文は第7桁目〜第72桁目に書き
とあるのですがこの教科書ミスってるんですかね?
頭が悪くてどうなのか自分では調べられません(><)
0025デフォルトの名無しさん
2007/12/12(水) 06:59:54なぜそんな制限があるのかはこれを見れば分かる。
ttp://www.eecis.udel.edu/~mills/gallery/gallery9.html
ttp://www.eecis.udel.edu/~mills/pic/ibmcard.jpg
0026デフォルトの名無しさん
2007/12/12(水) 11:24:29ありがとうございます。
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
わかるかたいましたらよろしくお願いします。
0027デフォルトの名無しさん
2007/12/12(水) 11:31:41もう少し、具体的に「かくかくしかじかになるはずが、これこれこうこうと成って、おかしいです」と
いった具合に聞かないと、答えるほうも面倒で考える気がしない。
情報をもっと付加してくれ。
0028デフォルトの名無しさん
2007/12/12(水) 11:43:05そのとうりですね。
データ2から読み込んだa1(k)の値がx1(i)とx2(i)の間に、
a2(k)の値がy1(i)とy2(i)の間にふたつともくるときz1(i)とz2(i)を表示しなさい。
という風なプログラムを作りたいんです。
しかしオープンしたファイルには何も表示されません。
できていればk個のz1(i)とz2(i)が表示されているはずです。
よろしくお願い致します。
0029デフォルトの名無しさん
2007/12/12(水) 21:43:25既存ソースを書き換え中なのですが、
教えてください。
以下のソースだと、メインソースでintfuncが宣言されていないと
コンパイル時にエラーが出ますが、
自分で作成した関数の定義はどのように宣言すればいいのでしょう?
0030デフォルトの名無しさん
2007/12/12(水) 21:44:00implicit 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
サンプルなので、特に意味ある処理をしてあるわけじゃないですが、、。
0031デフォルトの名無しさん
2007/12/12(水) 22:19:26read(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
0032デフォルトの名無しさん
2007/12/13(木) 01:12:00ありがとうございます。
ってことは、iのdoループをなくしてkのdoループのみにしたらよいという事ですか?
そして、formatを書かずに読み込ませれば良いでしょうかね?
ちなみに26番の「do 30 i=1,144 」は間違いで、iではなくkです。
0033デフォルトの名無しさん
2007/12/13(木) 01:38:20いやちがうw
kに何の値も与えられていないのは無論問題だし、フォーマットとデータが対応していないのも問題だが
(単に2chに貼った時にスペースが削られたのかもしれないが),
z1,z2を整数にしないとフォーマット文と整合しないのでおかしな値が入ると思う。と言いたかった。
ついでにiのdoLoopの内か外にkのDoLoopも必要だろう。
0034デフォルトの名無しさん
2007/12/13(木) 05:01:53integer, external :: intfunc
をメインプログラムにいれるとおk
0035デフォルトの名無しさん
2007/12/13(木) 11:45:45ありがとうございます。
今のところ作っているプログラムはこんな感じなんですが
しっかり読み込めているか確認のためにa1(k)とa2(k)をwriteしようとしましたが、
a1(1)とa(2)までしかwriteされません。
doループの場所を変えれば全て表示されます。
↓↓↓
0036デフォルトの名無しさん
2007/12/13(木) 11:46:32program 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
0038デフォルトの名無しさん
2007/12/14(金) 02:00:05EXTERNALでもいいが、F90式で行くなら、INTERFACEを書くほうがベター。
0039デフォルトの名無しさん
2007/12/14(金) 03:56:51たしかにそうですね。手抜きを教えてすみませんでした
>>37
パソコンがあればgfortranでちょっとしたテストコードは
試せますよ。Linux,Win始めいろんなOS用のバイナリがある
http://gcc.gnu.org/wiki/GFortran
0040デフォルトの名無しさん
2007/12/15(土) 00:25:07外側のループを1回終えた時点でjegm.txtのデータを全て読み終えてる。
0041デフォルトの名無しさん
2007/12/19(水) 00:15:39米軍の演習でもやっているのか?
0042デフォルトの名無しさん
2007/12/19(水) 00:16:28ABEND
0043デフォルトの名無しさん
2007/12/19(水) 00:36:560044デフォルトの名無しさん
2007/12/19(水) 12:38:42紀伊国屋や丸善クラスの大型書店 または アマゾン
0045デフォルトの名無しさん
2007/12/20(木) 11:20:29program 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でコンパイルして動いたそうなのですが・・・
コンパイルオプション等の指定で解決できると思うのですが,
何かアドバイス頂けませんでしょうか?
0046デフォルトの名無しさん
2007/12/20(木) 12:31:45Fortran90的にはエラーだから素直に書き直せw
FORTRAN77的にはありだが。
0047デフォルトの名無しさん
2007/12/20(木) 12:38:35もともとは77で書いてあったコードなんですよね.
説明用のサンプルをいつものくせで90で書いてしまいました.
コードの量が膨大なものでできればそのまま使いたいんですよー
ちなみに再コンパイルするのはCore2Duo用の最適化のためです.
どうか方法教えて頂けませんでしょうか?
0048デフォルトの名無しさん
2007/12/21(金) 00:58:27元コードがF77なら話は通る。
>>45でCVFで通ったと書いてあったが、通るわけないので勘違いだと思っていた。
解決法は簡単で、サブルーチンと呼び出しルーチンを別ファイルにして、分割コンパイルされるように
すればいい。多分、元は別ファイルになっていたのをまとめたりしているのでは?
F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
無いのでエラーは出ないはず。
同一ファイル内に書いてあると、コンパイラが親切にも引数の整合性チェックなどをしてくれる。
004948
2007/12/21(金) 01:00:28>F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
>無いのでエラーは出ないはず。
F77なら"分割コンパイル時や”リンク時の引数チェックは何もしないので
0050デフォルトの名無しさん
2007/12/21(金) 09:48:30データから、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)
としてもうまくいきません。
超初歩かもしれませんがほんとわからないです。アドバイスお願いします。
0051デフォルトの名無しさん
2007/12/21(金) 13:59:25read(1,*) x(i),y(i),z(i)
0052デフォルトの名無しさん
2007/12/21(金) 14:12:39ありがとうございました.
解決しました.
0053デフォルトの名無しさん
2007/12/21(金) 16:55:41do i = 1, 2
read(1,*) xdum, y(i), zdum
enddo
>>51
それって1「行」目を読み飛ばしてるのでは・・
005450
2007/12/21(金) 21:29:14>>51
「列」方向(縦方向)のデータを取り出す方法なんですが…
>>53
ダミー…考えはしたんですが、いいのかどうか迷ってました。
書いていただいて自信が持てました。ありがとうございます。
0055デフォルトの名無しさん
2007/12/21(金) 22:23:51出力した値をエクセルに貼り付けたいと思っているのですが、出力方法がコマンドプロンプトに表示する方法しかわからず困っています。
出力した値をメモ帳などに保存する方法はないのでしょうか?
0056デフォルトの名無しさん
2007/12/21(金) 22:40:56WRITE文の出力先をファイルに変更する。
手っ取り早くやりたかったら、リダイレクトで
hoge.exe > output.txt
0057デフォルトの名無しさん
2007/12/21(金) 23:01:08できました!ありがとうございます。
0058デフォルトの名無しさん
2007/12/27(木) 19:38:50関数 Function f(x,y)
F=
Return
end
であらわすにはどうしたらいいのでしょうか? 77です。
0059デフォルトの名無しさん
2007/12/27(木) 20:11:36ホームを表す~ですが、Intelコンパイラだと解釈してくれますが、PGIだとしてくれませんよね。
何気に不便なのですが、何か方法ないでしょうか?
0060デフォルトの名無しさん
2007/12/27(木) 21:33:450062デフォルトの名無しさん
2008/01/03(木) 02:58:13interface文での総称指定がどうもうまく行きません。
あまり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は出てきません
0063デフォルトの名無しさん
2008/01/03(木) 03:02:14interface 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
0064デフォルトの名無しさん
2008/01/03(木) 03:09:07ごめんなさい
0065デフォルトの名無しさん
2008/01/03(木) 13:13:51コピペしたあと再編集が必要なのがめんどいけど
0066デフォルトの名無しさん
2008/01/03(木) 13:25:10module 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
・・・
006762
2008/01/03(木) 16:05:13ありがとうございます! どちらの方法でもできました!
管理のしやすさなら、後者の方法で書きためて行った方がよさそうですね。
分野毎にmoduleで分けて、1module1ファイルで。
これで大体わかったので、色々と役に立ちそうなものを書いていけます。
ありがとうございました。
0068デフォルトの名無しさん
2008/01/07(月) 11:55:29Segmentation fault (core dumped)
というエラーが出て止まってしまいます。
そこで原因を探ろうと
write(*,*)'OK'
見たいなのを打ち込んでいたら、不思議なことにプログラムが最後まで進みました。
変数の値を変更することもしないはずなのになぜおこるのでしょうか?
そしてSegmentation faultが出る原因はどのようにしたらよいのでしょうか?
0069デフォルトの名無しさん
2008/01/07(月) 19:49:08宣言文、引数の整合性など、幅広く探すこと。
落ちた場所だけ見ても解決しないことが多いよ。
007068
2008/01/08(火) 01:05:360071デフォルトの名無しさん
2008/01/11(金) 14:04:11FORTRANから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)
{
...
}
-----------------
http://xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_03_05.htm
このサイトを参考にしましたが、
第1引数と第2引数の文字列の取得ができません。
なにがまちがっているのでしょう。。。
すみません。だれかおしえてください。
0072デフォルトの名無しさん
2008/01/11(金) 16:31:13>!DEC$ ATTRIBUTES VALUE :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
です。
だれかおしえてください。。。。
0073デフォルトの名無しさん
2008/01/11(金) 19:02:340074デフォルトの名無しさん
2008/01/12(土) 13:46:06interface
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
0075デフォルトの名無しさん
2008/01/17(木) 14:30:53write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1=0.12
0076デフォルトの名無しさん
2008/01/17(木) 14:32:18write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1= 0.12
のように=と数値の間に半角スペースが一つ入ってしまいます。これをなくすことはできないんでしょうか?
途中で投稿してしまいました。すみません。
0077デフォルトの名無しさん
2008/01/18(金) 00:58:57FORMATを使え!
007876
2008/01/19(土) 00:29:520079デフォルトの名無しさん
2008/01/20(日) 20:22:50ってでるんだけどどうすればいいでしょうか?
0080デフォルトの名無しさん
2008/01/20(日) 20:52:10エラーメッセージを貼ってくれ。
0081デフォルトの名無しさん
2008/01/20(日) 20:56:09コンパイルにエラーはないんですが、出力しようとすると、新しい画面がでてきて、
ハンドル・・・とでるんです。
0082デフォルトの名無しさん
2008/01/20(日) 21:47:51伝わらないぞ
0083デフォルトの名無しさん
2008/01/20(日) 22:09:44それがランタイムエラーだっちゅーの。
エラーメッセージは省略せず一字一句表示された通り書け。
使ってるOSとコンパイラの種類もな。
0084デフォルトの名無しさん
2008/01/22(火) 07:41:38言語Ver :Fortran77+Fortran90(混在状態)
OS :Windows 2000
の上記の開発環境があります。
質問はプログラムを走らせたとき、途中の過程がどこまで行われたか知りたいと考えています。
上記のソフトでFortranを実行したときコマンドプロントが出るのですが、ここに計算課程を表示させたいです。
現在のプログラム内では結果の出力にWRITE文を使用し、OPEN文で出力装置を宣言させています。
私はOPEN文の出力装置の宣言をコマンドプロントに変えることで実行できると考えています。
しかし、出力装置の宣言にコマンドプロントを宣言する方法がわかりません、どなたかご教授お願いいたします。
ちなみに現在は以下のように使用しています。
:
OPEN (5,FIEL = 'OUTPUT.dat')
:
WIRTE (6,*) Func1, Func2,
:
どなたかお願いいたします。
0085デフォルトの名無しさん
2008/01/22(火) 11:38:50すでに標準出力をデフォの6番に割る振っているのだから、この上5番までも割り振ることは出来ない。
ただ、UNIXとかだとerr出力を割り振ったりできるのでCVFで絶対出来ないとは言わない。
マニュアル読めば出来るかもしれない。
しかし、ここは素直にコピーを作って、それのWRITE(5 をWRITE(6,に置換すれ。
目的はそれで達成できる。
オリジナルをいじると元に戻せなくなるので注意w
0086デフォルトの名無しさん
2008/01/23(水) 14:48:20返答どうもありがとうございました。
指示通り、プログラムのコピーを作成し、マニュアルを探って検証した結果うまくいきました。
方法はすごく単純で、以下のように書き換えるだけでした。
:
OPEN (5,FIEL = 'OUTPUT.dat')
OPEN (6,FILE = 'CON')
:
WIRTE (6,*) Func1, Func2,
:
と書き加えたところ、コマンドプロントへ結果が出力されました。
ご教授ありがとうございます!
0087デフォルトの名無しさん
2008/01/23(水) 15:45:532つの整数の約数と、最大公約数と最小公倍数を求めるという
プログラムを書いてもらえませんか?
0088デフォルトの名無しさん
2008/01/23(水) 18:40:48最大公約数 最小公倍数 fortran でググレ
0089デフォルトの名無しさん
2008/01/26(土) 23:51:56素直に宿題で出ました。困ってます
と書いたら、誰か書くかも。
0090デフォルトの名無しさん
2008/01/27(日) 00:00:340092デフォルトの名無しさん
2008/01/28(月) 17:49:50数値積分で、n個の台形の総和で近似する場合のプログラムなんですけど、
繰り返し文使いますよね?
DOからCONTINUEの間に、面積の総和をSWA、何番目かの台形の面積をSとして
SWA=SWA+S
って書き込みました
SWA=0.0みたいにSWAを初期化する言葉は必要ですか?
家のパソコンではプログラミングできないので教えてください
0093デフォルトの名無しさん
2008/01/28(月) 21:38:46中には 0 初期化してくれないコンパイラもあるので
初期化しておいた方が無難。
009488
2008/01/28(月) 21:45:51むしろ、subroutine 化したときの暗黙save属性の方が怖くない?
オレは A = A + B 型の処理があれば、
脊髄反射でA = 0d0 を加える癖にしている。
009592
2008/01/28(月) 22:19:21初期化したほうが良さそうですね
失礼します
0096デフォルトの名無しさん
2008/01/28(月) 22:37:58講義では秀丸をつかってたのですが有料で買えません。
代わりのソフトウェアは何をつかえばいいのでしょうか?
0097デフォルトの名無しさん
2008/01/28(月) 23:04:49汎用フリーエディターなら、TeraPad
http://www5f.biglobe.ne.jp/~t-susumu/
をよく聞くね。
CPad for Salford FTN77
http://www.vector.co.jp/soft/win95/prog/se153699.html
なんてどう?
0098デフォルトの名無しさん
2008/01/28(月) 23:30:49FORTRANの規格では初期値は不定じゃなかったけ?
IBM育ちなので、方言なのかもしれんが。
おすえて。
0099デフォルトの名無しさん
2008/01/29(火) 07:53:37ありがとうございました。
下のリンクのほうつかってみます。
0100デフォルトの名無しさん
2008/01/29(火) 07:57:34すべてのプログラムのsalford software というところには
デバッッカー(?)と説明文みたいなものだけでfortran77本体らしきものが
ありません。
何か問題があるのでしょうか?
0101デフォルトの名無しさん
2008/01/29(火) 12:55:24Cpadを使え
0102デフォルトの名無しさん
2008/01/29(火) 15:59:59文番号などを使わない形に書き換えようとしています。
自分でやってみたのですが一部分からないところがあったのでみていただきたいと思います。
0103102
2008/01/29(火) 16:01:49do 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)
略
0104102
2008/01/29(火) 16:02:19if (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
0105102
2008/01/29(火) 16:10:06条件文以外は削除しております。
doループの80,90やgoto80などは何とか分かったのですが
goto70や、goto554がどうなってるのかがさっぱりで・・・
申し訳ないですがアドバイスお願いします。
先ほどの投稿では書き忘れてましたが
最後の方にある文番号85に関しては無視していただいて結構です。
探して見たところどこにもgoto85はなかったので
本のコードにゴミが残っていたと思われます。
0106デフォルトの名無しさん
2008/01/29(火) 17:36:49f90 を使っていいかどうかと、使用コンパイラーを書こう。
f77 では、cycle exit が(標準では)使えない。
0107105
2008/01/29(火) 17:57:47一応はFortran77なのですが
コンパイラはg77なのでcycle,exitなどは使えたと思います。
0108デフォルトの名無しさん
2008/01/29(火) 18:44:49554の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)
略
0109デフォルトの名無しさん
2008/01/29(火) 18:45:10if (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
0110デフォルトの名無しさん
2008/01/30(水) 11:06:4011と12のdoループは、
je=jとje=0の両方が真になることがあれば,合併不可
常に、少なくとも一方は「10回全て偽」になれば、合併可
0111105
2008/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)
にしてもいいのかな、と思ったのですが。どうでしょうか?
0112デフォルトの名無しさん
2008/01/30(水) 17:26:11111のプログラムは間違い。
je(i,7)=j je(i,3)=0 それ以外は偽、のとき、
jkに何が入るべきか、考えてごらん。
je の取りうる値がわからないので、
この部分だけでは判断できない。
多分、合併はダメ。
0113デフォルトの名無しさん
2008/02/02(土) 18:24:44open(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の状態だと問題なく走ります。
お助け下さい
0114デフォルトの名無しさん
2008/02/02(土) 18:36:34do i=1,ii
read(40,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)
0115デフォルトの名無しさん
2008/02/02(土) 19:11:48>>4 内部ファイルを参考にする。
Intel 系コンパイラなら、書式に<>が使える。
number = 144
4000 format(A7,<number>F8.2)
0116デフォルトの名無しさん
2008/02/02(土) 22:06:06character(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桁それぞれ別書式にする場合に使ってる。
0117デフォルトの名無しさん
2008/02/03(日) 01:45:46これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。
漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。
他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw
改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。
文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw
0118デフォルトの名無しさん
2008/02/03(日) 13:36:12数値を上手く取り扱う方法に目がいって
その辺の所は教科書書く人も勉強する人も興味ない。
0119デフォルトの名無しさん
2008/02/03(日) 14:25:45>>116
無事にいけました☆本当にありがとうございました!
0120デフォルトの名無しさん
2008/02/03(日) 18:55:37読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。
まぁ、
1.フォーマット文が文字列や文字変数で与えられる。
2.内部ファイルによって、文字列⇔数値変換が出来る。
という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。
0121デフォルトの名無しさん
2008/02/03(日) 20:23:33・VB やJAVA のようにさまざまな発刊企画があれば、
上級者向け書籍が作れるが、Fortran では無理。
・初心者向け書籍では、内容を厳選するよう要請される。
頁数を少なく、文字数を少なく、挿し絵を充実、などなど。
common や内部ファイルは真っ先に削除対象となる。
0122デフォルトの名無しさん
2008/02/03(日) 20:27:04純粋なFortran95の解説書出してよー
F2003でもいいけど
0123デフォルトの名無しさん
2008/02/03(日) 20:55:12F95 だとバグを産む素でしかない。
0124デフォルトの名無しさん
2008/02/03(日) 21:35:44コラムとか付録のサンプルとかで、何とか突っ込んでくれ。
0125デフォルトの名無しさん
2008/02/04(月) 00:53:35character(len=20):: fmt
fmt = 'A5,2X,I10'
100 format(fmt)
って例が載っているだけでも、
あーこんな使い方できるんだ〜
って思えるよなあ。
0126118
2008/02/04(月) 01:00:23質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、
より実用的、応用的なプログラムを組んでる人だと思うんだよね。
Fortranは数値計算とセットでやる事が多いだろうから
優秀な大学じゃないと内部ファイルまでやれないよ。
無理してそこまでやっちゃったら、大切な部分が疎かになったり
数%しか単位取れませんでしたとか言う事態になっちまう。
0127デフォルトの名無しさん
2008/02/04(月) 16:50:31こんなエラーが出るんですが何がいけないんでしょう?
0128デフォルトの名無しさん
2008/02/04(月) 18:59:120129デフォルトの名無しさん
2008/02/04(月) 19:58:45invalid forward reference to label 117
>>128ありがとうございます
ちなみにこれはどうすればいいんでしょう?
0130デフォルトの名無しさん
2008/02/04(月) 21:17:37文関数はここに存在することが出来ません
実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。
配列や関数の引用の書き方が間違っている可能性もある。
>invalid forward reference to label 117
ラベル117の無効な前方参照
文番号117が参照されているが見つからない。
どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので
エラーメッセージは自分でよく読むように習慣づけよう。
0131デフォルトの名無しさん
2008/02/05(火) 01:17:27>>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
0132デフォルトの名無しさん
2008/02/05(火) 07:36:18俺なら「おまえの頭」っていうところだけどな
0133デフォルトの名無しさん
2008/02/05(火) 11:07:31うっせー おまえこそ すっこんでろ!w
ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!
0134デフォルトの名無しさん
2008/02/06(水) 02:24:45アプリケーションを作れたりするプログラミング言語なんですか?
0135デフォルトの名無しさん
2008/02/06(水) 10:59:570136デフォルトの名無しさん
2008/02/07(木) 15:48:50WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・
0137デフォルトの名無しさん
2008/02/07(木) 20:42:45だけど、コーディングをLinuxでやる必要はないので、
そんなに大変じゃないと思う。
コンパイルオプションをLinux版に変えるだけで
頑張ってMakefile書くくらいで終わりっしょ。
特にVisual Studio + Intel fortran
から
Intel fortran Linux
に行くだけなら
つまづくこともかなり少ないと思われ。
0138デフォルトの名無しさん
2008/02/07(木) 21:12:16別に Windows 上でも Linux 用のバイナリを作ることはできるが、
Visual Studio 上となると・・・。
自分で makefile 書けば一応いけるのか?
まあ、一番の問題はデバッグが大変ってことか。
0139デフォルトの名無しさん
2008/02/07(木) 22:58:550140136
2008/02/08(金) 00:16:57ということはWindowsとLinux両方買わないといけない、ってことですよね?
コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・
>>138
gccはGNUなだけにその辺偉いのですが、速度が・・・
数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。
0141136
2008/02/08(金) 00:21:06出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?
0142デフォルトの名無しさん
2008/02/08(金) 01:52:57学術目的ならLinux版は無期限ライセンス版が落とせる。
>>141
普通のEXEバイナリを吐く。
0143136
2008/02/08(金) 10:07:16>学術目的ならLinux版は無期限ライセンス版が落とせる。
↓ですね。
ttp://www.intel.com/cd/software/products/ijkk/jpn/224378.htm
コンパイラ以外も可とは、気前いいですね。
ただ、いくつかはPage Not Foundになってたりしますが・・・
>普通のEXEバイナリを吐く。
そうですよね、安心しました。
そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ
どうもありがとうございました。勉強になりました。
0144デフォルトの名無しさん
2008/02/08(金) 19:45:07Intelのほうが速いから?
0145デフォルトの名無しさん
2008/02/08(金) 23:58:28FORTRANと組み合わせるならIntelC++の方が楽。
BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。
またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。
無論C++でWin32API叩いたりするならMSの方が有利だろう。
0146デフォルトの名無しさん
2008/02/09(土) 01:56:22なるほど
thxです
0147デフォルトの名無しさん
2008/02/11(月) 17:58:08vimで.f90のソースを書いていると、
勝手にインデントをスペースに置き換えられるんですよね。
まあnoexpandtabすればタブ文字で書けるんですが、
syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。
これもsyntaxファイルを改変すれば変えられるのでしょうけど。
fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?
0148デフォルトの名無しさん
2008/02/11(月) 20:12:211行72文字とか132文字とか制限があるのに
何文字にカウントされるか分からないタブ文字を使うなんて
プラットフォーム依存性を無駄に招いているとしか思えない
0149147
2008/02/11(月) 20:42:23なるほど。文字数の制限があるからですね。
fortran90から入ったので、
ほとんど文字制限を気にした事が無かったから気づきませんでした。
ありがとうございました。
0150デフォルトの名無しさん
2008/02/11(月) 21:25:04> 常識
> 1行72文字とか132文字とか制限があるのに
f90 は自由形式だからその制限は無いはず。
f77 は制限アリ。
0151デフォルトの名無しさん
2008/02/11(月) 21:50:24文法書をもう一度読め。
Fortran90は132カラムだ。
Fortran2003ではもう少し増やす。機械生成のコードだと、変数名などが長くなりやすいから。
それにしてもインデントでタブが入るエディターは本当にむかつく。
0152デフォルトの名無しさん
2008/02/11(月) 21:55:050153デフォルトの名無しさん
2008/02/12(火) 00:05:18他のコンパイラも大概独自で対応しているんじゃないかな。
0154デフォルトの名無しさん
2008/02/12(火) 10:37:30ttp://www.nag-j.co.jp/FortranBuilder.htm
他社A他社Bってどこでしょうかね?
0155デフォルトの名無しさん
2008/02/12(火) 12:19:44まぁ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
0156デフォルトの名無しさん
2008/02/12(火) 13:54:10エディターの一行表示上限が94文字しかないオレ様にしてみれば、
132文字も7200文字も無限と同じ。
0157デフォルトの名無しさん
2008/02/12(火) 17:17:43みなさんオブジェクトの依存関係とか、どうやって調べてますか?
基本的に1ファイルに1個モジュールで書いてるから
use文を抽出さえすれば簡単にできそうか
0158デフォルトの名無しさん
2008/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
0159デフォルトの名無しさん
2008/02/13(水) 16:52:020160デフォルトの名無しさん
2008/02/13(水) 17:24:29assignment between arrays of differing rank
0161デフォルトの名無しさん
2008/02/13(水) 17:38:11Vista + Cygwin + gfortran or g95
0162デフォルトの名無しさん
2008/02/14(木) 00:50:54Silverfrost の FTN95 かな。Vistaで動くかは知らんがw
ttp://www.silverfrost.com/11/ftn95/overview.asp
>>160
配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。
0163デフォルトの名無しさん
2008/02/16(土) 22:44:10使いたいのですがエラーがでてしまいます。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
0164デフォルトの名無しさん
2008/02/17(日) 01:23:42記憶が正しければ、それは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をカスケードに呼んだが
0165デフォルトの名無しさん
2008/02/17(日) 11:02:41計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって
何て言う名前ですか?フリーウェアですか?
0166デフォルトの名無しさん
2008/02/17(日) 12:10:40それはジョブ管理システムというものだ。
ググレばなんか出てくるだろう。
普通はメーカー毎・OS毎に独自のものがある。
LinuxとかだとLSFというのが主流の気がする。
UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。
0167165
2008/02/17(日) 14:40:22ググって色々調べてみたところ「Generic NQS」ってのが
フリーみたいですね。
自宅で数値計算をして遊んでみようと思いまして(;^_^A
どうも返答有り難うございました。
0168デフォルトの名無しさん
2008/02/17(日) 17:25:42プロトタイプができているので、興味がある人は見てみてください。
ttp://d.hatena.ne.jp/fortran66/
やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、
普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。
変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。
大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと
思っています。
0169163
2008/02/17(日) 23:44:38丁寧なご回答どうもありがとうございます!! 返信が遅くなり
申し訳ございません。今、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
0170163
2008/02/17(日) 23:45:55サイズ n を下記のように入力データのようなものから動的に取得して
構造体の確保を実現させようと考えておりました。
下記のようなプログラムの構造体バージョンが目標でした。
下記の配列バージョンだと確保した配列全部をサブルーチンの
引数でひきずっていかなければならないと思うのですが構造体で
定義しておけば配列をパックにした構造体 1 つを引数で渡せると
考えました。
164 さんに教えて頂いたプログラムの MODULE m_type での
構造体の中の要素のサイズ n は、動的(データで決定)ではなく
parameter 文で静的にコンパイル時に確定させなければ
ならないんですよね?
長々と書いてしまって申し訳ありません。m(_ _)m
0171163
2008/02/17(日) 23:46:47implicit 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
0172デフォルトの名無しさん
2008/02/18(月) 02:32:34MODULE 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でも可。
0173163
2008/02/18(月) 14:44:48ありがとうございます!! 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
0174デフォルトの名無しさん
2008/02/18(月) 23:15:43多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。
Fortran2003で可能になる機能だが実装されている。
>あと、解放ですが deallocate(data_) 一発で OK?
多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。
少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ
0176デフォルトの名無しさん
2008/02/26(火) 22:37:080177デフォルトの名無しさん
2008/02/26(火) 22:59:45> 単精度をコンパイルオプション一発で倍精度にすることってできますか?
コンパイラは何?
0178デフォルトの名無しさん
2008/02/27(水) 00:01:57一般的に、コンパイラには自動で倍精度にするautodblオプションがあることが多いので、マニュアル見ろ。
IMPLICIT REAL*8(A-H,O-Z)を入れるやり方もあるが、定数も倍精度にしないと下の桁にごみが入るので中々
容易い道ではない。
0179490
2008/02/27(水) 02:25:14皆さんプログラムを書く(デバッグ)するときに使っているツールで「これは便利だ」と思うツールを教えていただけませんか?
わたしは大体vimで書いているのですが、tagexplorer.vimというスクリプトを使って、関数などを別のウィンドウに出したりしているのですが...
最近emacsで書いてみたいなあと思うようになって情報を集めているのですが、あまり情報が見つからないんです。
Cだとcscopeとか便利なツールがあるみたいなんですが...
0180デフォルトの名無しさん
2008/02/27(水) 13:43:03intel fortran だと、 -r8 で一発、
fujitsu だと -RR8 かなにか、でまぁとにかく一発。
念のためにと、parameter文や sin などの intrinsic な関数を適当に使った、
適当に1000回くらいiterateする短いコードを
最初から倍精度で書いたやつと、
単精度で書いたコードをオプションつけてコンパイルして計算したら、
計算の結果はbinary で一致した。
ほかのコンパイラでも似たようなもんだろう。
0181176
2008/02/28(木) 20:15:57Intelコンパイラでした。マニュアル見たら速攻見つかりました・・すいませんでした。
autodblはHPやIBMのコンパイラでの名前みたいですね。
>>180
さすがにロードモジュールはバイナリ一致じゃないですよね。
わざわざ調べて頂いてありがとうございました。
0182180
2008/02/29(金) 13:13:23べっ、別にあんたのためになんたらかんたら。
昔作ったのをもっかいコンパイル&実行してみただけ。
intel fortranはまめにバージョンを上げてくれてありがたいんだけど、
時々挙動が変わるからね。以前やったときはできあがった実行ファイルも
同一になったよ。バージョンによっては実行ファイル作成時の日時が
格納されるのか(推定)、全く同じファイルを全く同じオプションでコンパイルしても
同一でない実行ファイルが出来ることがあったけど。
今使っている version 9.1 だとサイズは同じで先頭部分の100バイトくらい微妙に違う。
0183デフォルトの名無しさん
2008/02/29(金) 13:24:30うわ、ツンドラだツンドラだ
0184デフォルトの名無しさん
2008/02/29(金) 21:19:56>同一でない実行ファイルが出来ることがあったけど。
「このファイル同じだっけ?」って確認をcmpでやる癖のある自分としては、ちょっと厄介だなぁ
IntelFortranは今10.1だっけ?
0185デフォルトの名無しさん
2008/03/01(土) 14:27:05IVFに限らず仕様通りに実行ファイルを生成するコンパイラ、というかリンカを使えば
同一ソースを同じオプションでコンパイルしても完全に同じ実行ファイルにはならない。
ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html
まあ、頭の方がちょっと違ってくるだけなので、違っている部分の位置で
同じ内容かどうかは判断できると思うが。
0186デフォルトの名無しさん
2008/03/02(日) 00:44:48勉強で、以下のようなプログラムを作ってみたのですが、コンパイルエラーとなってしまいます。
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
といわれます。どのように対処すればよいのでしょうか。
0187デフォルトの名無しさん
2008/03/02(日) 01:39:51IMPLICIT NONEなのに関数hoge()の宣言がないから。
対処法としては
・関数hoge()を主プログラムtestの内部手続きにする。
・testの中にhoge()のINTERFACE宣言を書く。
・hoge()を含むMODULEを作る。
など。
0188デフォルトの名無しさん
2008/03/02(日) 14:47:260189デフォルトの名無しさん
2008/03/07(金) 00:40:07質問していいんでしょうか?
Linuxの方でも場違いな気がいたしまして。。
0190デフォルトの名無しさん
2008/03/07(金) 01:18:17GCC入ってないのか?
0191デフォルトの名無しさん
2008/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"に書き換えろとか書いてあるんですが、
すでに書き換わっていたりして。
もうお手上げです。。。
助けて下さい。。よろしくお願いします。
0192デフォルトの名無しさん
2008/03/07(金) 16:53:48> インストールしようとした
どうやって?
例えばl_fc_p_10.1.011_ia32.tar.gzをダウンロードして、
展開して出来たl_fc_p_10.1.011_ia32に移動して、
install.shを実行したということ?
ubuntuのパッケージはdebだから、それにrpmのパッケージをそのまま
インストール出来るのだろうか。
私はalienでdebに変換してインストールした。
0193デフォルトの名無しさん
2008/03/07(金) 18:28:14プログラムコードに”program main”と書かないと実行時に
/usr/lib/hpux64/dld.so: Unsatisfied code symbol 'main' in load module '/usr/lib/hpux64/libc.so.1'.
って表示されるんですが、”program main”を省略出来ないのは何故でしょうか?
何か環境変数で設定すればよきに計らってくれるのでしょうか?
0194デフォルトの名無しさん
2008/03/07(金) 20:25:15仰るとおり、install.shからです。
intelのインストーラが起動すると、
ubuntuではg++が入ってないと出来ないとは書いてましたが、
debとかrpmという言葉は出てきませんでした。
宜しければ、どうやってインストールされたか
詳しく教えていただくと有難いです。。
0195デフォルトの名無しさん
2008/03/07(金) 21:57:43私は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
を追加した。
0196デフォルトの名無しさん
2008/03/08(土) 01:03:43考えにくいな。もっと詳しく。
最小例で。
0197デフォルトの名無しさん
2008/03/08(土) 01:28:57ありがとうございます。
実は、Linux自体初心者で勉強し始めたばかりでなかなか困ってます。
195さんのように、ファイルをrpmからdebに直してされている方はUbuntuの方でいらっしゃいました。
僕もやってみましたが、こちらはデフォルトのエディタで、optファイル内は書込み禁止になっているらしくて、
その対処法がなくストップしてしまいました。
つまり、<INSTALLDIR>の置換操作が出来なかったところです。
あと、ログイン時に読み込むファイルの設定の仕方がとか、
そういったファイルの場所がわからなくて、困っていました。
やはり普通に実行しては無理っぽいんですね。
ありがとうございました。そのあたりを勉強しなおして、もう一度やってみます。
どうやら、問題はLinuxの操作の知識不足にあるようですから。。。
0199デフォルトの名無しさん
2008/03/08(土) 11:49:08open文の後ではその出力がなぜか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)
0200デフォルトの名無しさん
2008/03/08(土) 11:59:220201デフォルトの名無しさん
2008/03/08(土) 12:29:510202デフォルトの名無しさん
2008/03/08(土) 12:35:40sabu() の中で開けたものは、sabu() を出る前にちゃんと閉じてる?
sabu() の中身が分からないので何とも…。
0203199
2008/03/08(土) 14:30:47レス有難うございます。
sabu()中で、
open(2,file='input.dat',status='old')
に続いて、read()した後close()があり、
write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'
とwriteで挟んでみたところ正しく表示されるので、
close文は実行されているのだと思います。
0204199
2008/03/08(土) 14:31:49一部を以下に写してみます(中略が要領を得ないときはご指摘ください)
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
0205デフォルトの名無しさん
2008/03/08(土) 21:49:47mainとsabuでそれぞれにopen文があるので多重openになっていませんか?
0206デフォルトの名無しさん
2008/03/08(土) 23:50:39情報が足りなくて全くのあてずっぽで書くが、昔のプログラムはAUTOMATIC変数がSAVE属性が
あるかのごとく仮定していることがあるので、コンパイラのオプションでSTATIC属性にしてみそ。
0207199
2008/03/09(日) 11:51:38レス有難うございます。
今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が無くなりました!
http://www-jlc.kek.jp/~fujiik/mklinux/memo/g77/porting3-j.html
>-fno-automatic: を指定すると、変数を static にアロケート します。
>これは、全てのルーチンに SAVE を付けるのと同値です。
大変感謝です。2週間これで詰まってました。
sabu含むすべてのサブルーチンでSAVEはありませんでした。
0208206
2008/03/09(日) 16:16:07解決おめ。
少し補足すると、サブルーチンを呼んで帰った後、もう一回同じサブルーチンを呼んだときに、
サブルーチン内のローカル変数が前回の値を保持するかどうかが問題になっている。
FORTRAN77ではSAVE文ないしオプションが定義されて、明示的に前回の結果を取っておくことが
出来るようになった。規格ではFORTRAN77では前回の値を保障していなかったはず、
FORTRAN66では未定義かな?
しかし慣習的に、FORTRAN66時代から、前回の結果が残っているような処理系の実装が主流だったために、
かつては大抵のFORTRAN77処理系ではSAVEが暗黙にデフォになっていた、と思う。
Fortran90時代になって、動的にメモリーを取ることが普通になって、SAVEを明示的に指定しないと、
毎回任意のメモリーが割り当てられることがデフォになった気がする。ゆえにローカル変数内に
非数値的なビット列(NaN)のごみが入っていたりする。
昔のプログラムではFORTRAN77でもSAVEを仮定していることが多い。大抵はそれで動いていた。
メモリーを動的に確保せず、リンク・ロード時に静的にメモリーを割り付けていた。
というわけでg77が歴史的事情を尊重しないのが悪いと言ってみるw
NaNは配列はみだしか初期値のごみででることが多いのと、77スタイルのサブルーチンを出してきたので
推論した。
0209デフォルトの名無しさん
2008/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が赤くなりません)
0210デフォルトの名無しさん
2008/03/10(月) 23:22:28> write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)
ここの '(a\)' に対してなら文句を言われた。なので '(a\)' を全て * に変えてコンパイルしたら通った。因みに gfortran でだ。g95 ではもとのママでも何も言われなかった。実行については共に特に問題無さそうだった。
0211デフォルトの名無しさん
2008/03/10(月) 23:50:00>エラーは (col. 23) remark: LOOP WAS VECTORIZED.
>です。
これはエラーじゃない。リマークであって、警告ですらない。
単にDO-LOOPをベクトル化したという事を念のため教えてくれているに過ぎない。
つまりSSEを用いた最適化をしたという事を教えてくれている。
初心者なら、気にしなくてよい。
0212デフォルトの名無しさん
2008/03/11(火) 08:32:04そのリマークってオプションなしのコンパイルでも出るんでしょうか?
0213デフォルトの名無しさん
2008/03/11(火) 11:48:37処理系によって違うのでマニュアルを読んでもらうのが一番確実。
たとえば Intel Fortran の場合は、SSEによるベクトル化に関しては、
オプションを指定しないと何も言わない。
一般的に言えば、error, warning, info ( ここでは remark ) のような、
おおよそ3分類で、完全なるあやまち、分かってやってるならOK、念のための御注進
にあたるメッセージをデフォールトで言う。
うざいならオプションで抑止できるのが普通。
まぁコンパイラのオプションの説明嫁。
0214デフォルトの名無しさん
2008/03/11(火) 15:47:45>>211
ありがとうございます。
ちゃんと実行できました!
remarkはエラーでは無いんですね。把握しました。
精進します
0215デフォルトの名無しさん
2008/03/13(木) 03:18:380の二乗が正しく計算できません。
なぜでしょうか?
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
0216デフォルトの名無しさん
2008/03/13(木) 11:25:15> MacOSXでもg95で同じような計算結果になります。
MacOSX の g95 では上手く行っていますが?ちなみに PPC 版 Tiger。なので言っている事の意味ワカラン。
0217デフォルトの名無しさん
2008/03/13(木) 23:11:50おまい、質問が下手だなw
うまい質問をするとうまい答えが返ってくるし、まずい質問をするとまずい答えしか返ってこないぞよ。
とにかくそれだけでは答えようが無い。
0218215
2008/03/17(月) 02:47:25マカーの友人もTigerだそうです。
コンパイラのバージョンを教えてください。
>>217
他にどういった情報が必要でしょうか?
分かりにくいということですか?
この問題を解決したいので教えてください。
この「0の巾乗が計算出来ない」という問題はあまり有名ではないのでしょうか?
a=0.のときに
a**2が計算できないのは致命的なバグなような気もします。
周りのg95ユーザに聞いても解決しませんでした。
(やはり、他のシステムでも0の巾乗は計算出来ていません。)
ちなみに私は普段はgfortranをvine上で使っていますが、このような結果にはなりませんでした。
0219216
2008/03/17(月) 05:38:14同じソースを 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.
0220215
2008/03/17(月) 14:13:34ありがとうございます。
わかりにくくて申し訳ありません。
MacOSXは友人がやりました。
g95(windows),gfortran(vine),ifort(ubuntu)は私がまわしました。
(ifortでも同じプログラムを回してみました。)
gfortran,ifortは正しい結果が得られます。
g95だけ正しく計算できません。
バージョンの問題でしょうか?
友人にバージョンを聞いてみます。
0221デフォルトの名無しさん
2008/03/17(月) 21:57:57The 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に対応してなかったはず。
0222216
2008/03/18(火) 17:47:26> ちょっと前まではg95の方が安定してたような気がする。
> でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
> こちらの方が一般的になるのだろうな。
> #それにたしかg95の方はまだOpenMPに対応してなかったはず。
有り難うございます。確かに最近導入したLinuxはほぼ gfortran が付いていますね。
g95 は付いて無いですが。私は並列はしないので、OpenMP は対応していなくても
良いのですが、周りから聞かれたら gfortran の方を勧めることにします。
0223デフォルトの名無しさん
2008/03/18(火) 21:13:100224デフォルトの名無しさん
2008/03/31(月) 14:46:06できるよ。
以上。
はい、次。
0225デフォルトの名無しさん
2008/03/31(月) 21:02:150226デフォルトの名無しさん
2008/04/01(火) 00:26:180227デフォルトの名無しさん
2008/04/01(火) 01:48:45分関数定義文について勉強してるんですが、
プログラムが読めても、作れないくらいのレベルです
文関数定義分を使って、関数f(x)=x^2+x+1を
0≦x≦1の区間について、0,1ごとにxを変化させた場合の
結果を出力するプログラムを作りたいのですが、
わかる方いましたらお願いします
0228デフォルトの名無しさん
2008/04/01(火) 13:49:39ドイツとかフランスで教育を受けた人?小数点がそっち風なんですけど
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
0229デフォルトの名無しさん
2008/04/01(火) 21:00:370230デフォルトの名無しさん
2008/04/01(火) 22:13:380231志村228
2008/04/01(火) 22:26:01F(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
0232デフォルトの名無しさん
2008/04/01(火) 23:00:00心配すんな!
obsolete指定されても大概のコンパイラは機能を残すから。
今までもそうだったし、これからもそうだろうw
Fortranは、地層が積み重なった言語で面白い。直交性の悪さが自然言語っぽいw
0233デフォルトの名無しさん
2008/04/02(水) 00:01:340234デフォルトの名無しさん
2008/04/03(木) 01:03:12お行儀の良いコーディングした方がバグは減るだろうし
0235デフォルトの名無しさん
2008/04/09(水) 13:09:47fortran90のメインプログラムmain.f90で呼び出して使うにはどうすれば良いのでしょうか。
コンパイラはg95/cygwinを使ってます
0236デフォルトの名無しさん
2008/04/09(水) 19:17:150237デフォルトの名無しさん
2008/04/09(水) 19:34:30g95 main.f90 sub.for
ぢゃだめなん?(めんどくさいので、確認はしてない)
0238デフォルトの名無しさん
2008/04/09(水) 23:00:33レスありがとうございまs
私も並べてコンパイルすれば良いと思ってたんですけど駄目でした。
main.f90の中にuse文を作れば良いのでしょうか?
0239デフォルトの名無しさん
2008/04/09(水) 23:16:591.EXTERNAL文で外部関数であると表明する。
2.INTERFACE BLOCKでINTERFACEをちゃんと書く。
3.MODULEの中に置いて、USE文で引用する。
1から3の順で面倒くさいが、F90的にはこのましく行儀よくなる。
0240デフォルトの名無しさん
2008/04/10(木) 00:06:08すみません、折角頂いたアドバイスを理解しきれていないのですが
sub.forの中身をfortran90で書き直して、モジュール化するということですか?
77のままでは無理でしょうか?粘着に質問してしまい恐縮でs
0241デフォルトの名無しさん
2008/04/10(木) 00:47:431.
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
0242241
2008/04/10(木) 00:49:04スレ汚しご容赦。
3.
MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko
PROGRAM homosexual
USE unko
IMPLICIT NONE
CALL f77(....)
END
0243240
2008/04/10(木) 09:32:50ご教授どうもありがとうございます!!
0244デフォルトの名無しさん
2008/04/11(金) 13:16:37OPEN (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になってしまいます。何度も確認しましたが、ちゃんとその場所を読んでいるはずですし、
別の場所で代入していたりはしません。しょうがないので、テキストの末尾に読み込めなかった値をダブって記入し、
そこから読み込むとうまく読めました。ひとまずこれで問題はないのですが、原因が思い当たらずあまりにも気持ち悪いので、
思い当たる原因があれば教えていただけないでしょうか?よろしくお願いします。
0245デフォルトの名無しさん
2008/04/14(月) 02:01:04これだけでは情報が足りない。
もう少しkwsk
0246244
2008/04/14(月) 18:09:41知識があまりないのでどのあたりが必要な情報なのかいまいち分からないのですが、
とりあえず計算用のコードで、パラメータの設定をソースコードと分離したくて
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
....
の組み合わせで行うようにしたいのです。で、問題は前レスに書いたようなことなのですが、他に必要な情報ありますでしょうか?
0247デフォルトの名無しさん
2008/04/15(火) 16:07:47$ 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
$
ということで、問題無く読めた。
0248デフォルトの名無しさん
2008/04/15(火) 17:21:33> ということで、問題無く読めた。
ということはコンパイラ依存か?
>>244 はそういう情報を出していないし。
0249デフォルトの名無しさん
2008/04/16(水) 14:35:39えーと、すみません、基本的には問題なく読めるのですが、全く同じやりかたを
してるはずの別の行で、何故か値がおかしくなる部分が存在するんです。
ここには書ききれませんでしたが本当はもっと膨大な値を読み込んでます。
>>248
コンパイラはSalfordFTN77ですが、別のコンパイラでやっても同じ結果になります。
0250デフォルトの名無しさん
2008/04/16(水) 14:52:33「値がおかしくなる」ための条件を自分で見付け出して。
サブルーチン内で正しく読めているか確認。そして、呼び出し元の
メインプログラムで同じ値を返すか確認。
問題の提示が曖昧でどうにもできない。
0251244
2008/04/18(金) 16:50:45うーん、多分なんですが自己解決しました。読み込みの都合上、
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)
にしたら直ったようです。ダメだったんですね…
0252デフォルトの名無しさん
2008/04/22(火) 02:48:59その説明ではよく分からんが、COMMONは記憶領域の共有であって、
グローバル変数だと思っていると正しくない。
COMMONの最後の要素の長さが違うだけなら、問題は起きないと思うが
(これは無名COMMONだけだったか?最近COMMONを使わないから細部を忘れた)
途中の要素の長さを変えたらそこから先の番地が全部ずれることになる。
0253デフォルトの名無しさん
2008/04/22(火) 18:25:11hoge(0)はどこかを指しているんでしょうか?
hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?
0254デフォルトの名無しさん
2008/04/22(火) 18:49:45> hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?
そりゃやらん方がえぇ。そもそもソレをする事にどんな意味があるの?
そういうのは C でも怒られないよね。で、メモリ絡みのバグに繋がるんだっけ?
コンパイラによるけど、定義範囲外にアクセスしたときに(プログラムを)強制中断するオプションがある。
0255253
2008/04/22(火) 22:27:34やはりそうですよね、常識で考えれば・・・
pgi6.4です。普通にコンパイルできて、結果も問題なかったんですが、アレって思いまして。
0256254
2008/04/23(水) 13:20:16文法上の違反ではない(はずだ)からコンパイルは出来る。
コンパイルオプションで警告を出すようにでもすれば、何
か言われるかもしれないが、何も付けなければ、文法上の
問題が無いからスルー。実行結果まで保証しない。
0257デフォルトの名無しさん
2008/04/23(水) 13:25:28atan(y/x)とyの符号で場合分けしてましたが
0258デフォルトの名無しさん
2008/04/23(水) 18:01:36BAN(8,8)の数列で、オセロのマスを指定してるんですが、あるマスBAN(m,n)に石を置いた時にその周り8方向のマスを調べる方法がわかりません。
だれか教えてください。
0259デフォルトの名無しさん
2008/04/23(水) 23:54:16Fortranはスピード優先なので、配列のはみだしは普通チェックしない。
コンパイラの実行時オプションでチェックするように出来るのが普通だが、あくまでデバッグ用の位置づけ。
今の場合、配列をはみだして他の変数を上書きしている可能性が高い。
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とか。
0260デフォルトの名無しさん
2008/04/24(木) 09:51:47atan2なんてあったんですね!ありがとうございました。
0261デフォルトの名無しさん
2008/04/24(木) 17:00:17unformattedは機種依存みたいだから、やっぱりbinary?
「Fortranのunformatted=バイナリ」と勘違いしてる人もたまに見かけますが
確かに紛らわしいところだと思いますが、どういう経緯でそういう仕様になったのだろう・・・
0262デフォルトの名無しさん
2008/04/24(木) 23:52:06普通に数値ファイルなどをシーケンシャルに読み書きするなら UNFORMATTED のほうがいいと思う。
ここでUNFORMATTED の SEQUENTIAL FILE は、改行コードが入っている。
DIRECT ACCESS の場合はベンダー依存だが、トランスパレントにべた書きされていることが多いと思う。
本来はランダムアクセスのためのファイル形式だが、レコード長を1BYTEに指定して順繰りに読んでゆく
ことで binary の代用に出来ることが多い。
昔のマンガや映画でコンピュータがガタガタ磁気テープをアクセスしているのは、DIRECT ACCESS で
ランダムアクセスしてデータを読み出しているところと思われる。
binary は、本当に改行コードなども含めてトランスパレントな生のデータが欲しいときに使うものなので
UNFORMATTED と直接比較されるものではないと思う。
ついでにいうと binary は Fortran2003 で導入される規格で、Fortran95までではコンパイラー側の拡張になっているはず。
歴史的には、文字コードも、数値フォーマットも、1ワードのビット数も機種依存だったので、
UNFORMATTED を機種依存と責めるのは可哀想です。
たとえていうなら、『僕の肛門もEBCDIC(K)をぶち込まれそうです(><;』といった感じ。
0263デフォルトの名無しさん
2008/04/25(金) 10:39:23od -t x4で覗いたら、この値って4バイトだけど、これだと一行4Gバイトまでしか書けないことにならない?
0264デフォルトの名無しさん
2008/04/25(金) 11:14:27処理系依存だろうけど、今まで一語4バイトが主流だったから、そのくらいなんじゃない。
10年位前まではスパコンでも1配列のMaxが4Gだったし。
0265デフォルトの名無しさん
2008/04/25(金) 15:07:14そっか
でもそろそろ拡張してもいいような
0266デフォルトの名無しさん
2008/04/26(土) 23:34:360267デフォルトの名無しさん
2008/04/28(月) 13:05:570268助けてください
2008/04/29(火) 14:17:32どなたか簡単に作っていただけないでしょうか?
ちなみに格子点の間隔は0.25で格子点9個です。
時間が無いので本当にお願いします。
0269助けてください
2008/04/29(火) 14:51:020270デフォルトの名無しさん
2008/04/29(火) 16:05:54http://www.tnb.sd.kanagawa-it.ac.jp/home/lec/FEM/fortran.html
0271デフォルトの名無しさん
2008/04/29(火) 19:02:530272デフォルトの名無しさん
2008/05/01(木) 00:52:00複素数の実数べきか?実数の複素数べきか?
0273デフォルトの名無しさん
2008/05/01(木) 10:28:550274デフォルトの名無しさん
2008/05/06(火) 01:05:31行列を作るプログラムが動いたので
それをサブルーチンに入れると
コンパイルできるのですが、実行すると
Segmentation fault (core dumped)のエラーが出ます。
行列の大きさは1000×1000です。
試しに行列のサイズを小さくすると350×350では動きました。
使ってるOSはvistaでcygwin上でg77でコンパイルしています。
メモリは2Gです。
行列サイズを大きいままで動かすことはできないでしょうか?
0275274
2008/05/06(火) 01:07:441000×1000でもちゃんと動きます。
0276デフォルトの名無しさん
2008/05/06(火) 03:06:32これだけでは、なんとも言えんなw
g77だから動的にメモリー取ったりはしていないんだろうし?
とりあえず、
-fbounds-check
-ffortran-bounds-check
この辺のオプションで配列はみだしチェックを。
もう少しヒントを呉。
たとえば行列は実対称の単精度の密行列で、ライブラリはLAPACK、呼んでるルーチンは、某。
呼び出し行は
CALL xxxxx(xxxxxx)
使用変数の宣言行は、カクカクしかじか
REAL H(1000, 1000), xxxxxxxxxxxx
ぐらいあるとありがたい。
0277274
2008/05/06(火) 04:16:04-fbounds-check
をオプションにしてコンパイルしたらエラーは出ませんでした
コンパイルしてできたexeを実行したら
Segmentation fault (core dumped)のエラーが出ました
配列のはみ出しチェックのしかたがよくわからないのですが
これでいいんですかね?
あと行列は実対称の倍精度です。
今は対角化する以前の段階でプログラムは以下のような感じで作っています。
implicit none
integer m
parameter (m=1000)
real*8 a(m,m)
・・・
call matrix(a,m,mm ・・・)
write(*,*) mm
(mmは実際に行列が書かれている行数)
stop
end
subroutine matrix(a,m,mm ・・・)
implicit none
integer m, mm, ・・・
real*8 a(m,m), b(m,m), ・・・
・・・
(行列を作る)
return
end
0278274
2008/05/06(火) 04:22:23subroutineに入れなければm=2000でもきちんと動いたのですが
入れるとコンパイルはとおりますが
実行するとSegmentation fault (core dumped)のエラーが出ます(上に書いたとうりです)
このくらいの情報でよろしいでしょうか?
足りないのなら付け足します。
よろしくお願いします。
0279274
2008/05/06(火) 17:18:06subroutine の中の大きい行列(>>277のa(m,m)、b(m,m)など)全部を
メインプログラムので定義してやるとm=1000でも動きました。
subroutineの中にだけでかい行列を何個も定義したらダメなんですね。
知らなかった。
0280デフォルトの名無しさん
2008/05/06(火) 18:48:57それは多分スタックオーバーフローだな。
g77エラーメッセージは不親切だな。
0281デフォルトの名無しさん
2008/05/06(火) 19:02:33よく分からないのだけど mm はメインで定義しなくてイイの?
0282274
2008/05/06(火) 21:25:45スタックオーバーフローと思います。
今まででかい行列はメインで定義しないと
スタックからあふれるということを知らなかったです。
>>281
すいません、メインでmmは定義してます。
0283281
2008/05/06(火) 22:25:27-ffortran-bounds-check を付けてコンパイルした時も
正常に動作したけど。もぅワカリマセン。
program call_matrix
implicit none
integer m ,i ,j
parameter (m=1000)
real*8 a(m,m)
call matrix( a, m )
do i = 1, m , 1
do j = 1, m , 1
write(*,*)"a(",i,",",j,")=",a(i,j)
end do
end do
stop
end program call_matrix
subroutine matrix( a, m )
implicit none
integer m, i,j
real*8 a(1:m,1:m), b(1:m,1:m)
do i = 1, m , 1
do j = 1, m , 1
a(i,j) = dble( i+j )
b(i,j) = dble( i*j )
end do
end do
return
end subroutine matrix
0284274
2008/05/07(水) 04:21:21Segmentation fault (core dumped)のエラーが出ました。
mの値を変えてコンパイルして実行を繰り返したところ
m=509以上だとSegmentation fault (core dumped)のエラーがでます。
何か異常があるんですかね?
関係あるかどうかわかりませんがcygwinで ulimit -a を実行した結果を下に書きます。
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 2033
cpu time (seconds, -t) unlimited
max user processes (-u) 63
virtual memory (kbytes, -v) 2097152
0285デフォルトの名無しさん
2008/05/07(水) 09:54:02509 * 509 * 8byte(倍精度) = 2,072,648 なので virtual memory の
MAX超えてるのかもしれんな。Cygwin はよく知らんが、こんな小さい初期値なのか?
0286285
2008/05/07(水) 09:55:53よく見たら単位が kbytes だったw
だからメモリーはまだ余裕だwwwwww
0287281
2008/05/07(水) 12:09:31g95 と gfortran くらいしか思いつきませんが。
0288デフォルトの名無しさん
2008/05/07(水) 16:16:23んで、common 文をつかって、コンパイラに
「いちいちallocateしなくてもいいよ」と教えてあげる。
「common文は使っちゃだめ教」があるのは知ってるけど
試してみてちょ。
0289288
2008/05/07(水) 16:16:54implicit none
integer m ,i ,j
parameter (m=1000)
real*8 a(m,m)
common /gyouretu/ a ! <-- ここ加えた
call matrix( ) ! <-- ここ変えた
do i = 1, m , 1
do j = 1, m , 1
write(*,*)"a(",i,",",j,")=",a(i,j)
end do
end do
stop
end program call_matrix
subroutine matrix( ) ! <-- ここ変えた
implicit none
integer m
parameter (m=1000) ! <-- ここ加えた
integer m, i,j
real*8 a(1:m,1:m), b(1:m,1:m)
common /gyouretu/ a ! <-- ここ加えた
do i = 1, m , 1
do j = 1, m , 1
a(i,j) = dble( i+j )
b(i,j) = dble( i*j )
end do
end do
return
end subroutine matrix
0290288
2008/05/07(水) 16:19:57ループ制御のincrementalの整数は
内側をi
外側をj
にする習慣を付けていた方が良いよ。知ってたらごめん。
0291288
2008/05/07(水) 16:25:02サブルーチンの中でmを2回定義しているから後のはとってね。
自分の所の g77 on linux (バージョン不明) だと動いたよ。
がんばってね。
0292288
2008/05/07(水) 16:48:44parameter文で定義した変数を
subroutineの引数に使うのはよした方が良いよ。
・・・・ cygwin 最近使ってないなぁ。
274さんはhostのOSは何?もうvistaに対応してる?
0293デフォルトの名無しさん
2008/05/07(水) 18:10:04gfortranをインストールしてコンパイルしようとしたのですが、
下記のようなメッセージが出てコンパイルできません。
ld: crtbegin.o: No such file: No such file or directory
どうすれば、コンパイルできるようになりますか?
0294293
2008/05/07(水) 18:20:36ttp://www.esst.kyushu-u.ac.jp/~space/kumashiro/fortran.html
0295デフォルトの名無しさん
2008/05/07(水) 18:41:31可能性は3つある。
インストールしたバイナリに問題がある。
インストール方法に問題がある。
コンパイルしようとしたプログラムソースに問題がある。
あとは任せた。君なら出来る。
0296281
2008/05/07(水) 19:11:08> 更にお節介。
> parameter文で定義した変数を
> subroutineの引数に使うのはよした方が良いよ。
ココ詳しく。実はよくやってます。
0298デフォルトの名無しさん
2008/05/08(木) 11:51:23281さんが例として出したプログラムだと問題ないんだけど、
何かの拍子にサブルーチン内でmの値を変更してしまう場合にややこしい。
おおざっぱに言って、メインレベルで定義された固定変数はコンパイラによって
m = 1000 の代入処理+メインレベルでmが変更されていないかを監視するだけか、
前処理の段階でメインレベルでの変数mを1000に置き換えるかのどちらかをするんだけど
前者の場合、副プログラムで値が変わる場合までチェックしないので面倒。たとえば
parameter(m=1000)
call foo(m)
write(*,*) m
で副プログラムfoo中でm=1という代入文があるばあいに結果が保証されなくなっちゃう。
出力はコンパイラによって1000だったり1だったり、浮動小数点なら値がエンディアンレベルで壊れていたりする。
ぜったいmを副プログラムで変えない(intent文でチェックするとか)ならいいけど、
習慣として引数渡しせずに副プログラムでも
parameter(m=1000)と定義してやった方が安全。
mの値の変更はたいていのエディタなら一括置換で出来るしね。
あるいはm2=mとかして非固定変数に値を移してからそれを引数にするとかすると良いと思う。
似た理由で
do i = 1, 100
call foo(i)
enddo
みたいにループ制御の(整数)変数も引数に使わない方が安心。
あくまで「安心と安全」という気分の問題だけどね。コードが大きくなるとデバッグするときに
こういう部分ががボディブローよろしく効いてくるので。老婆心。
0299デフォルトの名無しさん
2008/05/10(土) 18:09:15どのような方法が一番精度が良いでしょうか?お知恵をお貸し頂ければ幸いです。
0300デフォルトの名無しさん
2008/05/10(土) 20:46:45対象の行列に因ると思う。実対称とか色々。
私は考えるのがメンドーなので lapack に丸投げしてるが。
0301デフォルトの名無しさん
2008/05/10(土) 20:59:38lapack は誤差減らす工夫してたと思うし。
対称行列なら対角化を経由する方法がいいかと。
数値誤差で対称性がくずれるなんてこともないし。
三角行列で扱うから。
0302デフォルトの名無しさん
2008/05/11(日) 22:23:14大抵のはあるし
0303デフォルトの名無しさん
2008/05/12(月) 01:02:12メモリとCPUによる?
ちなみにFloatの4次元で、130559044000個(1ファイルで50GBのデータサイズ)を処理したい。
0304デフォルトの名無しさん
2008/05/12(月) 01:16:181. 小出しに処理する
2. 圧縮する
のどちらかになるな。
0305299
2008/05/12(月) 04:37:39自分の素人っぷりが恥ずかしい限りなのですが
扱う行列が倍精度でもLAPACKで大丈夫でしょうか?
何はともあれ、試行錯誤してみます
0306助けてください
2008/05/13(火) 13:59:50使ったプログラムが作れません。ALLOCATABLEを使ったプログラムなら作れたのですが、誰か
ひとつ例として作って頂けませんか?お願いします。
0307デフォルトの名無しさん
2008/05/13(火) 16:29:56宿題スレではないぞよ。
0308デフォルトの名無しさん
2008/05/13(火) 16:48:180310300
2008/05/13(火) 19:47:51DSYSV で B = 単位行列ってしたらダメ?やったコト無いけど(私は固有値問題しか解かないし)。
上手くいかないというなら何が可笑しいか。INFO の値は? 多くの場合、INFO=0 は正常終了の筈。
man を見る限り、DSYTRF は目的に合ってないように思うが、それはきっと私の気のせいだ。
ということで、もちっと何か晒せません?(差し障りの無い範囲で)
0311デフォルトの名無しさん
2008/05/13(火) 23:47:10丁寧な指導ありがとうございます。
いま扱っている対称行列Aは倍精度で、次元が40×40です。
各要素の値には8桁ぐらいのバラつきがあります。
DSYSVでAX=EとなるようなXを求めて、その後実際に
matmulでAXの積を計算して出力しているのですが
対角部分以外の値が全く0に近づきません。
infoは0で出てきてます。
WinXp、cygwin、g95でやってます。これがまずいのでしょか
0312300
2008/05/14(水) 00:21:48dsysv() から出た後の A が最初の A のままという保証は無いような。その所為では?
つまり dsysv() の中で A の中身が書き変わっている可能性がある。
だとしたら AX =E が成立しなくても可笑しくはない。
0313デフォルトの名無しさん
2008/05/14(水) 00:29:11DSYSVにはAをコピーしたA'を入力しています。
matmulには元のAを使っています。
0314300
2008/05/14(水) 00:41:25On entry, the N-by-NRHS right hand side matrix B. On exit, if
INFO = 0, the N-by-NRHS solution matrix X.
だから、実行前に A のコピーを取って(C とでもする)、実行後に B と C の積を見れば?
やってみたら A の中身変わってた。あと (2,2) の実対称でやったら、ソレっぽい結果が出てた。
まぁアレだ、頑張れ。
0316名 無し
2008/05/14(水) 18:06:09linux上でFortran77を使えるようにするにはどうすればいいのですか?
何かインストールすべきコンパイラがあったりしたら教えて下さい。
0317デフォルトの名無しさん
2008/05/15(木) 00:00:21大抵のディス鳥はg77が含まれているだろうから
$ which g77
で見つからなかったら
# yum install gcc-g77
とか
# apt-get install gcc-g77
とか
# yum install compat-gcc-34-g77
みたいな感じで。
0318名 無し
2008/05/15(木) 15:47:37$ which g77で見つかったんですけど開けませんでした・・・
0319デフォルトの名無しさん
2008/05/15(木) 17:24:18which g77 で見つかったなら、Fortran77が使える準備が出来てるってことよん。
g77は開くものじゃない。
0320デフォルトの名無しさん
2008/05/15(木) 21:15:390321デフォルトの名無しさん
2008/05/15(木) 21:21:57つ LOGICAL
0322デフォルトの名無しさん
2008/05/16(金) 09:03:44あったんですか、失礼しました
今まで0、1をfalse、trueとしてやってて、なんかかっこ悪いなぁと思ってまた。というか危険ですよね
ありがとうございました
0323デフォルトの名無しさん
2008/05/17(土) 21:46:14資料を読み込む時、上からのn行が全ていりません場合はどうすればいいのですか?
僕はこう考えますが:
open(unit=10,file=filename,access="sequential",status="old")
do while( .true. )
read(unit=10,fmt="???",iostat=status)
???のところをいじればいいのですか?
それとも何か他の書き方にした方がいいのですか?
0324デフォルトの名無しさん
2008/05/17(土) 22:37:39DO i = 1, 10
READ(10, *)
END DO
0325デフォルトの名無しさん
2008/05/19(月) 12:50:03READ(10, *)
END DO
はどこに入れますか?
これで10行までの資料が読まれるけど保存されてないですよね?
僕はn行まではいらないけが、
n+1以後の資料はちゃんと読まれて配列に保存したいんです。
0326デフォルトの名無しさん
2008/05/19(月) 19:09:07例えば1分後に再開するという感じにしたいのですが
これは pause を使ってできますか?
pause だけだと、何か入力しないと再開しないのですよね?
僕は1分後に自動的に再開したいんです。
0327デフォルトの名無しさん
2008/05/20(火) 00:44:47DO i = 1, n
READ(10, *)
END DO
DO
READ(10, *, IOSTAT = io) a, b, c
IF (io == -1) EXIT
END DO
io = -1 は End of File
>>326
Fortranの規格の範囲内では基本的には無理。
空ループをまわして、DATE_TIMEで時間を監視してやれば出来ないことは無い。
しかしCPUが無意味に使われるのでお勧めできない。
ただコンパイラの多くは SLEEP() 関数等を用意しているので、マニュアルのコンパイラ独自拡張の所を
よく読めば出来る可能性が高い。またはライブラリなどの外部ルーチンを呼ぶという方法も無くは無い。
難易度はやや高い。
0328デフォルトの名無しさん
2008/05/20(火) 09:35:10call system( ' sleep 60 ' )
ってダメかな?
0329デフォルトの名無しさん
2008/05/20(火) 10:37:59どうもありがとうございます。がんばってみます。
0330デフォルトの名無しさん
2008/06/02(月) 20:31:19行番号使うのはあまりスマートじゃないし、基本的に使うべきじゃないですよね。
他の方法ってないでしょうか?
0331デフォルトの名無しさん
2008/06/03(火) 01:00:15>>327に出ている。
IOSTATの番号は機種依存だが、EOFの-1は確定と見ていい(これが規格に定められて
いるのか、慣習なのかよく分からんw)
それと行番号差別はよくない。行番号だっていい子なんだw
使いたいときは使うがいい。
あとFortran2003では、定数としてEOFやEOL等が定められている。
0332デフォルトの名無しさん
2008/06/03(火) 17:31:230333デフォルトの名無しさん
2008/06/03(火) 18:48:12サブルーチン化する
0334デフォルトの名無しさん
2008/06/03(火) 22:12:51たとえば function を作るとき、定義域外の引数を受け取ると NaN を
返すようにしたいんです。
ゼロで割り算すると NaN が返るけど、コンパイラによってはエラーや
警告が出るのでそれは避けたい。
0335デフォルトの名無しさん
2008/06/04(水) 00:47:24PROGRAM NAN
IMPLICIT NONE
REAL(4) :: a
! 12345678901234567890123456789012
a = TRANSFER(B'01111111100000000000000111111110', 0.0)
PRINT *, a
STOP
END PROGRAM NAN
a には NaN が入る。NaN は指数部が全ビット立っていて、仮数部が0以外なので
単精度の場合はこれでいい。endian の違いによらないように左右対称にしてみたw
TRANSFER関数を使えば任意の型の中に任意の型での値を入れられるので
それを用いればよい。ここでは2進表現の整数を入れたが、別に文字列とかでもいいので、
たとえば倍精度で64こ0と1を並べる必要も無い。
0336デフォルトの名無しさん
2008/06/04(水) 00:51:54Fortranではスコープ内のローカル変数は無い。
というかスコープという概念は無い。
もともとのFortranは暗黙の型宣言がなされているので、宣言にこだわる必要は無い。
一方Fortran90以降では、ALGOL/Pascal/Modulaの系列の影響を受けたので、
宣言部はプログラム頭部に集中される。
スコープなどは忘れて、早く暗黙の型宣言を信仰するんだ。
最近の言語では型宣言の省略が流行り始めているので、一周遅れでTopに立てるww
0337335
2008/06/04(水) 00:57:48PROGRAM NAN
IMPLICIT NONE
REAL(4) :: a
REAL(8) :: d
a = TRANSFER(-1_4, a)
d = TRANSFER(-1_8, d)
PRINT *, a, d
STOP
END PROGRAM NAN
実行結果 by Intel Fortran
NaN NaN
Press any key to continue . . .
ここで -1_4 と -1_8 はそれぞれ4バイトと8バイトの整数の -1 。
2の補数表現なので整数の -1 は全ビット立ってる。
0339デフォルトの名無しさん
2008/06/05(木) 18:46:57str='ABC'
print *,str(1:1)
とすると、Aが出力されますが、
character*3 str(1)
str(1)='ABC'
print *,str(1:1)
とすると、ABCが出力されます。
これはどういう仕組みでこうなるんでしょうか?
characterは文字の配列で実現されているんですよね?
0340デフォルトの名無しさん
2008/06/05(木) 21:19:300341デフォルトの名無しさん
2008/06/06(金) 00:24:53>characterは文字の配列で実現されているんですよね?
ちがう。
それはCとかのやり方。
character*3 str(1)
これは>>340が書いているように長さ3の文字型の全要素数1の配列の宣言。
そこでやりたいことは、これで実現される。
PRINT *, str(1)(1:1)
むろん
PRINT *, str(1:1)(1:1)
でも同じこと。
部分文字列は定数でも指定出来る。
print *, 'abe-san'(1:3)
これは
abe
を出力する。
マニュアルをよく読み返すことをおすすめする。
Fortran90では文字列操作の便利な関数が増えたので読み甲斐ある。
0342339
2008/06/06(金) 21:33:39ありがとうございます。Cとは違うんですね。
Fortranって文字処理苦手な印象持ってましたが、最近は違うんでしょうかね
0343デフォルトの名無しさん
2008/06/07(土) 02:04:05初心者なので課題が手につきません。お願いします。
「うるう年のプログラム」
「2次方程式の判定プログラム」
0344デフォルトの名無しさん
2008/06/07(土) 04:00:31Fortran ResQ 閏年
fortran 方程式の実数解
でググレ
0345デフォルトの名無しさん
2008/06/07(土) 11:14:49先生に聞けよ、授業料払ってるんだろ。
0346デフォルトの名無しさん
2008/06/08(日) 01:32:43うるう年の方。結果を確認していないw
PROGRAM leap
IMPLICIT NONE
INTEGER :: iy
LOGICAL :: qleap
PRINT *, 'INPUT YEAR'
READ *, iy
qleap = .FALSE.
IF ( MOD(iy, 4) == 0 ) qleap = .TRUE.
IF ( MOD(iy, 100) == 0 ) qleap = .FALSE.
IF ( MOD(iy, 400) == 0 ) qleap = .TRUE.
IF ( qleap ) THEN
PRINT *, 'LEAP YEAR'
ELSE
PRINT *, 'ORDINARY YEAR'
END IF
STOP
END PROGRAM leap
0347デフォルトの名無しさん
2008/06/08(日) 01:42:58二次方程式の分類
一切チェックをしていないw 英語は適当www
PROGRAM quadratic_eq
IMPLICIT NONE
REAL :: a, b, c, d
PRINT *, 'INPUT A, B, C OF A QUADRATIC EQUATION AX**2 + BX + C = 0.'
READ *, a, b, c
d = b**2 - 4.0 * a * c
IF ( a == 0.0 ) THEN
IF ( b == 0.0 ) THEN
IF ( c == 0.0 ) THEN
PRINT *, 'UNDETERMINABLE' ! a=0, b=0, c=0
ELSE
PRINT *, 'INCONSISTENT' ! a=0, b=0, c/=0
END IF
ELSE
PRINT *, 'ONE NON-DEGENERATE SOLUTION' ! a=0, b/=0
END IF
ELSE
IF (D > 0.0) THEN
PRINT *, 'TWO REAL SOLUTIONS' ! D > 0
ELSE IF (D < 0.0) THEN
PRINT *, 'TWO COMPLEX SOLUTIONS' ! D < 0
ELSE
PRINT *, 'TWO-FOLD DEGENERATE SOLUTIONS' ! D = 0
END IF
END IF
STOP
END PROGRAM quadratic_eq
0348デフォルトの名無しさん
2008/06/08(日) 02:39:33オマエさん、凄くいい奴。改訂ユリウス暦ってのもあるんだな。
(第三条件:西暦年を900で割った余りが200または600になる年は閏年)
出題者は、グレゴリオ暦と正確に指示しているんだろうか?
「明治31年勅令第90号に基づき閏年を判定するプログラムを作成すること」
というマニアックな教師がいたら嫌だな。
0349デフォルトの名無しさん
2008/06/08(日) 02:51:19IF の分岐、上手いね。不定・不能まで判定してやるとは、さすが。
EPS で0判定したいところだが、READ なら不要かな?
0350デフォルトの名無しさん
2008/06/08(日) 02:57:12FORTRAN90なのか
0351デフォルトの名無しさん
2008/06/08(日) 02:59:14追加演習問題として、次のようなのはどう?
「数学的には重解になるが、自らのプログラムで重解と判定されない
二次方程式の係数を一例あげよ。」
0352デフォルトの名無しさん
2008/06/08(日) 03:00:47PRINT とあるとBASIC っぽいが、宿題レベルなら十分だろうね。
0353デフォルトの名無しさん
2008/06/08(日) 04:17:230.1 2 1.0 で既に重根判定が崩れているw 0.125 2.0 8.0 とか二進法での有理数なら大丈夫なんだがw
a==0.0の類もどうかと思ったが、EPSILONとか使うと初心者らしくないかと思ってチョンボしたが、
Dは掛け算の後の引き算があるから避けられないなw
PROGRAM quadratic_eq
IMPLICIT NONE
REAL :: a, b, c, d
WRITE(*, *) 'INPUT A, B, C OF A QUADRATIC EQUATION AX**2 + BX + C = 0.'
READ(*, *) a, b, c
d = b**2 - 4.0 * a * c
IF ( a == 0.0 ) THEN
IF ( b == 0.0 ) THEN
IF ( c == 0.0 ) THEN
WRITE(*, *) 'UNDETERMINABLE' ! a=0, b=0, c=0
ELSE
WRITE(*, *) 'INCONSISTENT' ! a=0, b=0, c/=0
END IF
ELSE
WRITE(*, *) 'ONE NON-DEGENERATE SOLUTION' ! a=0, b/=0
END IF
ELSE
IF (D < EPSILON(0.0) ) THEN
WRITE(*, *) 'TWO-FOLD DEGENERATE SOLUTIONS' ! D = 0
ELSE IF (D > 0.0) THEN
WRITE(*, *) 'TWO REAL SOLUTIONS' ! D > 0
ELSE
WRITE(*, *) 'TWO COMPLEX SOLUTIONS' ! D < 0
END IF
END IF
STOP
END PROGRAM quadratic_eq
0354デフォルトの名無しさん
2008/06/08(日) 04:27:57PRINT * はデバッグの時使うと便利。
普通のコンソール出力をWRITE(*,*)で書いておけば、後からデバッグ用出力を消し忘れることが無い。
READ * もたまに便利。
一応、宿題なので初心者っぽく、ちぐはぐなところを演出してみましたw
>>348
グレゴリオ暦のうるう年のアルゴリズムを確認しにWikipediaを見たときに、下のほうに改訂ユリウス暦と
いうのがあったので嫌な予感がしたがw やはりそう来ますかw
0355デフォルトの名無しさん
2008/06/08(日) 06:10:32ダメじゃん、学生さんに考えてもらわないとw
初心者だと整数と決め込んでしまいがちだから、
試行錯誤してもらえるかなと。
「丸め誤差に対する考察と、プログラム改良とその改善効果の提示」
A4一枚にまとめてもらえると、講師冥利につきるね。
学年に数人はそういう学生さんがいてほしいな。
不能・不定は、数学的な気配りがないと見過ごしがちだから、
考慮していない学生さんもいるだろうね。
丸め誤差は、数値計算の経験がないと気付かないから、
IF文を習ったばかりなら配慮できっこないねw
0356デフォルトの名無しさん
2008/06/08(日) 06:18:01さらに追加演習問題(表現は曖昧)として、次のようなのはどう?
「この二次方程式に解がある場合、その解を出力するように改造せよ。
相異なる二つの実数解をもつ場合、
数学的な厳密解と出力した実数解との誤差が大きい
二次方程式の係数を一例あげよ。」
倍精度実数型や計算手順配慮の必要性を
学生さんに感じてもらえるかな。
0357デフォルトの名無しさん
2008/06/08(日) 16:42:46あんま気をつけたことはないけど、精度命な人はその辺も考えてるのかな
0358デフォルトの名無しさん
2008/06/08(日) 18:45:04面倒で仕方ない。
0359デフォルトの名無しさん
2008/06/08(日) 20:57:27?
昔のように頭の方に継続記号を入れろってことか?
0360デフォルトの名無しさん
2008/06/08(日) 21:34:060361デフォルトの名無しさん
2008/06/08(日) 22:06:47Fortran文法は行番号があって,しかも予約語がない
end
= 1 +
end
print *,
end,
end;
end
とか
do
10
do=
10,
10
10
end
do
end
いや聞くだけでわくわくする文法ですね
0362デフォルトの名無しさん
2008/06/09(月) 00:42:13FORTRANはやっぱイイナと思うよ。
0363デフォルトの名無しさん
2008/06/10(火) 12:04:01「フィボナッチ数列を配列f()とDo文を使って計算させ、30項までの結果を8i8の書式で出力せよ。
「日本で現在の流通通貨は1万円札から1円玉まで9種類ある(2千円札を除く)。
5桁の金額 kin を最も少ない枚数でそろえるには、それぞれ何枚になるか出力する。
貨幣9種の額はファイル kahei.txt から読み込む。出力の書式は○○yen ○○mai.」
0364デフォルトの名無しさん
2008/06/10(火) 17:28:54文が複数行に渡るなんてよくあるし、Cみたいな;のほうが良いと思う俺はFortraner失格ですか?
最近遊びでVSのC#を触ったが、色んな意味で感動したw
他の言語触るのはなかなかイイもんですな
0365デフォルトの名無しさん
2008/06/10(火) 18:11:18フィボナッチらしき(間違えている)ものを作った。
宿題に合わせて、間違えを修正しろ。
program main
integer f(10)
f(1)=1
f(2)=1
do 10 i=3,10
f(i)=f(i)+f(i)
10 continue
write(6,'( 8i8 )') (f(j),j=1,10)
end
0366デフォルトの名無しさん
2008/06/10(火) 18:48:57とりあえず入出力はつくった。
計算式をよく考えろ。
program main
integer kahei(9)
integer kin
open (1,File='kahei.txt')
do 10 i=1,9
read(1,*) kahei(i)
10 continue
print *, "input kingaku"
read *, kin
do 20 i=1,9
write(6,'( i5, "yen ", i1, "mai" )') kahei(i), kin/kahei(i)
20 continue
end
kahei.txt
10000
5000
1000
500
100
50
10
5
1
0367デフォルトの名無しさん
2008/06/11(水) 00:45:49しばらくぶりに77で書いた。すでに>>365-366があってがっくしwww
PROGRAM FIBONA
INTEGER F(0:30)
F(0) = 0
F(1) = 1
DO 10 I = 2, 30
F(I) = F(I - 1) + F(I - 2)
10 CONTINUE
WRITE(*, '(8I8)') (F(I), I = 0, 30)
STOP
END
PROGRAM KANE
INTEGER KAHEI(9), NUM(9)
OPEN(9, FILE = 'KAHEI.TXT')
DO 10 I = 1, 9
READ(9, '(I8.8)') KAHEI(I)
10 CONTINUE
WRITE(*, *) 'INPUT KINGAKU'
READ(*, *) KIN
DO 20 I = 1, 9
NUM(I) = KIN / KAHEI(I)
KIN = MOD(KIN, KAHEI(I))
20 END DO
DO 30 I = 1, 9
WRITE(*, '(I6, A, I5, A)') KAHEI(I), ' YEN ', NUM(I), ' MAI'
30 CONTINUE
STOP
END
0368デフォルトの名無しさん
2008/06/11(水) 11:32:44どうもありがとうございました。助かりました。
0369デフォルトの名無しさん
2008/06/12(木) 00:12:47「キルヒアイス、お前は優しいな。」
20ループと30ループ合体できない?
DO 20 I = 1, 9
NUM = KIN / KAHEI(I)
KIN = MOD(KIN, KAHEI(I))
WRITE(*, '(I6, A, I5, A)') KAHEI(I), ' YEN ', NUM, ' MAI'
20 END DO
0370デフォルトの名無しさん
2008/06/12(木) 02:28:49それも思ったが、I/Oと主演算は分離すべきかなと思って分けた。
天皇陛下万歳!
0371デフォルトの名無しさん
2008/06/13(金) 01:34:43windows上で動くFORTRANのエミュってありますか?
0372デフォルトの名無しさん
2008/06/13(金) 01:44:23VMwareにLinux入れてg77使えばおkw
0373デフォルトの名無しさん
2008/06/13(金) 01:46:34ある。77も95も。
ぐぐれw
0374デフォルトの名無しさん
2008/06/13(金) 04:53:55お勧めの物はないのでしょうか?
0375デフォルトの名無しさん
2008/06/13(金) 08:01:12単に IDE があってコンパイルができればいいなら silverfrost ftn95 でググれば見つかるよ。
0376デフォルトの名無しさん
2008/06/16(月) 02:07:35G95とかどう?
ttp://ftp.g95.org/
Self-extracting Windows x86かそのへん
0377デフォルトの名無しさん
2008/06/17(火) 01:57:48cygwin入れるのがだるい。
0378デフォルトの名無しさん
2008/06/17(火) 02:42:03まあマジレスすると Self-extracting Windows x86 の方はMinGWだから
Cygwin環境が無くても単独で動くわけだが。
0379デフォルトの名無しさん
2008/06/17(火) 09:13:450380デフォルトの名無しさん
2008/06/17(火) 19:07:53例えば 0.12345D-3 のように表示されてしまうのですが
これを1.2345D-4
と表示する事は可能でしょうか?
試行錯誤しているのですが全然分からず教えて頂きたいです
0381デフォルトの名無しさん
2008/06/17(火) 19:41:00最近影薄くて心配になるけど、細々と続いてるようね
0382デフォルトの名無しさん
2008/06/17(火) 19:51:44ESでできなかったかな。
0383デフォルトの名無しさん
2008/06/17(火) 23:44:40フォーマット指定するだけじゃん・・・
0384デフォルトの名無しさん
2008/06/17(火) 23:55:47ESとはなんでしょうか・・
ごめんなさい、どのようにしたら良いのかさっぱりで・・
0385デフォルトの名無しさん
2008/06/18(水) 00:43:11フォーマットの指定で"D○.○"の所を"ES○.○"にする
"D○.○"→0.100D+00
"ES○.○"→1.000E+00
"ES○.○E3"→1.00E+000
試してないから間違ってるかも
0386デフォルトの名無しさん
2008/06/18(水) 01:20:56Fortran90でよければ、上にみんなが書いているようにESでおk。
FORTRAN77ならば、1P D○.○ 0P でいける。
P 指定子は破壊力がでかいので、使ったらすぐ 0P で元に戻すが吉。
ま、マニュアル嫁
PROGRAM ppp
IMPLICIT NONE
REAL(8) :: d
d = 1.234567d-2
PRINT '(D15.6, ES15.6, 1P, D15.6, 0P)', d, d, d
STOP
END PROGRAM ppp
実行出力
0.123457D-01 1.234567E-02 1.234567D-02
Press any key to continue . . .
0387デフォルトの名無しさん
2008/06/19(木) 11:57:12今考えるとアリエンけど、昔はああいう仕様は全然平気だったんだろうな
0388デフォルトの名無しさん
2008/06/19(木) 17:08:36ちょっと前は、95はまだ早いから無難に行くなら90にしとけ、って声を聞きましたが。
0389デフォルトの名無しさん
2008/06/19(木) 20:44:00P指定子ってなんでありえないの??
よく使うのだが…
0390デフォルトの名無しさん
2008/06/19(木) 23:07:51READのところでFフォーマットの値がスケールされて読まれてしまい、とんでもない結果が出て悩んだw
たしかEとかベキ記号がついているときはスケールされないので、すげー悩んだ。
Fortran90の勉強を始めたとき、ESフォーマットがあったので、あぁアリガテーと思った。
0391デフォルトの名無しさん
2008/06/20(金) 12:47:18マジで言ってんの・・・?
まぁ気をつけてれば問題ないけどさ
0392デフォルトの名無しさん
2008/06/23(月) 16:22:50今日の月日と曜日を入力し,これを用いて今年の任意の月日の曜日を出力させよ.
各月の日数はファイルから読み込む.ファイル名や変数名は自分で付ける.
曜日は数値で代用してよい.日曜=1,月曜=2,・・・土曜=7.
目標の月日が何日後か(前か)を出す.それから曜日を計算する.
today
6 23 2
when
1 1
-174days 3you
today
6 23 2
when
12 31
191days 4you
0393デフォルトの名無しさん
2008/06/23(月) 17:25:50「今年」と銘打っているのに、曜日の入力を要求するんだな。
今日の月日と曜日に不整合があった場合、どうするんだろう。
まずは次の課題を考えなさい。
今日の月日を入力し、一年の経過日数(正月=1)を出力するプログラムを作成せよ。
0394デフォルトの名無しさん
2008/06/23(月) 20:34:09全部かいてもらう気なら別だが。
0396392
2008/06/23(月) 20:54:35まだFORTRAN77を触り始めて間が無いので表示するプログラムが限界です
勉強のためにコメントをつけてくだされば嬉しいです
って言いたいと思う
0397デフォルトの名無しさん
2008/06/23(月) 21:17:09本質的には >>395 と言っている事が一緒だね。
さらに解説ヨロってのも凄いが。
0398デフォルトの名無しさん
2008/06/23(月) 21:36:470399デフォルトの名無しさん
2008/06/23(月) 23:13:44初心者じゃなくて怠け者だろ
0400デフォルトの名無しさん
2008/06/24(火) 02:33:140.0 から 1.0 までの 10 個の値、 0.12, 0.32, 0.09, 0.83, 0.58, 0.39,
0.72, 0.44, 0.71, 0.24 を使って、起点 0.0、幅 0.2 としたときの頻度分布
を求めるプログラムを作成せよ。
結果はこのように表示されるようです。
s < 0.2 2
0.2 <= s < 0.4 3
0.4 <= s < 0.6 2
0.6 <= s < 0.8 2
0.8 <= s 1
if文を使うのはわかるのですが、頻度分布をどう求めていいのかわかりません。
fortran77です。
どうかよろしくお願いします。
0401デフォルトの名無しさん
2008/06/24(火) 09:21:12初心者には、入出力まわりが一番難しいのだが。
0402デフォルトの名無しさん
2008/06/24(火) 10:36:12PROGRAM HIST
INTEGER NUM(5)
REAL S(10)
DATA S / 0.12, 0.32, 0.09, 0.83, 0.58,
$ 0.39, 0.72, 0.44, 0.71, 0.24 /
DO 10 I = 1, 5
NUM(I) = 0
10 CONTINUE
C
DO 20 I = 1, 10
IF (S(I) .LT. 0.0) THEN
WRITE(*, *) 'INPUT ERROR!'
STOP
ELSE IF (S(I) .LT. 0.2) THEN
NUM(1) = NUM(1) + 1
ELSE IF (S(I) .LT. 0.4) THEN
NUM(2) = NUM(2) + 1
ELSE IF (S(I) .LT. 0.6) THEN
NUM(3) = NUM(3) + 1
ELSE IF (S(I) .LT. 0.8) THEN
NUM(4) = NUM(4) + 1
ELSE IF (S(I) .LE. 1.0) THEN
NUM(5) = NUM(5) + 1
ELSE
WRITE(*, *) 'INPUT ERROR!'
STOP
END IF
20 CONTINUE
C
0403デフォルトの名無しさん
2008/06/24(火) 10:36:47WRITE(*, *) '0.2 <= s < 0.4 ', NUM(2)
WRITE(*, *) '0.2 <= s < 0.4 ', NUM(3)
WRITE(*, *) '0.6 <= s < 0.8 ', NUM(4)
WRITE(*, *) '0.8 <= s ', NUM(5)
STOP
END
s < 0.2 2
0.2 <= s < 0.4 3
0.2 <= s < 0.4 2
0.6 <= s < 0.8 2
0.8 <= s 1
Press any key to continue . . .
0404デフォルトの名無しさん
2008/06/24(火) 11:20:33あまりチェックしてない。
曜日求め部分をよく練っていない。
うるう年対応してしまったw 今年限定ならデータいじればよし。
FUNCTION ILEAP(IY)
ILEAP = 0
IF (MOD(IY, 4) .EQ. 0) ILEAP = 1
IF (MOD(IY, 100) .EQ. 0) ILEAP = 0
IF (MOD(IY, 400) .EQ. 0) ILEAP = 1
RETURN
END
C
FUNCTION IDAYS(IY, IM, ID)
INTEGER MDAYS(12)
DATA NFEB /28/
DATA MDAYS /31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/
MDAYS(2) = NFEB + ILEAP(IY)
IDAYS = ID
DO 10 I = 1, IM - 1
IDAYS = IDAYS + MDAYS(I)
10 CONTINUE
RETURN
END
C
0405デフォルトの名無しさん
2008/06/24(火) 11:23:501 WRITE(*, *) 'TODAY'
READ(*, *) IM0, ID0, IDW0
IF (IM0 .LE. 0) STOP 'NORMAL END'
WRITE(*, *) 'WHEN'
READ(*, *) IM1, ID1
IDAYS0 = IDAYS(2008, IM0, ID0)
IDAYS1 = IDAYS(2008, IM1, ID1)
IDIFF = IDAYS1 - IDAYS0
IDW = MOD(IDIFF, 7) + 7 + IDW0 - 1
IDW = MOD(IDW, 7) + 1
WRITE(*, *) IDIFF, 'DAYS', IDW, 'YOU'
GOTO 1
STOP
END
TODAY
6 23 2
WHEN
1 1
-174 DAYS 3 YOU
TODAY
6 23 2
WHEN
12 31
191 DAYS 4 YOU
TODAY
0 0 0
NORMAL END
Press any key to continue . . .
0406デフォルトの名無しさん
2008/06/24(火) 12:03:44「各月の日数はファイルから読み込む」となっているね。
最近みかける宿題の出題者は、
無駄にファイル処理をさせようとしていない?
0407デフォルトの名無しさん
2008/06/24(火) 12:09:14問題よく読んでなかったw
後で直す。
0408デフォルトの名無しさん
2008/06/24(火) 13:48:19ありがとうございました!!
NUMを使うんですね。
解決できました。感謝です。
0409デフォルトの名無しさん
2008/06/24(火) 15:03:32> NUMを使うんですね。
ピントがずれてないか?
優しい人たち乙。
私なら「宿題は自分でやれ」で放置だな。
0410デフォルトの名無しさん
2008/06/24(火) 15:47:09初心者はピントがずれているもんだよ orz
0411デフォルトの名無しさん
2008/06/24(火) 20:20:120,10,100,a,b,500,
プログラムソース
character dmm(10)*10
open(10,file='test.dat',status='old')
read(10,*) (dmm(i),i=1,6)
do i=1,6
write(*,*) dmm(i)
end do
stop
end
出力結果
0
10
100
a
b
500
compaq visual fortran 6.0では
たとえば入力データの"b"->"*"に変更した場合のように
文字列にアスタリスクが入っている場合、エラーで落ちてしまいます。
cygwinのg77では問題なく表示されました。
コンパイラによって読めない文字列ってあるのでしょうか?
0412デフォルトの名無しさん
2008/06/24(火) 23:55:38漏れのCVF6.6Cはbを*にしてもエラーでない。
単なるVer.6のバグでないか。
おぼろげな記憶ではVer.6→Ver.6.5は有料うpデートで、結構大きな変化があったはず。
Ver.6.0→Ver.6.1 と Ver.6.5→Ver.6.6は無料。
0413407 >>392
2008/06/25(水) 01:25:17INTEGER MDAYS(12)
IDAYS = ID
DO 10 I = 1, IM - 1
IDAYS = IDAYS + MDAYS(I)
10 CONTINUE
RETURN
END
C*********************************************
FUNCTION IDW(IDIFF, IDW0)
K = MOD(IDIFF + IDW0, 7) + 7 - 1
IDW = MOD(K, 7) + 1
RETURN
END
C*********************************************
PROGRAM CALEND
INTEGER MDAYS(12)
OPEN(9, FILE = 'month.dat')
READ(9, *) (MDAYS(I), I = 1, 12)
C
1 WRITE(*, *) 'TODAY'
READ(*, *) IM0, ID0, IDW0
IF (IM0 .LE. 0) STOP 'NORMAL END'
WRITE(*, *) 'WHEN'
READ(*, *) IM1, ID1
IDAYS0 = IDAYS(IM0, ID0, MDAYS)
IDAYS1 = IDAYS(IM1, ID1, MDAYS)
IDIFF = IDAYS1 - IDAYS0
WRITE(*, *) IDIFF, 'DAYS', IDW(IDIFF, IDW0), 'YOU'
GOTO 1
STOP
END
0414407 >>392
2008/06/25(水) 01:36:0731, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
>>406
今回は、うるう年を外部データとして与えようという親心なのかもしれない。
>>396
プログラムの解説
FUNCTION IDAYS(IM, ID, MDAYS)
一月一日から特定の月日までの日数を計算する。
FUNCTION IDW(IDIFF, IDW0)
今日からの日数差と今日の曜日から、その日数差の日の曜日を求める。
この計算式は、考えるのが面倒なのでちょっと複雑。
もう少しシンプルな書き方があるかもしれない。
FORTAN77のMOD関数は負数を引数とすると、負の数を返すので+7とかが必要。
Fortran90ならMODULO関数というのが新設されていて便利。
だがいずれにせよ7で割り切れるときは0を返すので、1〜7にするために-1/+1の
人工的な操作をした。自分で決める曜日を0〜6にすれば話はもっと楽になる。
PROGRAM CALEND
まず各月の日数をファイルから読み込む。
今年はうるう年なので、うるう年の日数データを用意した。
あとは、I/Oの後、上で用意した関数を使ってやればいい。
ここでループから抜けるために、今日の月が0以下の数の場合終了するようにした。
0415デフォルトの名無しさん
2008/06/25(水) 10:25:23詳しい説明ありがとうございました。
0416411
2008/06/25(水) 13:24:19Ver.6.0から6.1へアップデートしてみました。
今度は*のデータの後にブランクが入るようになりました。
つまり、>>411の入力データでaを*にすると、
*
b
と表示されて、500のデータは読めていない。
おっしゃる通り、Ver.6.0とか6.1固有のバグなのかもしれません。
こういうデータ処理には使うなってことでしょうか。
ありがとうございました
0417デフォルトの名無しさん
2008/06/26(木) 02:19:25俺の予感では、
read(10,*) (dmm(i),i=1,6)
をフォーマットつけて
read(10,’(A)')
にすればおkな気がする。根拠は宇宙からのメッセージ!w
0418デフォルトの名無しさん
2008/06/26(木) 14:08:070419411
2008/06/26(木) 14:16:04そんなこと・・・あるかもなって思って試してみたけど、
だめだわ。エラーで落ちる。
cygwinのg77でもダメ。
その宇宙からのメッセージ、あんまあてに出来んぞ
ま気持ちだけは嬉しかったわ。ありがとな(´・ω・`)
0420デフォルトの名無しさん
2008/06/27(金) 00:29:58fortranは、第1行目に「c」或いは「*」を入れるか、
「!」の後がコメントになる
その他のコメントは聞いたことないし見たことない
f90以降にそんなフォーマットがあるのかもしれんけど、おれは見たことない
0421デフォルトの名無しさん
2008/06/27(金) 01:31:33Fortranは行を基本単位とする言語なので、行毎に指示をするのが自然な形だ。
CやPascalのように、行が意味を持たない代わりに終端符号などをいちいち付ける言語とは
根源的な思想の違いがある。
しかしプリプロセッサを使えば実は範囲コメントも実現出来る。
ただ、プリプロセッサは本来の規格の外にあるので処理系依存の機能になる。
自分の処理系のFortranマニュアルでfppとかを調べてみるべし。
良いニュースとしては将来Fortran2008で、プリプロセッサが規格に入ることになっているので、
それまで、待つという手もある。
10年くらい待つことになると思うがwwwwwww
0422418
2008/06/27(金) 10:29:44ありがとうございます。
行をまとめてズバッとコメントアウトしたいときとか不便だなぁと感じるのですが、仕様上諦めるしかないんですね・・・
世の中のコンパイラがFortran2008に対応するのいつごろだろう
2003だってまだ新しい感じですよね
0423デフォルトの名無しさん
2008/06/27(金) 12:39:40え、それこそ1文字目にCや*を入れるだけでしょ。1行の前半分をコメントにするのは難しいけど。
まさか、エディタでしこしこ100行くらいの1文字目にC入れるのがしんどいとかだったら言語の問題じゃなくて
あんたの未熟さの問題だけど。
0424418
2008/06/27(金) 17:39:39確かに私は未熟者ですが・・・。
手動でしこしこやらずに、そういうことをサクッと一発でやる方法ってないですかね?
viでしこしこ書いてるんですが、sedなどの外部コマンド呼ぶのもアレだし
emacsや他のIDEならそういう便利機能ってあるんでしょうか?
0425デフォルトの名無しさん
2008/06/27(金) 18:00:20Shift押しながら複数行選択し、コメントアウトボタンを押せば行頭に!つくよ。
0426418
2008/06/27(金) 18:14:37ありがとうございます。VSはさすがに便利ですね。
今の開発環境は、単に端末からサーバに入ってvi、なんですが
Windowsに移行しちゃおうかしら
0427デフォルトの名無しさん
2008/06/27(金) 19:47:110428デフォルトの名無しさん
2008/06/27(金) 23:03:57viなら置換コマンドを使え。
10行目から20行目までの先頭に ! を挿入
:10,20s/^/!/
30行目から40行目までの先頭の ! を削除
:30,40s/^!//
行頭の ! をすべて削除
:%s/^!//
0429デフォルトの名無しさん
2008/06/27(金) 23:05:25emacs では C-c ; でリージョンをコメントアウトできる
0431デフォルトの名無しさん
2008/06/28(土) 08:28:25コメントアウトしたいブロックを「#if 0」〜「#endif」で挟む。
UNIX系OS上の処理系なら、ソースファイルの拡張子を「.F」に、
Fortran90なら「.F90」にしておけば、コンパイル時に
自動でプリプロセッサを通してくれるはず。
0432デフォルトの名無しさん
2008/07/02(水) 16:58:390433デフォルトの名無しさん
2008/07/02(水) 20:15:58サフィックスは固定形式と自由形式の違いの認識じゃない?
f90 以降は、.f90だと思う。
0434デフォルトの名無しさん
2008/07/03(木) 09:47:29そうでしたね・・・お恥ずかしい質問失礼しました。
0435デフォルトの名無しさん
2008/07/05(土) 17:34:50.f90, .f95, .f2k, .f03, .f08
などがある。
固定形式の方は .f, .for, .ftn などがある。
0436デフォルトの名無しさん
2008/07/10(木) 11:41:15このファイルなんだけど、
stv=c1*cos(t)-(0.5d0)*(exp(-c*t/2.0d0)*(c*cos(t*e1)-(e)*sin(t*e1)
の部分で絶対にエラーを吐かれます
何がいけないのかまったくわからないのですが文字数制限とかでしょうか?
0437デフォルトの名無しさん
2008/07/10(木) 11:46:530438デフォルトの名無しさん
2008/07/11(金) 20:28:27GOTO n
1 CALL hogehoge01(...)
GOTO 999
2 CALL hogehoge02(...)
GOTO 999
...
99 CALL hogehoge99(...)
999 PRINT *, '終わり'
みたいな事がやりたのですがコンパイルエラーになります。
現在は IF THEN FLSE で場合分けしているのですが分岐の数が多くて
あまりスマートではありません。何か上手い方法は無いでしょうか?
0439デフォルトの名無しさん
2008/07/11(金) 21:23:35使っている言語を詳しく
0440デフォルトの名無しさん
2008/07/12(土) 00:31:01Intel Fortran Compiler 10.1 です
0441デフォルトの名無しさん
2008/07/12(土) 00:36:14Fortran 95 で Intel Compiler がサポートしている機能なら使っても問題ないです。
0442デフォルトの名無しさん
2008/07/12(土) 14:38:07割り当てGOTO文の行き先はASSIGN文で与えないといけない。ただし、常数じゃないと駄目だったはず。
GOTO n, (1, 2, 3, 4, ....) と書く方法もあるが。
まぁFortran90だったら、素直に SELECT CASE にしとけ。
今時Fortran66時代の割り当てGOTOを持ち出し、しかもIF-THEN-ELSEより割り当てGOTOを
スマートだと感じ、エラーメッセージを貼らないで質問し、
おまけにhogehogeなどというUnix界隈の嫌な語を使うwwww
はっきり言えば、チミはセンスがズレてるから、ちゃんとFortran90以降を基礎から習え。
0443デフォルトの名無しさん
2008/07/24(木) 10:03:56呼び出し側にも影響が出たって本当ですか?
function(1, 2)
とかで呼んだ場合定数の1と2が入れ替わるみたいな話を耳にしたのですが。
0444デフォルトの名無しさん
2008/07/24(木) 17:17:05pause 文を入れて、出力結果を確認してリターンキーを押さないと
プログラムが再開しないようにしてあります。
これを、リターンキーを押さなくても、ある程度の時間(10秒とか)が
経つと勝手に再開するようには出来ないのでしょうか。。
0445デフォルトの名無しさん
2008/07/24(木) 19:30:07OS とコンパイラは何?
0446444
2008/07/24(木) 20:38:420447デフォルトの名無しさん
2008/07/24(木) 21:40:55完全にお手上げ状態です。
一応素数の出力はできてるみたいなんですが・・・
*素数の出力
INTEGER n,i,k
*
READ(5,*) n
i=2
WRITE(6,*) i
*
DO 10 i=3,n,2
k=3
30 IF (k**2 .GT. i) GOTO 20
IF (mod(i,k) .EQ. 0) GOTO 10
k=k+2
GOTO 30
20 WRITE(6,*) i
10 CONTINUE
*
STOP
END
こんな感じです。
違う方法でやったほうがいいんでしょうか…
0448デフォルトの名無しさん
2008/07/24(木) 22:46:100449デフォルトの名無しさん
2008/07/24(木) 23:05:23CALL SLEEP(10) ! 10秒間待つ
>>447
そのプログラムを修正するのなら、
・調べた奇数が素数だったのか素数で無かったのかを記録する変数を用意して
「DO 10 i=…」 のループで毎回結果を記録しておく。
・素数が見つかったら上記の変数を調べて、1つ前の奇数も素数だった場合は
両方の値を出力する。
0450デフォルトの名無しさん
2008/07/24(木) 23:34:50その通り。ただ定数を直接書くのではなくパラメータ指定した定数を書かないと
はっきり分からんだろう。これはサブルーチンの引数が参照渡しなので起こりうる。
SUBROUTINE sub_test(a, b)
IMPLICIT NONE
REAL, INTENT(IN OUT) :: a, b
REAL :: tmp
tmp = a
a = b
b = tmp
RETURN
END SUBROUTINE sub_test
!===========================================
PROGRAM test
IMPLICIT NONE
REAL, PARAMETER :: a = 1.0, b = 2.0
EXTERNAL :: sub_test
PRINT *, 'a=', a, ' b=', b
CALL sub_test(a, b)
PRINT *, 'a=', a, ' b=', b
STOP
END PROGRAM test
Fujitsu-Lahey Fortran95 実行結果 (Intel Fortran は実行時エラー)
a= 1.00000000 b= 2.00000000
a= 2.00000000 b= 1.00000000
Program Completed
Press Enter to Continue.
>>444
過去レス>>326と重複している。その回答を読め。
0451デフォルトの名無しさん
2008/07/25(金) 00:13:07本当に申し訳ないのですが素数だったか素数じゃなかったかを判別するプログラムが作れません…
まるなげになってしまって申し訳ないですが具体的にどうなるか教えていただけないでしょうか?
(面倒だったり自分でやれとおっしゃるならいいですが)
0452デフォルトの名無しさん
2008/07/25(金) 09:09:52素数を画面に書かせることはできてるわけでしょ?
それなら
(1)素数を画面に書くかわりに、適当な変数たとえば prime_prev に代入
(2)あらたに素数を見つける。その素数と prime_prev との差を調べる
(3)差が2なら双子素数。2でないなら、(2)で見つけた素数を prime_prev に代入して
ふたたびステップ2へ。
でいいんじゃね?
0453デフォルトの名無しさん
2008/07/25(金) 11:54:47その表で連続している奇数を捜せば良いのではないかい?
0454名無し
2008/07/28(月) 17:48:07しかしFORTRAN77を用いたプログラミング自体始めたばかりであり、プログラムの作成方法についてピンときません。
もしよかったならどのようにしてプログラムを作ればよいのか教えてもらえませんか?
大まか過ぎる質問ではありますが・・・。
0455デフォルトの名無しさん
2008/07/28(月) 23:27:16まず
1. 計算機にやらす内容を手作業でできるかどうか(時間は別として)
ここでつまづくならFortranの問題じゃなく、
モンテカルロって何?
何を入力して、何を出力するの?
などがわかってないのでちょっと別問題。
1.をクリアしてるなら、次に
2. その処理をコーディングしていくと、どこでつまづくのか
を考えよう。
その部分が明確になっているなら、このスレッドの方は回答くださるかと思います。
大まかな質問なので大まかな回答しかできないけど
RANDOM_NUMBERやRANDとかいった乱数発生関数があるのでこれを利用することになるんだと思うよ。
ちなみにどんな関数があるかはコンパイラに依存するので・・。
0456デフォルトの名無しさん
2008/07/28(月) 23:57:35分子シミュレーション講座1 モンテカルロ・シミュレーション
ISBN978-4-254-12691-4、神山新一・佐藤明、朝倉書店
付録 7.7 基本的なFORTRANの計算プログラム集
図書館で借りろ。
0457デフォルトの名無しさん
2008/07/29(火) 00:49:18FORTRANでプログラム出来るとはありがたいこと。
まず天皇陛下に感謝をささげよ。
次に先輩から下敷きになるプログラムを貰うこと。
これで将来の運命が決まる。
筋の悪いウンコプログラムを貰ったらもうアウトw
筋が良くても長大な完成版を貰ったらやはりアウトww
筋が良くて簡素で、自分で拡張してゆける物を貰えたら、おのずから上達して成功する。
つまり、すべては運なので神に祈れw
0458デフォルトの名無しさん
2008/07/29(火) 03:21:57課題がモンテカルロだしw
0459デフォルトの名無しさん
2008/07/29(火) 18:11:23もしよろしければどこがだめなのかご教授ください。改行が多いと怒られたので2レス使います。
PROGRAM ENSHUU6_4
IMPLICIT NONE
INTEGER :: I,A
INTERFACE
SUBROUTINE PHIBO(i,result)
IMPLICIT NONE
INTEGER,INTENT(IN) :: i
INTEGER,INTENT(OUT) :: result
END SUBROUTINE PHIBO
END INTERFACE
WRITE(*,*) ' I= '
READ(*,*) I
CALL PHIBO(i,result)
WRITE(*,*) ' result= ',result
STOP
END
0460デフォルトの名無しさん
2008/07/29(火) 18:12:22IMPLICIT NONE
INTEGER,INTENT(IN) :: i
INTEGER,INTENT(OUT) :: result
INTEGER, DIMENSION(0:100) :: A
INTEGER :: N
A(0)=1
A(1)=1
DO N=1,i
A(N+1)=A(N)+A(N-1)
END DO
result=A(i)
RETURN
END SOUROUTINE PHIBO
sage忘れました・・・申し訳ない
0461デフォルトの名無しさん
2008/07/29(火) 22:29:02>>460
・IMPLICIT NONEがあるのに宣言されていない変数が使われている
・サブルーチンの宣言に仮引数がない
・綴りの間違い
何行目に間違いがあるのかはエラーメッセージに示されているはずなので
それを参照して自分で探すこと。
0462デフォルトの名無しさん
2008/07/30(水) 01:04:09ありがとうございます
0463デフォルトの名無しさん
2008/07/30(水) 12:14:25エラーメッセージをコピペしてもらえると、回答はすごく楽になる。
0464デフォルトの名無しさん
2008/07/30(水) 15:27:02In file ttt.f90:16
CALL PHIBO(i,result)
Error: Symbol 'r' at (1) has no IMPLICIT type
とだけ表示されます。
>>461の宣言されていない変数がなんなのかと綴りがどこが間違っているか発見できません。
0465デフォルトの名無しさん
2008/07/30(水) 15:30:31>Error: Symbol 'r' at (1) has no IMPLICIT type
ではなく
Error: Symbol 'result' at (1) has no IMPLICIT type
です
0466デフォルトの名無しさん
2008/07/30(水) 16:07:50解決しました。ありがとうございました!!
また質問に来た時はよろしくお願いします。
0467デフォルトの名無しさん
2008/07/30(水) 20:58:51アドバイスありがとうございました。
説明不足でしたので少し補足をしておきます。
モンテカルロシミュレーションを用いたタンパク質と低分子の結合実験を行えるプログラム(使用言語:FORTRAN77)を作ろうと考えています。
ここでのモンテカルロシミュレーションはタンパク質上の各部分に乱数とよばれる数をふりわけて、確率的な試行(低分子をタンパク質に結合させる操作)を何回も繰り返すことを意味します。
これによってタンパク質上での低分子の結合しやすい部分を見つけ出そうと考えています。
しかしプログラミングを本格的に始めて間もないということもあり、プログラムを作るための糸口がいま一つ見つかりません。
(例えばタンパク質上の各部分での乱数のふりかた、パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方)
話がまた戻りますが、プログラム完成にいたるまでの手順、方法等についてのアドバイスを頂けませんか?
0468デフォルトの名無しさん
2008/07/30(水) 23:34:14乱数はRANDOM_NUMBER関数で0<=x<1の値を発生させることができる。
発生させたい数字が5〜10なのなら、
発生させたい数字 = 5.0 + x * 5.0 になる。
> パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方
パソコンではどうあがいても分子結合はできません。
揚げ足を取りましたが、シミュレーション方法は先生に聞くべき。
ここではそのシミュレーション方法をプログラミングに反映させる方法を聞いてください。
0469デフォルトの名無しさん
2008/07/31(木) 08:07:51http://www.geocities.jp/eyeofeconomyandhealth/homepage/kumikomi3.html
しかし >>467 は fortran90 か 95 を使わない理由はあるの?
77より便利だよ。
0470デフォルトの名無しさん
2008/07/31(木) 09:10:48この質問内容を見る限り、自分で一から作るのは無理っぽいので、
下敷きになるプログラムをどこかから手に入れることだ。
論文読めばプログラム名があって、ググレば出るだろ。
今はそれどころではないと思うが、真面目な計算に入る前に、乱数も自前のを用意したほうがいい。
というか本来は擬似乱数の評価からはじめないと、叩きまくられる。
乱数マニアがいてうるさいw
スパコンのたぐいならハードウェア実装の乱数とかもあるが。
0471デフォルトの名無しさん
2008/07/31(木) 18:52:31fortran のコードも公開されてるから、ググってダウンロードして、出力される数列を
自分でチェック。
0472デフォルトの名無しさん
2008/08/14(木) 19:04:40closeしたファイルに書き加えるってどうやるのでしょうか?
0473デフォルトの名無しさん
2008/08/14(木) 20:56:17もう一度openする。そのときにposition='append'で書き込み位置を指定する。
そうするとwriteで書き込みしたときにファイルの最後に書き足される。
0474デフォルトの名無しさん
2008/08/14(木) 21:06:560476デフォルトの名無しさん
2008/08/14(木) 22:18:44http://www.silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.asp
0477デフォルトの名無しさん
2008/08/14(木) 22:33:19gfortran
0478デフォルトの名無しさん
2008/08/14(木) 22:40:420479デフォルトの名無しさん
2008/08/14(木) 22:43:31あるよ
http://gcc.gnu.org/wiki/GFortranBinaries
0480デフォルトの名無しさん
2008/08/22(金) 14:34:23に渡すコードです。forwardでは、callbackに対応する仮手続きの引用
仕様で、この配列が1開始添え字(つまりデフォルト)としているが、
callbackでは、0開始添え字になっています。
このような「添え字のずらし」は合法のはずですが、これをコンパイル
すると、g95ではOK、intel fortranではコンパイルエラーとなります。
質問は、これがintel fortranの方言によるものなのか、規格上の根拠
があるのか、どちらなのかということです。
0481デフォルトの名無しさん
2008/08/22(金) 14:36:14contains
subroutine callback(x)
real(8), dimension(0:) :: x
end subroutine
subroutine forward(cb,x)
interface
subroutine cb(x)
real(8), dimension(:) :: x
end subroutine
end interface
real(8), dimension(:) :: x
call cb(x)
end subroutine
end module
use dummyproc
real(8), dimension(5) :: x
x = (/1d0, 2d0, 3d0, 4d0, 5d0/)
call forward(callback, x)
end
0482デフォルトの名無しさん
2008/08/23(土) 00:28:50>>481でエラーが出るのはインターフェースが矛盾しているからだろう。
real(8), dimension(0:) :: x
こうすればコンパイラを通る。
ただ、0から始まる配列の引き渡しで様々な問題が起こるのは事実。
規格書をよく読んでいないから断言できないが、元々多分曖昧な点があるんだろうと思う。
処理系によって動作が違う。
また、部分配列を送る時に微妙な問題がある。
たとえば、
REAL :: x(0:100)
の全体を、サブルーチンに送る時に、
1.CALL sub(x)
2.CALL sub(x(:))
と送ると、ソース上の意味では同じことだが、大概の処理系では2.の時のように
部分配列の指定子がつくと、いったん暗黙にアロケートされたテンポラリ配列に
コピーして送るために、サブルーチン側で LBOUND(x) を書かせてみると
1.の場合は配列が0から始まると認識するのに、2.の場合は配列が1から始まると
みなしていたりする。
さらにややこしいことに、最近 Intel Fortran は、引数として x(:) を渡すときは、
テンポラリを作らずに x の番地をそのまま渡すようにしたらしい事で、時と場合と処理系に
依存して何が起こるか分からん気分だったりする。
まぁFortranの自然数は1から始まるのでしょうがない。
0から配列を始める奴が悪いwwwというのが、俺が昔同じような問題で悩んだときの結論だw
0483デフォルトの名無しさん
2008/08/25(月) 23:12:11fortran77で、プログラム途中に print *, A みたいに
Aを出力させるとさせないのとでは
最後の結果(計算にAの値を使う)が異なってしまいます。
(printを入れると正しい値、入れないと NaN)
出来ればprint無しで動かしたいのですが、これって何が悪いのでしょうか?
WinXp-Cygwin、g77でコンパイルしています。
0484デフォルトの名無しさん
2008/08/26(火) 04:53:09書いたプログラム晒せや。
0485デフォルトの名無しさん
2008/08/26(火) 21:26:44大抵の場合、配列破壊が起きてる。
サブルーチンの引数渡しをチェック、宣言文チェック等すべし。
ちなみにprint文周辺だけ見てもわからない場合が多いよ。
後は、晒すしかないね。
0487デフォルトの名無しさん
2008/08/27(水) 01:06:04PRINT文を入れて結果が変わるのは、最適化による場合もある。
最適化レベルを0にする、もしくはデバッグモードで実行してみるという手もある。
また>>485で指摘された可能性を追求する場合には、サブスクリプト・チェックの
オプションをつけてコンパイル・実行することにより容易に確認できる。
0488デフォルトの名無しさん
2008/08/27(水) 19:22:2377なら暗黙の型宣言使ってるだろうから、その A がプログラムの実行順で、
どこに初めて現れるのかも確認すれ。初期化に失敗してるかもしれん。
どうしてもバクがみつからなかったら、90/95で書き直すべし。
固定形式と暗黙の型宣言の組み合わせは、バクの温床。
0489デフォルトの名無しさん
2008/08/27(水) 21:04:1977と90/95ではどちらがいいのでしょうか?
完全にプログラミング初心者です。
0491デフォルトの名無しさん
2008/08/28(木) 01:01:36行列の一部に数値を与えた場合
他の数値を与えられてないところの部分はどのように処理されるのでしょうか?
0492デフォルトの名無しさん
2008/08/28(木) 01:12:29基本的に変数や配列の中身はゴミが入っていると思ったほうが良い。
0が入っていると思ってはいけない。
共同利用のコップと同じで洗ってから使えw
0493491
2008/08/28(木) 01:26:190494デフォルトの名無しさん
2008/08/29(金) 21:57:13データを入力すると
RUNTIME ERROR
Error 29.Call to missing routine AAA
といってエラーが出ます、これはどういう意味でしょうか??
0495デフォルトの名無しさん
2008/08/30(土) 00:22:31副プログラムAAAが存在しないというエラーだが、普通はリンク時に存在しないと怒られる。
externalとかで引数にでもしてるのかな?
もう少しコンパイラ等を詳しく。
0496デフォルトの名無しさん
2008/08/30(土) 19:20:51しがらみのない自由の身なら、断然90/95。並列化など、将来性も多少はあるかもしれない。
一方77は、過去の遺産を引き継ぐはめになった人が、発狂しながら解読するもの。
0497デフォルトの名無しさん
2008/09/01(月) 21:25:09それで実際に試してみたのですが、コンパイルが上手くいきません。
77を使っていた時はテキストエディタにfcpadを使っており、マウス操作でコンパイルしていましたが、
g95ではコマンドプロンプトでコンパイルするため、勝手がよく分からず困っています。
例えばhello.f90というファイルを作ってコンパイルするとき、
g95 hello.f90 -o a.exe
とコマンドプロンプトで入力すると
g95: hello.f90: No such file or directly
となってしまいます。
こうなってしまうのは入力した内容がおかしいからでしょうか?
ファイルの保存場所などにも関係があるのでしょうか?
あまりに初歩的な内容で申し訳ないのですが、よければよろしくお願いします。
0498デフォルトの名無しさん
2008/09/01(月) 22:40:26>g95: hello.f90: No such file or directly
hello.f90 が(g95から見て)見つからないのでコンパイルできません。
cd コマンドで hello.f90 が保存してあるディレクトリに移動してからコンパイルして下さい。
現在居るディレクトリ(カレントディレクトリ)は通常コマンドプロンプトのカーソルの左に
C:\hage\> 等と表示されています。
0499デフォルトの名無しさん
2008/09/02(火) 07:53:41わかりやすい説明ありがとうございます。
申し訳ないですが、もう1つ質問してもいいですか?
helloの拡張子がfだとコンパイルできるのですが、f90やf95に変えると
g95: hello.f90: No such file or directly または
g95: hello.f95: No such file or directly
となってしまいます・・・。これはなぜでしょうか?
0500デフォルトの名無しさん
2008/09/02(火) 23:06:57まずエクスプローラでファイル名及び拡張子が確実に「hello.f90」になっているかチェック。
エクスプローラは必ず「拡張子を表示する」設定にしておくこと。
メモ帳で編集している場合は「テキスト文書(*.txt)」で保存すると勝手に拡張子 .txt を付けられて
「hello.f90.txt」となっている場合がある。
0501デフォルトの名無しさん
2008/09/04(木) 11:22:12COMMON文やGOTO文がそこらじゅうにあって解読するのが大変だ・・・。
個人的にはF90以降形式で書きたいけれど、ここに書き加えて大丈夫かな?
>>499
windowsなら、g95の後にソースコードをドラッグ&ドロップか、
vistaならソースコードのアイコンを、shiftを押して右クリック、パスとしてコピーをして
プロンプトにパスを貼り付けて実行してもダメ?
0502デフォルトの名無しさん
2008/09/04(木) 19:58:26>>501
色々と試してみましたが、やはり上手くいきませんでした・・・。
もうちょっと試行錯誤してみます。
こんなくだらない質問に答えていただき、ありがとうございました!
0503デフォルトの名無しさん
2008/09/06(土) 01:22:52V.11が来年一月までの期限付きだが、無条件に配布されている。
Windows版はVisualStudio(Fortran 専用)つきで。
気になる人はチェキラ!w
ここの右下に入り口あり。
ttp://www.intel.com/cd/software/products/asmo-na/eng/399359.htm
めーる登録でライセンスキー送られてくる。
Fortran2003対応の模様。インストールにXP以降が必要。
仕事マシンWin2kの俺様涙目w
0504デフォルトの名無しさん
2008/09/06(土) 01:53:15以下のような配列を宣言することはできるのでしょうか?
1 2 3
a = 4 5
6 7 8 9
言葉にすると、「i成分ごとに異なる数のj成分が存在するような配列を宣言できるか?」
ということになります。
不要な成分に0を入れて(3,4)成分の配列をつくるのが素直なのかもしれませんが、メモリの関係でそのような配列の宣言ができませんでした。
#実際の問題設定は、三次元の多相流の計算です。
#計算領域がいくつかのゾーンに分かれており、
#それらの領域すべての物理量をひとつの配列で取り扱おうとしています。
#従って、座標3成分、相の種類1成分、物理量の種類1成分、ゾーン1成分
#の計6成分の配列を取り扱います。
#ゾーンの大きさがマチマチなので最大のものに合わせて配列を宣言すると
#メモリが足りなくなってしまいます。
0505デフォルトの名無しさん
2008/09/06(土) 08:51:02つかってみよっと
0506デフォルトの名無しさん
2008/09/06(土) 11:28:03F90以降なら構造型を使う。
F77なら、確かEQUIVALENCEで部分配列に別名を付ければ、そのようなことが出来なくもなかったはず。
ただ、諦めて複数の配列変数に分割する方か、見通しがよくなるかもしれない。
F77では、まともにコーディングしたことない、つーか、したくないので、他に定石があるかもしれんが…
0507デフォルトの名無しさん
2008/09/06(土) 13:59:21配列の持たせ方を変える方法はどうかな?
上記の例の場合、
実際にデータのあるa(9)に値を入れ、
参照配列b(3)にa中の各行の値の入る先頭番号を入れる。 b(1)=1,b(2)=4,b(3)=6
各行の先頭の値は例えば下記のように取り出す
do i = 1, 3
print *, a(b(i))
enddo
0508デフォルトの名無しさん
2008/09/06(土) 15:07:44ALLOCATEすればいいかな。
0509デフォルトの名無しさん
2008/09/06(土) 17:03:260510デフォルトの名無しさん
2008/09/06(土) 17:39:30ためしてない
0511デフォルトの名無しさん
2008/09/06(土) 18:24:23付属のVisualStudio環境ではF90の作業用の前提となっているのか
そのエディタは6カラム目の素敵な継続行カラムなどに配慮されていません
そのあたりF77の固定カラムに便利なように設定は変更できないでしょうか?
0512デフォルトの名無しさん
2008/09/06(土) 19:25:04ツール>オプション>フォントおよび色
で変えられたはず。
のであったが、>>503の新版入れたらなんかおかしくなったwww
0513デフォルトの名無しさん
2008/09/06(土) 21:29:470514デフォルトの名無しさん
2008/09/07(日) 01:00:56ありがとうございます。
構造体を使うことも検討したのですが、ゾーンを指す変数nzでdo文を回したいと考えていたので、今回は用いませんでした。
割付け配列についても、ゾーン間で補完を行う必要があり、同時にすべてのゾーンのデータを保持する必要があるため、今回の用途には適さないのではないかと考えています。
>>507さんのアドバイスを検討してみます。
0515デフォルトの名無しさん
2008/09/07(日) 21:38:02gfortran -o xxx.exe 2ch.f90でおkですよ。
でも、同じくgfortranで自作ライブラリのリンクの仕方が分からない・・・
どうやってコマンドを入力すればいいんだろう・・・。
0516デフォルトの名無しさん
2008/09/07(日) 22:16:59gfortran hage.f90 -lmytoupee
または
gfortran hage.f90 libmytoupee.a
モジュールとライブラリのパスはそれぞれ -I, -L で適時指定すること。
0517デフォルトの名無しさん
2008/09/08(月) 03:10:450518デフォルトの名無しさん
2008/09/08(月) 21:58:22ありがとうございます。
でも、自分がものすごく初歩的な勘違いをしているかもしれませんが、
ネット上のライブラリはOKでしたが、自作ライブラリがうまく使えないんです。
ライブラリってサブルーチンやモジュールをいろいろなプログラムで使えるようにしたもの、
という認識でいいのでしょうか?
0519デフォルトの名無しさん
2008/09/11(木) 00:35:44ar cr module.a *.o
ranlib module.a
gfortran main.f90 ./module.a
./a.out
でダメか?作った静的ライブラリをパスの通っている場所にコピーして使ってもおk
0520デフォルトの名無しさん
2008/09/11(木) 21:00:58微妙にスレチですみませんが・・・
intel fortran compiler10.1をknoppix(5.3.1)の環境でインストールしようと思い、
ttp://www.obihiro.ac.jp/~suzukim/masuda/ifc101_install.html
の手順にそって行っていました。
しかし、ライセンス文を読み進めたあとに
Where do you want to install to? Specify directory starting with '/'.
[/opt/intel/fc/10.1.015] :
でそのままEnterを押し、インストールが開始され、
Installing...
という文字が出るのですが、そのままPCがフリーズしてしまいます。
何度か再起動しやり直しましたが同じでした。
これはkoppixそのままの環境ではインストールできない
ということでしょうか?
初歩の初歩だと思うのですが、
どなたかご教授お願いいたします。
0521デフォルトの名無しさん
2008/09/12(金) 00:14:120522520
2008/09/12(金) 01:17:25他で少し調べたのですが、
HDDにknoppixをインストールして使うべきなのでしょうか・・・。
0523デフォルトの名無しさん
2008/09/12(金) 11:26:51knoppixのハードディスクインストールって、普通のディストロのインストールと
比べて簡単かなぁ
0524デフォルトの名無しさん
2008/09/13(土) 00:30:43ありがとうございます。うまくできました。
こうして作ると、modファイルも生成されるのですが、
このmodファイルもライブラリ配布の時に必須なのでしょうか?
modファイルが無いとコンパイルに失敗するので・・・。
0525デフォルトの名無しさん
2008/09/14(日) 02:17:51/opt が CD-R にあるから書き込めないんだと思う
knoppix を HDD にインストールして使えば大丈夫でしょ
>>524
モジュールを使ったライブラリ配布するならモジュールが記述されたソースファイルを配布すればいい
それ以前に、ライブラリを配布するなら全てのソースファイルを配布してくれるのが一番ありがたい
どうしてもソースの公開がいやならば、静的ライブラリだけでなく、動的ライブラリも付けたほうがいい
0526デフォルトの名無しさん
2008/09/17(水) 11:02:26attempt to read past end-of-failというエラーメッセージが表示されます。
この原因と対策について教えていただければありがたいです。
0527デフォルトの名無しさん
2008/09/17(水) 11:36:35>attempt to read past end-of-fail
end of file じゃないの?
ファイルを読み込んでいるうちに、まだ読まねばならないはずなのに、おしまいまで
来てしまったというエラーだと思う。
0528デフォルトの名無しさん
2008/09/18(木) 21:56:24あと>>503に登録したけどメール来ない(´・ω・`)
0529デフォルトの名無しさん
2008/09/18(木) 23:05:08>>525
ありがとうございます。確かに、ソースファイルを渡すのが手っ取り早いですね。
静的、動的ライブラリがいいんですね。覚えておきます。
何度も質問で申し訳ありません。Fortran90形式でplplotを使いたいと思うのですが、
CMAKEを使って処理をすればよいとのことでしたが、f90コンパイルをONにしてもエラーになって
C++とF77形式のみでしかmakeができません・・・。
できたファイルを見てもほとんどがC++の形式で、VS2005で開いてコンパイルも失敗してしまいます。
どうしたらFortran90形式でライブラリを読み出して使えるようになるでしょうか。
0530デフォルトの名無しさん
2008/09/23(火) 19:37:35eclipse + Photran で大丈夫だと思う。Windows版は使ったことないから保証できんが。
>>529
plplot は使ったことないからわからんな。すまんこ。
おいらはグラフィックは gnuplot に描かせている。system 関数で端末のコマンド打てるから
それ使えば自動でグラフ表示できるよ。
0531デフォルトの名無しさん
2008/09/23(火) 22:01:39Sign Up Now! のところではなく、右下のLINKを踏んで登録だぜ!
0532デフォルトの名無しさん
2008/09/25(木) 02:48:38以下のようなファイルに収められた数値を順番(?)に読み込むことは可能でしょうか
200709150 左から4文字までが年、そこから2文字で月、さらに3文字でガソリンの価格
200710151 最近30年を対象に年ごとのガソリン価格の平均を求めるプログラムを作りたいのですが
200711153 とりあえずデータを年・月・ガソリン価格に分けて読ませたいのですが
200712151 なにかいいアイデアはございませんでしょうか?
200801149
(以下同様に続く)
0533532
2008/09/25(木) 02:50:200534デフォルトの名無しさん
2008/09/25(木) 08:08:25「調べてもわからなかったので・・・」の内容を詳しくよろしく
0535532
2008/09/25(木) 09:04:200536デフォルトの名無しさん
2008/09/25(木) 09:19:49だれが"調べる"の定義を詳しく言えといったんだ…
0537532
2008/09/25(木) 09:28:280538デフォルトの名無しさん
2008/09/26(金) 18:01:491) 自分で調べる気がないので神が答えを書いてくれることを期待した丸投げ
2) 丸投げだと印象が悪いかと思い、調べてもいないくせに「調べてもわかりません」
3) ちゃんと調べたけどわからない勤勉な人
回答:
a) 質3なら回答してあげたい
b) 質2なら遠まわしに回答
c) 質1なら放置
532が教科書等で何を調べたのかどう調べたのかで
教えてあげるかどうか決めたいってことでしょ
0539デフォルトの名無しさん
2008/09/26(金) 18:21:17こんなもん調べてもわからないような奴の方がカス
0540デフォルトの名無しさん
2008/09/26(金) 22:08:54READ(10, '(I4, I2, I3)') IYEAR, IMONTH, IPRICE
これで読め!
0541デフォルトの名無しさん
2008/09/27(土) 17:31:140542デフォルトの名無しさん
2008/09/27(土) 18:46:24do i=1, 3
read(unit=10, fmt='(I5)', advance='NO') n(i)
end do
0544デフォルトの名無しさん
2008/09/29(月) 14:28:56原因として何が考えられますでしょうか
0545544
2008/09/29(月) 15:35:53一息ついて後でみると以外とすぐミスがわかったりしますよね
0546デフォルトの名無しさん
2008/09/29(月) 16:42:11なんかこのスレ見てるぶんには
PL/Iに文法が似てますねえ
0547デフォルトの名無しさん
2008/09/29(月) 18:28:020548デフォルトの名無しさん
2008/09/29(月) 23:08:21FORTRANの方が先祖だけどな。
PL/I=FORTRAN+COBOL かな。
昔はIBMに勤めると嫌でもならわされていたような。
0549デフォルトの名無しさん
2008/09/30(火) 00:48:45ありがとうございます。
gnuplotをダウンロードして、早速使ってみました。
うまく工夫すれば直接Fortran計算結果をグラフにできるようなので、いろいろと試してみます。
0550デフォルトの名無しさん
2008/10/01(水) 12:48:12fortran77で構造計算のプログラムを今作っています
入力した値で図を作りたいのですが
fortranで線をひいたりはできますか?
できない場合はどうしたらいいでしょうか??
0551デフォルトの名無しさん
2008/10/01(水) 13:15:24電脳ライブラリでの作図、なんてどう?
http://wwwoa.ees.hokudai.ac.jp/~galapen/datab/lec02/ensyu/ex101.htm
fortran で計算だけしておいて、gnuplot で作図する方がよいかも。
0552名無し
2008/10/03(金) 23:50:240553デフォルトの名無しさん
2008/10/04(土) 01:50:27球を表示したいのは分かるが、どんなデータを計算するのか分からない。
球を表示するだけなら3Dソフトで良いし、何かの計算値を可視化したいんなら
無理にFortranでやるよりグラフ化のソフトでも使った方が良いと思う。
0554名無し
2008/10/04(土) 19:31:27大きさlのセルの中に直径mの球をn個発生させてモンテカルロ法によるs回のステップによって
セル内で球体を動かし、そのときの動く様子をグラフィック表示しようと考えています。
グラフ化できるソフトについてよいものがあれば教えてください。
0555デフォルトの名無しさん
2008/10/04(土) 22:28:06Graph−Rで作成
こんなんで良いのかな?
http://www.hsjp.net/upload/src/up45654.png
必要データはXYZの座標と球の半径。
有料のものは試してないし、他にもたくさんあると思う。
0556デフォルトの名無しさん
2008/10/05(日) 00:00:16OpenGLという手もあるな。
コンパイラで対応していればだが。
0557デフォルトの名無しさん
2008/10/13(月) 14:23:520558デフォルトの名無しさん
2008/10/13(月) 14:31:410559558
2008/10/13(月) 14:39:420560デフォルトの名無しさん
2008/10/13(月) 19:22:54どこでどう調べたのか知らんが タイムスタンプ=コンパイル失敗 ではないぞ。
>>557
つ [Caps Lock]
0561557
2008/10/13(月) 22:38:29今行列やってるんですが行列の入出力のみだけで
double a(6)(6)
read (*,*) a
*ただし行の順に代入。値はもともと代入
write (*,*) a
のはずですがでないようですこれで間違っているところを教えてください。お願いします
文字列まで目を通しましたがここだけがどうも理解できないんです
0562デフォルトの名無しさん
2008/10/13(月) 22:59:38>double a(6)(6)
real*8 a(6, 6)
あんたはC使いか? もっと真面目に文法勉強しろw
0564デフォルトの名無しさん
2008/10/14(火) 23:32:27汎用性を考えると、double precision の方が良くね?
0565デフォルトの名無しさん
2008/10/15(水) 00:26:050566デフォルトの名無しさん
2008/10/15(水) 01:23:35文法に忠実だとそうなるんだが、世間にあふれている77のプログラムのほとんどは
REAL*8になってるんだよな。
だから、Fortran世界の標準という意味ではいいんでね?
短くていいし。
0567デフォルトの名無しさん
2008/10/15(水) 02:11:090568デフォルトの名無しさん
2008/10/15(水) 11:45:05長いからいやん。
0569デフォルトの名無しさん
2008/10/17(金) 12:52:56そしてみなさんサブルートン別の文の番号はどのように使い分けてますか?
0570デフォルトの名無しさん
2008/10/18(土) 12:27:45fortranで
EX(JT,JX,JY,JZ)
という具合で示されるの多変数関数は
cではどういう風に扱えばよろしいでしょうか?
配列ですか?
0571デフォルトの名無しさん
2008/10/18(土) 17:54:55質問の意味が分からん。
0572デフォルトの名無しさん
2008/10/18(土) 20:22:14ex(JZ,JY,JX,JT)
Cでは縦横が逆のアホ仕様だ。
0573デフォルトの名無しさん
2008/10/19(日) 10:27:10とでるんですがどういうときでるんでしょうか?あと
*** invarid 〜〜〜
とでるときは宣言が文頭にないとき以外はどういうときでしょうか?
0574デフォルトの名無しさん
2008/10/19(日) 11:15:43ja(2i-2,2j-3)=〜〜
というi,jに値を代入する形は左辺では使えないんでしょうか?
0575デフォルトの名無しさん
2008/10/19(日) 11:32:52質問をする前にまず>>1の注意事項をよく読むんだ。話はそれからだ。
0576デフォルトの名無しさん
2008/10/19(日) 12:12:29do i=2,6
do j=2,6
if (i.ne.j) then
ja(2i-2,2j-3)=yg(i,j)*e(i)+yb(i,j)*f(i)
ja(2i-2,2j-2)=-yb(i,j)*e(i+1)+yg(i,j)*f(i)
ja(2i-1,2j-3)=-yb(i,j)*e(i+1)+yg(i,j)*f(i)
ja(2i-1,2j-2)=yg(i,j)*e(i)+yb(i,j)*f(i)
else
ja(2i-2,2j-3)=c1(i)+yg(i,j)*e(i)+b(i,j)+f(i)
ja(2i-2,2j-2)=d(i)-yb(i,j)*e(i)+yg(i,j)*f(i)
ja(2i-1,2j-3)=-d(i)-yb(i,j)*e(i)+yg(i,j)*f(i)
ja(2i-1,2j-2)=c(i)-yg(i,j)*e(i)-yb(i,j)*f(i)
end if
end do
end do
と打ったらすべての計算文に
*** "I" found where not expected
が出ました。グーグルで調べてもわかりません
(OS・コンパイラ・バージョン)=(XP、Cpad、FTN77)です
全部で500行ぐらいになってるのですが詳しくというのは難しいですが
昨日からここのサブルーチン作成でつまづいてます
0577デフォルトの名無しさん
2008/10/19(日) 12:19:370578デフォルトの名無しさん
2008/10/19(日) 12:27:13覚えたての勘違いは大変ですね。ありがとうございました
0579デフォルトの名無しさん
2008/10/19(日) 16:03:49IntelのShopが無くなって、どっかのリセラーからライセンスを買わねばならんようなのだが
どこから買えば一番安い?あるいは一番いい?
日本のXLSoftは妙に高いし。
0580デフォルトの名無しさん
2008/10/21(火) 08:41:060581デフォルトの名無しさん
2008/10/21(火) 20:22:150582デフォルトの名無しさん
2008/10/22(水) 00:39:21処理系による。
デバッグ用のオプションでも付けない限り、そんな些細なことは
気にしないコンパイラの方が多いような気がする。
>>580
オブジェクト指向?( ´_ゝ`)フーン 【OBJect oriented? FU-N】 の略
FORTRAN使いの大半が抱くオブジェクト指向プログラミングに対する感想を表している。
0583デフォルトの名無しさん
2008/10/22(水) 04:26:48do 10 i=1,10
OBJFUN=OBJFUN+X*X*DLOG(X)
OBJFUN=OBJFUN
ってどういう意味ですか?
0584デフォルトの名無しさん
2008/10/22(水) 12:36:58文法書を開いて代入のところを100回読め。
読書百遍意自ずから通ず
0585デフォルトの名無しさん
2008/10/22(水) 21:29:570586デフォルトの名無しさん
2008/10/22(水) 23:37:39別にいいと思うけど、巨大なサブルーチンはブロックに分けるべきとおも。
commonとか使いまくってわけわかんないプログラムになるよりはマシとおもう。
0587デフォルトの名無しさん
2008/10/23(木) 15:15:00「ブロックに分ける」というのはどういう意味ですか?
Fortran90以降ではモジュールの使用が推奨されてますが、これとは別ですか?
0588デフォルトの名無しさん
2008/10/24(金) 15:08:24soubroutine X(A,B,C,・・・,)
っていうのを
soubroutine X(A,B,C)
soubroutine Y(D,E,F)
soubroutine Z(G.H,I)
みたいな
0589デフォルトの名無しさん
2008/10/24(金) 17:02:230590デフォルトの名無しさん
2008/10/24(金) 17:20:11ってのが前は常識でしたが、今は95も入るのかな?
2000台のバージョンをコード開発の仕事で使ってる人なんてほとんどいないだろうけど
0591デフォルトの名無しさん
2008/10/25(土) 00:11:50integer :: a(10)
a(0)=123
とすると、どこか別のアドレスに書き込んだりしますか
0592デフォルトの名無しさん
2008/10/25(土) 10:22:18コンパイラの実装による。つーか、やってみれ。
gfortranみたいに、コンパイル時に警告するだけで、平気で実行できるものもある。
コンパイル自体通さない方が、Fortranらしい実装だと思うんだがな。
ただ、いずれにせよ、外部手続きの引数として配列を渡す場合には、チェックされない。
>>589
まだcommonブロックだけなら…
+暗黙の型宣言+固定形式の、必殺三段コンボが決まると悲惨だけど。
0593589
2008/10/25(土) 15:21:23でも implicit none してるお。intent つかって出入りのチェックもしてるお。
とってもいびつなF77になってるけどOpenMPも時々気が向いたときに使ってるよ。
MPI使う予定なのでさすがにそろそろcommonブロックとおさらばせねば・・。
0594デフォルトの名無しさん
2008/10/25(土) 19:00:16逆だ。
気にせずどこまでもはみ出して行くのがFORTRANらしさだ。
というか、昔はサブルーチン側ではそうやっていた。
0595デフォルトの名無しさん
2008/10/25(土) 19:26:04マンドクサすぐる
0596デフォルトの名無しさん
2008/10/25(土) 20:25:020597デフォルトの名無しさん
2008/10/25(土) 23:42:23いや、外部副プログラムへの引数渡しでは、f90/f95でも引数の型チェックは一切しない。
配列受け取る仮引数に、スカラ変数を実引数として渡しても、エラーにならない、
だからこそ、モジュールや内部副プログラムが導入された訳で。
>>596
gfortran (v4.2) は、それらしいオプションがないんよ。
0598デフォルトの名無しさん
2008/10/26(日) 00:02:12-fbounds-check
0599デフォルトの名無しさん
2008/10/26(日) 00:22:52FORTRANは早さが命。
そんなはみだしをチェックしていたら遅くて死んでしまう。
はみだしチェックはデバッグの時だけだZE!
0600デフォルトの名無しさん
2008/10/26(日) 00:24:29>いや、外部副プログラムへの引数渡しでは、f90/f95でも引数の型チェックは一切しない。
参照渡し、つまりアドレス渡しってことだよね
要するに、subroutineは外部じゃなくモジュール内に書けばおkってこと?
0601デフォルトの名無しさん
2008/10/26(日) 00:38:45実行時にチェックして出すんですよね?
0602デフォルトの名無しさん
2008/10/26(日) 01:32:33形状引継ぎ配列で渡せばサブルーチン側でも配列の大きさが解るからチェックできるけど
呼び出し側でINTERFACEが必要になるから結局、モジュールにした方が扱いやすい。
>>601
添字が変数だと実行時でないとどこを指してるのか解らん。
まあ、>>591くらいならコンパイル時に検出できるけど。
0603デフォルトの名無しさん
2008/10/26(日) 10:17:18if(・・・)then
num=0
else
num=hoge
endif
で入れた後、「numが0なら」というif文をするとき、普通に if(num.eq.0) とするのは大丈夫でしょうか?
それとも、計算機の誤差みたいなのが入って、意図したとおりに判定されない場合もあるのでしょうか?
0604デフォルトの名無しさん
2008/10/26(日) 10:30:51num が浮動小数点なら .eq. は禁忌。整数ならもちろんOK。
if (abs(num) .LT. 1.0e-10) ....
とかにしとくべし。
0605デフォルトの名無しさん
2008/10/26(日) 14:37:31計算結果は代入せずに、0.0d0と1.0d0だけ直接代入するような
場合は.eq.0.0d0を使っても良いでしょうか?
最近そんなコードを貰ったんです。
0606603
2008/10/26(日) 15:17:16ありがとうございます。やはりそうですか・・・。
今問題なく動いてるのは、たまたまそういう環境だったと考えるべきなのですね。
ちなみに環境はXoen、Intel Fortran 10.1、RedhatEnterpriseLinuxという、ごくありふれた構成です。
0607デフォルトの名無しさん
2008/10/26(日) 16:45:10浮動小数点での有理数どうしの比較なら、正確に数値が表されているので基本的に問題は生じない。
したがって問題がない可能性もある。
現在標準の二進法の浮動小数点なら、0.0や1.0、0.5とか0.25は有理数になる。
この辺を理解したうえでやるのなら、浮動小数点同士の .EQ. もあり。
0608デフォルトの名無しさん
2008/10/26(日) 17:12:09>現在標準の二進法の浮動小数点なら、0.0や1.0、0.5とか0.25は有理数になる。
そうなんですか
ということは、10/3や5^1000みたいな計算をしなければ
有理数な浮動小数点は永遠に有理数のまま(=誤差ゼロ)なんですか?
0609デフォルトの名無しさん
2008/10/26(日) 18:20:58してくれる(flush to zero)。おまけでほんのちょっとだけど速くなる、はず。
実数値の等号評価とは違うけどまぁ、小さい数字がらみということで。
0610デフォルトの名無しさん
2008/10/26(日) 18:26:20有理数、というかこの場合 2^n (a0 + a1 * (1/2)^1 + + am *(1/2)^m)
で書ける数字で、かつn, mが予想の付く範囲でしか変化しない場合にはいっそ
ビットで処理すると良いかも。遅くなりそうだけどそのばあい誤差がゼロになって
しあわせ。
0611デフォルトの名無しさん
2008/10/26(日) 18:36:000612デフォルトの名無しさん
2008/10/26(日) 19:49:27十進数を二進数で表すときに割り切れないために生ずる部分の誤差に関してはその通り。
一般論としては>>604のいうように、浮動小数点同士の.EQ.比較はナンセンスであることが多い。
しかし、危険性を分かって使う分にはOK。
>>610
昔ならともかく、今の時代では、ビット処理は遅いだろ。
浮動小数点処理なら専用ハードウェアでやってくれるから。
0613デフォルトの名無しさん
2008/10/30(木) 23:14:57WARNING - Common variables should be predefined in a BLOCK DATA subprogram
コモンに入れて他のサブルーチンに持っていきたいんですけど・・・問題ありますか?
0614デフォルトの名無しさん
2008/10/31(金) 00:17:22program
common yosou(10)
call routineA(yosou)
stop
end
subroutine routineA(yosou)
common yosou(10)
return
stop
end
みたいなことでもやってんじゃないの?
0615デフォルトの名無しさん
2008/10/31(金) 00:34:52規格上は名前付き共通ブロック内の変数はBLOCK DATAを使って初期化しないといけない。
無名共通ブロック内の変数は初期化できない。
処理系拡張で許してる場合もあるけど、
program main
common /aa/ n(5)
data n/1,2,3,4,5/
・・・
end
*
subroutine sub1()
common /aa/ n(5)
data n/6,7,8,9,10/
・・・
end
とかやっちゃうと・・・
0616デフォルトの名無しさん
2008/10/31(金) 23:32:21標準エラー出力のwrite(0,*)に相当するものはあるんでしょうか?
0617デフォルトの名無しさん
2008/11/01(土) 01:44:08ない。
そもそも0番が標準error出力というのも規格に規定されているものではない。
ただFortran2003では、ISO_FORTRAN_ENV の中に、error_unit という定数が定義されて、
これが標準エラー出力に対応する番号になった。
昔はパンチカードに出力する PUNCH 命令があった。
0619デフォルトの名無しさん
2008/11/03(月) 22:26:33READで0.1を読み込んで、WRITEで書き出すと、0.1000001みたくなるのですが、
どうすればちゃんと0.1で表記されるようになりますか?
0620デフォルトの名無しさん
2008/11/03(月) 22:43:46表示だけでいいならFORMAT文
read(5,*) test
write(6,1) test
1 format(F3.1)
0621デフォルトの名無しさん
2008/11/03(月) 23:00:5110進数の0.1は2進数で表すと循環小数になるので「ちゃんと0.1」にするのは無理。
0622デフォルトの名無しさん
2008/11/04(火) 13:51:03ん〜、0.1e0 とか指数部つけても改善しないか試してみたら?
あとは、入力の数字が0.1刻みの場合、
read(*,*) i
a=float(i)*0.1e0
とするとか。・・・・621のが正しいのであまり改善しないかな?
0623デフォルトの名無しさん
2008/11/04(火) 18:39:56それなら
a = dble( i )
でも良いのでは?a が real*8、i が integer としてだけど。
0624デフォルトの名無しさん
2008/11/04(火) 22:31:11そこでWindows環境での推奨実行環境はどのようなものですか?
今は遊び程度なので,colinux(g95)+秀丸で済ませていますが,スマートでない気がします。
というか,エディタと実行環境がOSを縦断しており,スマートでないです。
ついでにといってはなんなのですが,皆さん非常にお詳しい。
どんなプロフィールをお持ちの方々なのですか。
やはり言語の性質上,土木とか海洋のドクターとか研究機関の方が多いのでしょうか。
0625デフォルトの名無しさん
2008/11/04(火) 23:02:01大規模計算ならOpenMPとか並列ライブラリつかえるコンパイラがいるし、
デバッグまで環境整えるならデバッガもいるし、
データの可視化やるならOpenGLライブラリとか使えないとダメだし。
必要にかられてFortranやるならともかく、
プログラムの勉強するならC++とかの方がいいと思うんだが。
0626デフォルトの名無しさん
2008/11/04(火) 23:25:57比較的計算時間のかからない数値計算なので並列化の予定はないですし,
デバッガもいりません(使い方よく知りません)。
可視化はgnuplotで十分です。
ただ,下敷きプログラム大量なのでFortran限定です。
あと,簡単なラプラス方程式の数値計算プログラム程度ならFortranで書けます。
適当にperlなんかも書いたりはしますが。
こんな感じなのですが・・・。
0627デフォルトの名無しさん
2008/11/05(水) 11:33:40Fortranを学ぶことにするとは運のいい人間だ。
Fortranは歴史と伝統のある言語で、コンピュータ界で古文から現代文までを学べる最高言語。
>>625のようなクズの言う事は無視しておけばいい。
Windows+g95がよければ、MinG版のg95ならインストーラで一発だ。
ただでバリバリやりたいならLinux+Intel Fortranか。
Windowsでは、SilverdrostのFTN95がただでいける。VisualStudioとの統合もできる。
ただし実行時にいちいち但し書きが出るのがウザイ。
その他フリーに限っても、選択肢は色々ある。
並列化もOpenMP、coArray、MPIと何でもござれ。OpenGLも対応多し。
Fortranのバグは巨大配列の葉見出しが多いので、デバッガは大概役に立たないので気にするなw
0628624
2008/11/05(水) 18:13:48ありがとーう。
やっぱりただがいいな。
ケチるというより,LinuxならIntelでもタダってのがなんだし。
SilverfrostはVSライクなインターフェースに及び腰だったが,
入れてみるかな!
GUIっぽいのに慣れるのもなんだかな,っと。
gとかIntelとかに対する致命的な実装の違いとかないよね?
0629デフォルトの名無しさん
2008/11/06(木) 11:19:03アカデミックならかなり割安で買えるし
0630デフォルトの名無しさん
2008/11/07(金) 04:34:440631デフォルトの名無しさん
2008/11/08(土) 01:20:24>>630
その意見もよくわかるのだが,なんか違う気がする。
ロムはタダなのに,エミュ本体だけ金がかかる感じ?
ちなみにアカデミックではありません。
モチベーションは,俺がドケチなことでカバー
0632579
2008/11/08(土) 02:45:42まぁそう言わずにw
言語で商売が成立しているのはもはやFortranくらいだし。
そういえば、Intel Fortran Ver.11 が正式に出たね。
結局 Intel Fortranのライセンス更新はここでやったよ。
ttp://www.cs-software.com/software/fortran/intel/intel.html
割引5セントw $279.95
ただし、セキュアーでない平文HTTPでクレカ番号を送らされたのは参ったw
ほかに15%引きのところもあったが、米国内のみ?っぽくてオンラインフォームが使えなかった。
メールでやり取りすればできたのかもしれないので、誰か挑戦してくれ。
0633デフォルトの名無しさん
2008/11/08(土) 17:25:09実際そうだし
0634デフォルトの名無しさん
2008/11/09(日) 07:36:16Fortran以外の言語は商売にならないの?
0635デフォルトの名無しさん
2008/11/09(日) 17:44:13店に行っても売って無いじゃん?
Borlandですら商売にならないんだから。
MSのVisualStudioも言語というより環境を売っている感じだし。
コンパイラや言語に金を払うという常識も廃れ始めているし。
ソフトはハードのおまけ、形の無いものに金は払えないという唯物論時代へ逆戻りw
0636デフォルトの名無しさん
2008/11/09(日) 20:08:340637デフォルトの名無しさん
2008/11/09(日) 20:26:53>そういえば、Intel Fortran Ver.11 が正式に出たね。
とりあえず「ぜんぶ入り日本語版」を落としてきて入れてみた。
なるほど、色々と日本語になっているが、所々妙な文が・・・
「error #5082: 黒カエラー、」ってなんだよ!
これ、英文メッセージで表示させるオプションとかないの?
0638デフォルトの名無しさん
2008/11/09(日) 21:08:58コンパイラはフリーのだけになるのだろうか…
0639デフォルトの名無しさん
2008/11/09(日) 22:25:18さっそく特攻とはヒトバシラーだなw
0640デフォルトの名無しさん
2008/11/09(日) 22:50:45ソフトを直接売って儲けるよりも、顧客を囲い込むことのほうがはるかにメリットがあるからね
こういう大手の理論のおかげでBorlandはじめ中小涙目
0641デフォルトの名無しさん
2008/11/09(日) 23:16:320642631
2008/11/10(月) 03:17:35さて,話の腰を折るようですが,勉強には大変重要とみなされているであろう「下敷き(勉強用)プログラム」。一般的には先輩諸氏の遺産でしょうし,俺もそうなのだが,こんなリスキーな話もない。井の中の蛙,誰も得をしない。
特に,FORMATの文番号の付け方とか,習慣的な文法には形式的な解答もないのでたちが悪い!!
ある程度の長さ(高々1000行くらい?)で,お手本になるような綺麗で実用的な文法で書かれたソースってありますか?マジで重要だと思うので,うかがいたい!
0643デフォルトの名無しさん
2008/11/10(月) 03:19:320644デフォルトの名無しさん
2008/11/10(月) 14:22:04俺が書いたコード
0645デフォルトの名無しさん
2008/11/10(月) 17:18:18なんかよくわからん。高々1000行って
特段の実用性のないサンプルなら100行超えることはないべさ。
そもそもFortranで出来ることが少ない分覚えることも少ない。コード書きも一緒。
IFブロックやDOループでのインテンドをスペース一個にするか2個にするかを
大文字でそろえるか、変数だけ小文字にするか、などなどを
自分で決めたら、はい、きれいなコードのできあがり。
なんかつれないけどそんなもの。
強いて言うと、たしか気象庁の人たちが作ったガイドラインが
どっかで拾えたので参考にすると良いと思う。
0646645
2008/11/10(月) 17:22:42あとは強いて言えば東大出版会から出てたFortranの教科書中のコードは
きれいだった。タイトル著者ともに忘れた・・。
わしが買ったときは真っ赤かな表紙だったが。
0647デフォルトの名無しさん
2008/11/10(月) 17:26:23あんまり拘りすぎるのも良くないと思う
>>646
東大出版会からそんなん出てたんだ?名著なの?
0648642
2008/11/11(火) 01:08:12ありがとう!ググったらすぐに出てきたよ!
まさにこういう情報が欲しかった。色々と目からうろこ。
ずっとdouble precision使ってた・・・
少なくとも俺ルールよりはるかによさげ。
全部頭に叩き込んでおく。
ちなみに俺が教養の時は浦先生の使ってた。
0649デフォルトの名無しさん
2008/11/11(火) 01:40:36Fortranが覚えることが少ないというのは、77時代のことでは?
F90でALGOL系の文法を飲み込んで、F2003でOOP(最近使わない書き方だがw)すら取り込もうと
している今、肥大化する一方のFortranに、手本となるコードがあるのが望ましいのは否めない。
F90にしたって、Module使えばいいのに、いちいちインターフェース書いてる人とかいるし。
F90が出始めの頃は、Essential Fortran とか言って、LaheyのELF90とかどこぞの『F』とかの、
旧世代との互換性を切り捨てた処理系で、書法を教えようという動きもあったが、
今一世間的にははやらなかった。(つまり、よい書式を望む雰囲気は薄い)
また変数命名にしても、計算機学科的には、変数名を暗黙の型にあわせるのはナンセンスと教えるが、
現実のプログラムではBLAS/LAPACKを初めとするライブラリの命名などにあるように、
暗黙の型を守れという無言の圧力がある。
それに、暗黙の型を守っていないプログラムは、66、77時代からの歴戦の勇士からは、
素人の書いたものとして、鼻から相手にされない傾向もある。
実際いちいち定義欄をみて変数の型を調べる気にはならないし、
暗黙の型に慣れると、型から外れた変数を見ると醜くて、条件反射的にすごく気分が悪くなるw
そもそも時代によってハードウェアのアーキテクチャーも変わるので、それにしたがって書き方の
よしあしが左右されて、よい書式というものも流動的な存在だし。
ベクトル化重視、キャッシュ重視、並列重視とかで、最内ループと最外ループのうち
どっちを重くするべきかとか色々替わったりするし。
というわけで、>>642よ、すべては運命の女神が支配するまま、よいコードを
先輩から貰うことを祈るしかない。ついでにいうと、浦昭二は暗黙の型を守っていないので
どうかと思わざるおえない。気象庁も、式の右辺でも常に配列をA(:)で書けといっているが、
多くの処理系でオーバーヘッドが出る。ゆえに何事も盲信せずにゆく事をお奨めする。
0650デフォルトの名無しさん
2008/11/11(火) 02:07:40良いこと言うなぁ
コードを書くという行為は手段にすぎない、ってことを忘れないようにしたいものですな
0651デフォルトの名無しさん
2008/11/11(火) 02:16:17おれも出たよw
>「error #5082: 黒カエラー、」ってなんだよ!
全体にエラーメッセージは機械翻訳のようなイミフが多くて困る。
英語版に入れなおさないと死ぬw
0652デフォルトの名無しさん
2008/11/11(火) 02:44:150653デフォルトの名無しさん
2008/11/11(火) 09:12:58それとも九州弁?
たぶんintelの中の日本人じゃない人が日本語版作ったんじゃね?
0654デフォルトの名無しさん
2008/11/11(火) 09:57:11TYPE :: t_test
INTEGER :: i = 99
END TYPE
!
TYPE, EXTENDS(t_test) :: t_newtype
INTEGER :: j = 1
PROCEDURE (f), NOPASS, POINTER :: p=>NULL()
END TYPE
!
ABSTRACT INTERFACE
REAL FUNCTION f(a, b, c)
REAL, INTENT(IN) :: a, b, c
END FUNCTION
END INTERFACE
TYPEの中にプロシジャーを入れるとき、CONTAINSが区切りに入ると思うのだが、
エラーが出る。抜くと通る。
わしが理解していないだけかもしれないが。 ????
0655デフォルトの名無しさん
2008/11/11(火) 11:52:29本などを参考にやってみたので、どなたか見ていただけないでしょうか?
real AB(8,8),l
integer n,m
10 continue
write(*,*)'INPUT n,m 2.le.n.m.le.8'
read(*,*) ((AB(i,j),j=1,n),i=1,m)
if((n.lt.2.).or.(m.le.2).or.(n.gt.8).or.(m.gt.8)) then
write(*,*) 'PLEASE INPUT AGAIN'
go to 10
else
do 20 i=1,m
do 30 j=1,n
l=AB(j,i)
AB(j,i)=AB(i,j)
AB=(i,j)=l
30 continue
write(*,*)AB(i,j)
20 continue
endif
stop
end
0656デフォルトの名無しさん
2008/11/11(火) 19:20:22これ逆行列?
0657655
2008/11/11(火) 21:12:460658デフォルトの名無しさん
2008/11/11(火) 23:33:44kansoku[10]とやったら・・・・でもこれは普通に長いでしょうか?
0659デフォルトの名無しさん
2008/11/12(水) 00:38:06文法的におかしいところもあるし、n,mの入力式も無いから動きようも無い。
またアルゴリズムも間違っている。
>AB=(i,j)=l
おかしいw こうだべ AB(i,j)=l
>write(*,*)'INPUT n,m 2.le.n.m.le.8'
READ(*,*)n,m ←ここらへんにこれがが必要だろう
>if((n.lt.2.).or.(m.le.2).or.(n.gt.8).or.(m.gt.8)) then
これは言ってることと、判断条件が違ってるw
ちょっとイミフだがこうかな? if( (n .lt. 2.) .or. (m .lt. 2) .or. (n .gt. 8) .or. (m .gt. 8)) then
あと、このプログラムは正方行列で無いと配列からはみだす。
長方形の転置行列は、別の長方形になるぞ伊。
それと関連するが、自分自身の転置を取るなら、上三角か下三角で十分。
今のままでは転置したものを、もう一回転置して元の戻ってしまうw
0660648とか
2008/11/12(水) 01:15:52前半部分はよくわからんけど,ありがとう。
何事も盲信せず,マイペースでがんばろ。
エンジニアにとってプログラムはただのツールなのだから。
0661655
2008/11/12(水) 18:47:32これからもっと勉強していきます。
応えてくださった方、ありがとうございました。
0662デフォルトの名無しさん
2008/11/12(水) 19:39:01できる
長い
0663デフォルトの名無しさん
2008/11/12(水) 22:34:33FugaToHoge(I,J,K)みたいなのよく使うけど、駄目なのかこれ
0664デフォルトの名無しさん
2008/11/12(水) 22:38:2277だか90だかで改定されて制限なくなったけど
0665デフォルトの名無しさん
2008/11/12(水) 23:49:280666デフォルトの名無しさん
2008/11/13(木) 00:28:57IBMのFORTRANは厳格に6文字きっかりだったからなぁ。
昔はANSI規格よりIBMの方が格が高かったw
0667デフォルトの名無しさん
2008/11/13(木) 00:49:51IEEE_SUPPORT_UNDERFLOW_CONTROL
Fortran 2003は長いなぁ
0668デフォルトの名無しさん
2008/11/13(木) 00:51:13IBMシネ
0669デフォルトの名無しさん
2008/11/13(木) 01:16:05さっそくFAQに英語表示にする方法が出ててワロタw
0670デフォルトの名無しさん
2008/11/13(木) 22:51:15?????!
???????????????????syntax error??????????w
0671デフォルトの名無しさん
2008/11/14(金) 00:01:180672デフォルトの名無しさん
2008/11/14(金) 02:18:27if (1.ne.j) then
ya(1,2*j-1)=0
ya(1,2*j)=0
else
ya(1,2*i-1)=2*e(i+1)
ya(1,2*i)=2*f(i+1)
end if
end do
最初と次だけ値を入れたいんですがエラーが起きる可能性がありますでしょうか?
http://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran95/fortran77.htm
の通りにダウンロードしましたが e(1)=2.000でやったんですが
1.955 0.000 -0.646 0.000 0.000 0.000
という値がでます。これの前で他の計算をして1行目だけこれで適用させてますが・・・・
0673デフォルトの名無しさん
2008/11/14(金) 02:30:22です
0674デフォルトの名無しさん
2008/11/14(金) 03:07:31何を意図しているのか、質問文もFortran文も両方分からんw
とりあえず、この中のJはIの間違いだろう。
do i=1,5
if (1.ne.j) then
ya(1,2*j-1)=0
ya(1,2*j)=0
else
多分、配列のはみだしで結果はグチョグチョなんだろう。
配列の宣言なども見せてくれないと分からん。
FTN77に、配列はみ出しチェックオプションがあると思うので、それを使って味噌。
0675デフォルトの名無しさん
2008/11/14(金) 03:26:574・000 0.000 -0.646 0.000 0.000 0.000
に直りました。ただ0.646がなぜ出るのかわかりませんが・・・・
配列はみ出しチェックオプションとは何処に行けば使えるようになるんでしょうか?
ちなみに配列の宣言は
common/block5/ya(10,10)
です
0676デフォルトの名無しさん
2008/11/14(金) 12:50:43ソースコレで全部じゃないだろ?
Write文も見当たんないし。
後だしすんなカス
0677デフォルトの名無しさん
2008/11/14(金) 20:19:19まあ、カルシウムでも摂れ
0678デフォルトの名無しさん
2008/11/14(金) 20:54:18しかも結果が出るときデンッ!とエラー音が出るんですがこれはエラーですか?
0679デフォルトの名無しさん
2008/11/14(金) 21:03:29エラーではない。プログラムはちゃんと君の書いた通りに動いている。
0680デフォルトの名無しさん
2008/11/14(金) 21:06:530681デフォルトの名無しさん
2008/11/15(土) 00:18:38え?
0682デフォルトの名無しさん
2008/11/15(土) 00:57:42-0.646が代入されているのは、その部分ではない。
少なくとも見せてくれた部分では。
もっと情報が無いと答えようが無い。
0683デフォルトの名無しさん
2008/11/15(土) 00:59:330684デフォルトの名無しさん
2008/11/15(土) 10:48:54ttp://www.hpfpc.org/index.html
0685デフォルトの名無しさん
2008/11/15(土) 12:20:58まぁそんなん無理だとは思うけど
0686デフォルトの名無しさん
2008/11/15(土) 17:11:170687デフォルトの名無しさん
2008/11/15(土) 20:01:32というプログラム教えてください お願いします
0688デフォルトの名無しさん
2008/11/15(土) 20:44:19program main
integer :: a(5), b(5), n, i
logical :: m(5)
m = .true.
read *, a
do i=1, 5
n = sum(maxloc(a, m))
b(i) = a(n)
m(n) = .false.
end do
print *, b
end program main
0689デフォルトの名無しさん
2008/11/15(土) 22:34:39MODULE m_sort
IMPLICIT NONE
CONTAINS
RECURSIVE FUNCTION iqsort( idat ) RESULT( isorted )
IMPLICIT NONE
INTEGER, INTENT(IN) :: idat(:)
INTEGER :: isorted( SIZE(idat) )
IF ( SIZE(idat) > 1 ) THEN
isorted = (/ iqsort( PACK( idat(2:), idat(2:) > idat(1) ) ), &
idat(1), &
iqsort( PACK( idat(2:), idat(2:) <= idat(1) ) ) /)
ELSE
isorted = idat
END IF
RETURN
END FUNCTION iqsort
END MODULE m_sort
!===============================================================
PROGRAM sort
USE m_sort
IMPLICIT NONE
INTEGER :: m(5)
READ *, m
PRINT *, iqsort(m)
STOP
END PROGRAM sort
0690デフォルトの名無しさん
2008/11/15(土) 23:53:18>>687じゃないですが
maxlocなんて初めて知りました。勉強になりました。
0691デフォルトの名無しさん
2008/11/16(日) 01:42:30この2つはどっちが速いんだ?
0692デフォルトの名無しさん
2008/11/16(日) 03:19:59アルゴリズムとしては一般的に >>689 の方が速い。
だがデータ数が5つやそこらじゃ、なにでやっても有意義な差は出ないだろ。
というわけで、ソートの練習問題の定番も
Program awa
Implicit None
Integer, Parameter :: NMAX = 5
Integer :: n(1:NMAX), i, j
Read *, n
Do i = 1, NMAX - 1
Do j = 1, NMAX - i
If (n(j) < n(j + 1)) Call nswap(n(j), n(j + 1))
End Do
End Do
Print *, n
Contains
Subroutine nswap(na, nb)
Integer, Intent(InOut) :: na, nb
Integer :: nt
nt = na
na = nb
nb = nt
End Subroutine nswap
End Program awa
0693デフォルトの名無しさん
2008/11/16(日) 03:50:49サンクス
俺には>>692しかワカランかったorz
0694デフォルトの名無しさん
2008/11/16(日) 20:14:21i=1、2、・・・、50に対し(i,a500(i))(i,a2000(i))を次の演算に
従い計算せよという問題です。わかりにくいですが500と2000、
さらに次の式のaのあとのnやn+1,n-1などは添字です。
an+1(i)=0.5{an(i+1)+an(i-1)-2.0d0an(i)}+an(i) (i=2,3,・・・49),
(n=1,2,・・・,500,・・・,2000)
ただしa1(i)=0.0(i=1,2,・・・,49), a1(50)=1.0, an(1)=0.0, an(50)=1.0
(n=1,2,3,・・・,500,・・・,2000) である。
というものです。自分は添字のnなどについてはプログラム上では無視し、
一次元配列aとbを宣言して、「DOループも用いてi=1〜49を回し
てまずa2(これがb)を求め、そのa2(すなわち)を元の漸化式にの右辺に
結果を入れ、それを500回と2000回別々に回す」という操作を考え
たのですがうまくいきません。
具体的には
do j = 1, 500
a(1) = 0
a(50)=1
do i = 2, 49
b(i) = 式の右辺
enddo
a=b
enddo
としました。上のどこに問題があるかなど教えていただけたら嬉しいです。
基本的なんでしょうがよくわかりません・・・・。
0695デフォルトの名無しさん
2008/11/16(日) 20:26:49先頭の空白文字を削除する内部関数はあるんでしょうか?
0696デフォルトの名無しさん
2008/11/16(日) 20:50:02ADJUSTL(x)でいけたと思う。
0697デフォルトの名無しさん
2008/11/16(日) 20:51:26スマンが何をしたいのかさっぱりわからん。
ソースを書いてなにがどううまくいかないのか教えてくれ。
0698デフォルトの名無しさん
2008/11/16(日) 21:11:44説明不足ですいません・・・ソースというのはプログラムのことですよね。
こんな感じで書いてみました。
program
implicit none
integer :: i,j
real(8) :: a(50),b(50)
do i=1,49
a(i)=0.0d0
b(i)=0.0d0
enddo
do j = 1, 500
a(1) = 0.0d0
a(50)=1.0d0
do i = 2, 49
b(i) = 式の右辺
enddo
a(j)=b(j)
enddo
do i=1,50
write(*,*),a(i)
enddo
end program
これでいけるかと思ったのですが、出力するとa(48)が0.5になりあとは
全てゼロになるということになってしまいます。これは一次元熱伝導方程式
についての温度分布の時間変化を表したものらしく、だとするとこのような
値になるはずがないのに、という話です。
0699デフォルトの名無しさん
2008/11/16(日) 21:18:39データの入力は0または負の数の入力で終了とせよ。
!の前を埋める問題です。サブルーチン等は使わずにお願いします
program kadai5a
implicit none
integer::m,mark(100),n=0,max,maxi,i,j
do while(n<=99)
print *,"Input a positive integer(zero or negative to stop)"
!この2行で入力した数値を配列mark(n)として記憶させ、
!nの値も決める。入力した数値を一旦mとして読み込めばよい。
end do
do i=1,n-1
max=mark(i) !番目の値mark(i)をi番目以降での仮最大値maxと仮定する。
maxi=i !仮最大値の位置maxiをiとする。
do j=i+1,n
if(mark(j)>max) then
max=mark(j) !この2行でj番目の値mark(j)が仮最大値maxより大きければ
maxi=j !先に決めたmaxとmaxiの値をj番目の値に入れ替える。
end if
end do
if(maxi/=i) then
!この2行でmark(maxi)とmark(i)を入れ替える。
!つまりi番以降での最大値を一番前(i番目)に持ってくる。
end if
end do
print'("Sorted numbers:",10I5)',(mark(i),i=1,n)
end program kadai5a
0700デフォルトの名無しさん
2008/11/16(日) 21:52:05a(j) = b(j)
の部分がおかしいのでは?
直前の「b(i) = …」で計算した値が1つ(b(j))しか a に代入されていない。
a = b
として、配列 b の中身をすべて a に代入すれば良いのではないかな
0701デフォルトの名無しさん
2008/11/16(日) 22:41:48>>700に加えて、b(1)=0.0 と b(50)=1.0 の境界条件を最初に与えておかないといかん。
一次元ポア損方程式を解いているなら、最終的には直線が現れると思う。
0703デフォルトの名無しさん
2008/11/16(日) 23:22:46>>701
アドバイスありがとうございます!
言われてみればその通りでした・・・。早速試してみようと思います。
本当にありがとうございました。
0704デフォルトの名無しさん
2008/11/17(月) 11:37:47おお、Fortranは長く使っているけど両方とも知らなかった。
同じ事をしたいときには、文字列をindex関数使いながら
do-loopで一文字つづ走査して空白でない部分の最初と最後の番地を求めてから
その部分をコピー、ってやってた。一行で出来るのか、なんてこったい。
0706デフォルトの名無しさん
2008/11/17(月) 12:24:55FORTRAN77時代はINDEX関数でやるしかなかったが、Fortran90でかなりたくさんの
文字列操作関数が導入されたので、探すと結構使えるものが出てくる(^^v
TRIM()やLEN_TRIM()が一番便利な気がする。
0707デフォルトの名無しさん
2008/11/18(火) 21:40:18あと注釈つけたいんですけど*で囲むだけでいいんですよね
お願いします
0708デフォルトの名無しさん
2008/11/18(火) 22:14:06そうだよ
そうだよ
0709デフォルトの名無しさん
2008/11/18(火) 22:45:020710707
2008/11/18(火) 23:13:52確認したら実数型と整数型それぞれ分かれました
なぜ違いが出るんでしょうか?
宣言はコモンの中でしました。メインで
n(1)=1.3000
n(2)=1.1000
とやってサブルーチン内で
do i=1,2
write(*,*) n(i)
end do
と入力すると
1
1
という整数型の結果が出ます。しかし他の適当な配列を試すと
-4.37556
0.000000E+00
のように実数型で出ます。これの違いはどこにあるんでしょうか?
0711デフォルトの名無しさん
2008/11/18(火) 23:40:23今一何を言っているのか和歌欄のだが、COMMONはメモリー領域の共有なので
変数の型とかそういうものは気にしていない。
グローバル変数とかと混同してはいけない。
0712デフォルトの名無しさん
2008/11/18(火) 23:48:49じゃあなぜ
1
1
という値がでるのでしょうか?やっと見つけて驚いています
0713デフォルトの名無しさん
2008/11/19(水) 00:02:49整数型に代入するとその時点で切り捨てられるからだと思うが、
宣言とかを見せてもらえないと断言できない。
0714デフォルトの名無しさん
2008/11/19(水) 13:14:24暗黙の型じゃねぇの?
inplicit none宣言しない場合、i,j,k,l,m,nで始まる変数は整数型
0715デフォルトの名無しさん
2008/11/19(水) 13:56:12○implicit none
揚げ足とりじゃないけど初心者のため・・・
0716712
2008/11/19(水) 16:39:270717デフォルトの名無しさん
2008/11/19(水) 21:27:11-only_undef options)
というのはどういう状況のときにどういう意味ででるのでしょうか?
0718デフォルトの名無しさん
2008/11/19(水) 21:30:470719デフォルトの名無しさん
2008/11/19(水) 23:27:17>>718
0720デフォルトの名無しさん
2008/11/20(木) 03:23:240721デフォルトの名無しさん
2008/11/25(火) 04:07:24チェックになるには同意だけど出来ればあまり見たくない。
0722デフォルトの名無しさん
2008/11/25(火) 17:17:09きったない式で申し訳ないのですが、以下の行を入れたところ、、
G(E,r,u,z)=((-938.3d0*E)/(197.33d0*197.33d0)-(938.3d0*50.0d0*DEXP(-r*r/8.0d0))/197.33d0*197.33d0)*u
こういったエラー文がでました。
Error: bound2.f, line 15: Syntax error, found END-OF-STATEMENT when expecting one of: ( <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> <INTEGER_CONSTANT> ...
G(E,r,u,z)=((-938.3d0*E)/(197.33d0*197.33d0)-(938.3d0*50.0d0*DEXP(-r*r/8.0d0))/197.33d0*197.33d0)*u
なぜなのでしょうか??
ちなみに 197.33d0) までの一項目を Eで置き換えるとコンパイルできたりして、頭が混乱してます。
0723デフォルトの名無しさん
2008/11/25(火) 18:36:2372文字の制限はご存じ?
0724デフォルトの名無しさん
2008/11/25(火) 22:57:160725デフォルトの名無しさん
2008/11/25(火) 23:15:53陽子質量とか hc などの定数はPARAMETER文でパラメータ宣言しておけばよい。
マジックナンバーの数値を直接書くとろくなことにならん。1ッ箇所だけ打ち間違えるとか。
0726デフォルトの名無しさん
2008/11/26(水) 10:17:54>>723 し、知らなかったです、、、助かりました。
>>724,>>725 定数は置き換えるようにします。ありがとうございました。
0727デフォルトの名無しさん
2008/11/26(水) 11:19:42うい奴め。またおいで〜。
0728デフォルトの名無しさん
2008/11/26(水) 11:46:40オッスオッス
0729デフォルトの名無しさん
2008/11/26(水) 23:44:35subroutine koutaidainyu
common/block5/ya(10,10),soku(10),bg(10),dx(10)
dx(10)=bg(10)
do i=9,1,-1
dx(i)=bg(j)
do j=i+1,10
dx(i)=dx(i)-ya(i,j)*dx(j)
end do
end do
end
コンパイルはできるんですが実行するとエラーが出るようになりました
これはどのような理由で起こるんでしょうか?
サブルーチンがちゃんと終わってない、ちゃんと呼び出せてない(call ○○が間違ってる)だと起こるというのはわかります
参考までにプログラムに入れるとエラーになる部分をおかさせてもらいます
00402080 KOUTAIDAINYU [+0033]
00401000 main [+0353]
0730デフォルトの名無しさん
2008/11/27(木) 00:06:50なんでその「エラー」とやらの中身を具体的に書かないの
0731デフォルトの名無しさん
2008/11/27(木) 00:21:5400402080 KOUTAIDAINYU [+0033]
00401000 main [+0353]
文章自体は問題ないけどなにかしら問題があるときでるようです
0732729
2008/11/27(木) 00:25:400733デフォルトの名無しさん
2008/11/27(木) 00:47:58コンパイル時のパラメータに /FULLCHECK を追加して
エラー時に出るウィンドウのメッセージを横着せずに全部晒すんだ。
話はそれからだ。
0734デフォルトの名無しさん
2008/11/27(木) 01:55:35call koutaidainyu
subroutine koutaidainyu
common/block5/ya(10,10),soku(10),bg(10),dx(10)
dx(10)=bg(10)
do i=9,1,-1
dx(i)=bg(j) <−この行で j が未定義だからかな。多分 i の間違いだろ。
do j=i+1,10
dx(i)=dx(i)-ya(i,j)*dx(j)
end do
end do
end
0735734
2008/11/27(木) 02:05:36このプログラムは非常にセンスが悪い。
ラッパズボン、にこちゃんバッジ、ロンドンブーツにかっぽれ帽だが、今風茶髪鼻ピアスで匹夫ホップ的というか・・
コモンではなく仮引数で渡したほうがいいし、配列も10に限定しないで整合配列にするとよろしい。
まぁ、全体は結構長そうだから、一部だけいじるよりは、このまま荒地を行けw
0736デフォルトの名無しさん
2008/11/27(木) 06:51:57センス云々まで行ってしまうのはちょっとカッコつけ過ぎだな。
common使うと一般には速くなるけどね。仮引数渡しは変数のサイズが決まっていてallocateしないなら
あまりメリット無い。無いわけではないけど最適化の妨げになってしまう。
全プログラムがひとつのファイルに収まっていて強引にinline出来るor
MPIやらつかって不定のサイズで分割並列化するとかでなければ
大きい配列はcommonで渡した方がパフォーマンスはいいけどね。
スイッチングやカウンタみたいな小さいサイズの変数までcommonで渡すと
デバッグしにくくなる副作用が大きすぎるから引数渡しすべきだけど、
common使うな教の狂信者になる必要はあまりないのだ。
0737デフォルトの名無しさん
2008/11/27(木) 11:25:050738デフォルトの名無しさん
2008/11/27(木) 11:27:29>>729はサブルーチン名のつけ方なんかからして初心者っぽいので、
あんまり古風な書き方を覚えないほうがいいような気もするぞ。
77での分割コンパイル時の最適化抑制やエラーチェックが減る点は確かに問題なので
77の時はできる限り1個のファイルにまとめるほうがいいかもね。
0739デフォルトの名無しさん
2008/11/27(木) 13:52:42なんかのライブラリ使っていると重複することがあったりするので
重複の心配のない日本語のローマ字化したのが便利な事が多いけど、
そのままでは長くなりすぎるから母音を抜いたりしてる。
>>729 の例だと koutaidainyu を kutidin みないな感じ。
・・・が、あとで自分で見てなんじゃこりゃと思うことも多々ありw
0740デフォルトの名無しさん
2008/11/27(木) 13:57:46共有メモリなシステムでの並列計算や並列じゃない計算の時は
commonで大きな配列を受け渡しした方が利得が大きいのだけど
分散メモリなシステムではコンパイルすら通らないこともあったりする。
諸刃の剣。
0741デフォルトの名無しさん
2008/11/27(木) 14:17:25俺はサブルーチンや大域変数の名前には、自分の名字を入れている。
myouji_Hoge_Moge ってな感じ
0742729
2008/11/27(木) 17:20:54騒がせてすみません
0743デフォルトの名無しさん
2008/11/27(木) 19:01:31せめて>>1の注意事項くらいはよく読んでから書き込めと
0744デフォルトの名無しさん
2008/11/28(金) 00:10:10やさしいFORTRAN入門
演習問題で効果的に学ぶ
http://www.bk1.jp/product/03065267
Fortranでは珍しい、教科書的でない今風の簡単そうな入門書。
内容は77中心で、イマイチwwww ごめんw Fortranでこういうタイプの本を出した意欲は買うwww
実践Fortran95プログラミング 第3版
フリーソフトg95,gnuplotによるプログラミングから作図まで
http://www.bk1.jp/product/03055526
こっちもGNUに頼るところが今風?
時間が無くてどっちもパラパラとしか見なかったので、誰か舐めるように立ち読みして
レポートしてくれw
0745デフォルトの名無しさん
2008/11/28(金) 08:14:35私の王子様に見えて一瞬だけひいたw ごめんうそ。
>>744
本屋で見かけたら見てみよう。
0746デフォルトの名無しさん
2008/11/28(金) 23:53:550747デフォルトの名無しさん
2008/11/29(土) 00:57:26デバッガ or writeで変数チェック
0748デフォルトの名無しさん
2008/11/29(土) 12:49:06747のが王道かな。追加できそうなことはコンパイル時オプションで
最適化しない。unrollさせない。
未初期変数は未定義のまま放置させる。
未定義数が右辺に来たら計算打ち切るようにする。
関数の引数が異常値ならそこで速攻終了させる acos(1.5) みたいなの
添字の範囲チェック
くらいかな。でも実際の経験上はミスタイプが一番の原因だったりするので
747のwriteで変数チェックが一番簡単で効果的だと思うよ。
0749デフォルトの名無しさん
2008/11/29(土) 15:10:580750デフォルトの名無しさん
2008/11/29(土) 16:51:33プログラム相談員とか、あるいは身近なよく分かっている人に聞くのが早道だが、
しばしばむかつく態度を取られるので、心の弱い人は注意w
上級テクニックとして、さりげなく飴やガムを与えて懐柔する手がある。
まず自分がうまそうに食べていて、どうぞと箱から薦めるのがコツだwww
自力で行くなら>>747-748に準拠。
0751デフォルトの名無しさん
2008/11/29(土) 17:50:53コーヒーでも煙草でも共通する息抜き方法があるとその時間を利用する手もある。
なければ、ガムで餌付けwして、そういう時間を作るといい。
別にお金を持ち出す必要はないんだけどね。そういう時間があると
好感度(?)が上がるし、すぐには役に立たないおばあちゃんの知恵袋的な
話も聞けたりするのでよい。
まあそうゆうつき合いが嫌いな人は質問する方される方両方でいるけど。
0752デフォルトの名無しさん
2008/12/02(火) 22:50:180753デフォルトの名無しさん
2008/12/02(火) 22:52:020754デフォルトの名無しさん
2008/12/02(火) 23:02:350755デフォルトの名無しさん
2008/12/02(火) 23:04:520756デフォルトの名無しさん
2008/12/03(水) 00:17:420757デフォルトの名無しさん
2008/12/04(木) 01:28:33[PDF]
暫定的な GPU サポート PGI Release 8.0 - 12月3日
ttp://release.nikkei.co.jp/attach_file/0206095_01.pdf
0758デフォルトの名無しさん
2008/12/04(木) 15:18:12後数年は使う気しないなw
0759デフォルトの名無しさん
2008/12/05(金) 01:12:04OpenMPのようにFortranにコメントとしてコンパイラ指示行を入れてやるようなので、
試してみる分には面白そうにも見える。
0760デフォルトの名無しさん
2008/12/05(金) 12:06:36http://pc.watch.impress.co.jp/docs/2008/1203/nvidia.htm?ref=rss
0761D.B
2008/12/05(金) 16:16:47COMMON /INTCON/ KINT,BETA,GAMA,DELTA,THET,C1,C2,C3,C4,C5,C6,C7,C8,
Warning: Because of COMMON, the alignment of object is inconsistent with its type [GAMA]
COMMON /INTCON/ KINT,BETA,GAMA,DELTA,THET,C1,C2,C3,C4,C5,C6,C7,C8,
といった警告文がでます。今まで別のファイルであったものを一つのファイルにまとめたのですがそれと関係があるのでしょうか?
どなたか回答をお願いいたします。
0762デフォルトの名無しさん
2008/12/05(金) 16:21:15オレは回答しない。
0763デフォルトの名無しさん
2008/12/05(金) 17:47:400764デフォルトの名無しさん
2008/12/05(金) 22:02:10オプションで選べるようにしてくれればなぁ
0765デフォルトの名無しさん
2008/12/06(土) 01:07:03ググレカスwwwww TOPに出てくるぞw
「the alignment of object is inconsistent with its type」という警告メッセージはどういう意味ですか?
19-Nov-1997
このメッセージは、COMMON 文または EQUIVALENCE 文により、変数をその大きさの整数倍の
アドレスとは異なるところに強制的に配置したことを知らせます。たとえば、COMMON ブロックで
INTEGER に続いて REAL*8 を宣言すると、REAL*8 は 4 の倍数のアドレスに配置されますが、
8 の倍数アドレスに配置した方が性能が向上します。より詳細な内容については、オンライン・
ドキュメントの「Programmer's Guide」の「Data Alignment Considerations」を参照してください。
これはα機時代からDECFortranでのFAQだったもの。
コンピュータのメモリも、キリのいい区切りがある。それをまたぐと、1個の数値が
数字の途中で“改行”するイメージになる。普通はコンピュータにとって区切りがよくなるように
適切にメモリー上に変数を取るわけだが、COMMONの場合はメモリー領域を共有するので、
コンパイラ側で勝手に“改行”して区切りをよくしていいか判断できない。
それで区切りが悪いよ(計算スピード落ちますよ)と警告を発している。
なおオプションで、COMMONの中でも勝手にPADDINGして区切りを良くする事もできたと思う。
言っている意味が分からなければ、まぁそのまま気にせず池。
メモリーアクセスが非効率になって少し遅くなるだけのことだw
0766デフォルトの名無しさん
2008/12/06(土) 01:26:31CPUとGPUの境界がなくなる時代が始まる2009年のプロセッサ
>こうしたGPUベンダーの動きに呼応して、言語&ツールのコミュニティも急ピッチで対応を進めている。
>今年(2008年)中盤からは、各プロセッサを横断的にカバーする言語環境の開発が熾烈なレースに入った。
ttp://pc.watch.impress.co.jp/docs/2008/1202/kaigai478.htm
AMD+ATIもようやく言語ツール出してきた?
0767デフォルトの名無しさん
2008/12/06(土) 15:55:04結局intelが勝つに1Pflops
0768デフォルトの名無しさん
2008/12/06(土) 17:32:19*** Invalid statement order (statement not processed)
0309) common/block/a(10,10),b(10),c(10),dmax
*** Invalid statement order (statement not processed)
というエラーが出ました。
Invalid statement orderはいつも宣言を途中でした場合ついていたのですがサブルーチンとコモン文に出るのは初めてなんでとまどっています
訂正方法をおしえてください。お願いします
0769デフォルトの名無しさん
2008/12/06(土) 17:59:52宣言文、呼び出し、common周りのソースを晒したら?
0770デフォルトの名無しさん
2008/12/06(土) 19:12:58って出てくるのですが、どういうことですか?
0771デフォルトの名無しさん
2008/12/06(土) 19:50:48まだ後退代入が片付かんのか!こんなとこで聞くより身近な奴に聞けwww
宣言文と実行文では宣言文が先にこなければならないし、宣言文の中でも前後の
順序が定まったものがある。その順番が守られていないということだ。
ただこの場合は、多分前のプログラムのend文を消してしまったので、
こっちでエラーが出ていると超能力で推察してやるw
>>770
配列の次元数が合致していないという事だ。
A(:,:)=B(:,:,:)
こんなイメージで。
0773デフォルトの名無しさん
2008/12/08(月) 05:30:57解決策はありますでしょうか。
DATAN2が使えないというようなことだとおもうのですが。
(linux版のifortではコンパイルできています)
amp32.f:79.72:
ZATAN(ZD,ZE) = DATAN2(ZD,ZE)
1
Error: Unexpected STATEMENT FUNCTION statement at (1)
なお,gfortran -vは次のとおりです。
Using built-in specs.
Target: i586-pc-mingw32
Configured with: ../trunk/configure --prefix=/mingw --enable-languages=c,fortran
--with-gmp=/home/FX/local --with-ld=/mingw/bin/ld --with-as=/mingw/bin/as --dis
able-werror --enable-bootstrap --enable-threads --disable-nls --build=i586-pc-mi
ngw32 --enable-libgomp --disable-shared
Thread model: win32
gcc version 4.4.0 20080603 (experimental) [trunk revision 136333] (GCC)
0774デフォルトの名無しさん
2008/12/08(月) 07:13:07zatanを複素数のatanだったきがするから、予約語をそれ以外で使ったことで怒られたのか?
gfortranが手元で使えないから分からんけど、zatanの名前を変えてみたら?
0775デフォルトの名無しさん
2008/12/08(月) 07:16:35DECが無く、IBM自身があまり関心なさそうだからね。Intelに気張ってもらった方がいいきがする。
0776デフォルトの名無しさん
2008/12/08(月) 14:05:16zatan(x) で引数一つの関数だから773のは多分 774のとおり
予約語を代入文の右側で呼んでるから怒られたっぽいな。
上の方で書いてあるけど変数名を決めるのは難しい。
0777773
2008/12/08(月) 18:01:20ありがとうございます。
名前を決めるのはなかなか難しいですね。
ほかのサブルーチンの場合,問題なくコンパイルできていて,
できる場合とできない場合があるようです。
エラー込みでコンパイルということなんでしょうかね。
なお,g77ではスルーできるようなので,
とりあえずこれでしのいで,
あとで考えようと思います。
0778デフォルトの名無しさん
2008/12/08(月) 20:24:47PROGRAM PROGRAM
REAL REAL(8), THEN, END
IF(N) = N * 2
WRITE(I, A) = I + A
SIN(X) = COS(X)
THEN = 3.
REAL(4) = 1.2
END = 0.
WRITE(*,*) IF (1 + 2), THEN
WRITE(6,*) WRITE(6, 2.3), REAL(4), SIN(END)
STOP
END
0779773
2008/12/08(月) 21:54:37なるほど,そういうことなんですね。
これがヒントになり,解決しました。
どうもありがとうございました。
0780デフォルトの名無しさん
2008/12/08(月) 23:12:11文法書をよく読むと書いてある。
0781デフォルトの名無しさん
2008/12/08(月) 23:27:34compaqのvisual fortran 6.0Aを使用しておりまして
倍精度整数の計算がしたいので6.6以上へアップデートしたいのですが
HPにあるアップデータはalphaプロセッサ用のものしか
見つけられませんでした(downloadしても.exeが実行できません)。
現在でもアップデータを得ることは可能なのでしょうか。
それとも,自分の探し方が悪いだけでしょうか。
0782デフォルトの名無しさん
2008/12/08(月) 23:51:306.0からは6.1まではupgradeできる。
6.1から6.5までは有料upgradeだったので、今やその道は閉ざされている。
6.5からは6.6Cまでいける。ここで打ち止め。
0783デフォルトの名無しさん
2008/12/08(月) 23:54:48そうでしたか。今日一日ずっと探してたのでガッカリですが
明日も無駄に探さなくて済んだので良かったです。
ありがとうございます。
0784デフォルトの名無しさん
2008/12/09(火) 00:45:540785デフォルトの名無しさん
2008/12/09(火) 01:09:56過去互換が崩れるのでまずい気がする
INTRINSIC MODULEとして数学常数を与えることも可能だが、
それはそれで変数名のバッティングが起きそうで、自分で常数MODULE作れという事になる。
まぁFortran2008では
REAL, PARMETER :: pi = 4.0d0 * ATAN(1.0d0)
というコンパイル時の関数評価も可能になったし、まぁいらねんでね?
0786785
2008/12/09(火) 01:10:540787デフォルトの名無しさん
2008/12/09(火) 03:13:57文法書にはpreserved wordがあるので予約語は「ある」。英語で読もうね。
もっとも、あとでユーザーのoverrideできる仕様になっとる点で他の言語とは違うが。
>>778 がちょっぴりまぬけな得意気まんまんに例を出したが、
そんなことわざわざすまでもなく773のがそういうことになっとるのだな。
んで、IntelはそのOverrideを出来るようにしており、gfortranでは禁止しているだけのお話。
ややこしいのはそのOverrideをメイン階層でしてしまった場合に
下層の副プログラムにも反映されてしまう場合がある。されない場合もある。
PI は 785 のやりかたが推奨されてるね。
0788デフォルトの名無しさん
2008/12/09(火) 05:04:50ん?どの文法書の話だ?
Fortran に preserved word は無いぞ。
この文脈で overide なんて用語を待ちだしてくるのは、生粋の Fortran 使いでは無いわなw
gfortran なんて使ったこと無いが、それは Fortran と呼べる代物では無い。
ANSI規格書はFORTRAN77しか持ってないが、2.2 Syntactic Itemsのところで
"There is no sequence of characters that is reserved in all contexts in FORTRAN."
とある。
また、Fortran95/2003Explained の 2.7 Names のところによれば
"There are no other restrictions on the names; in particular there are no
reserved words in Fortran."
とある。
0789デフォルトの名無しさん
2008/12/09(火) 11:23:48>文法書にはpreserved wordがあるので予約語は「ある」。英語で読もうね。
>>>778 がちょっぴりまぬけな得意気まんまんに例を出したが、
挑発的なわりに・・・・なんなの?
アホ?
0790デフォルトの名無しさん
2008/12/09(火) 14:52:190791デフォルトの名無しさん
2008/12/10(水) 07:02:02のをみて文関数使っちゃいやん、と書くつもりでいたらカオスな事になってるw
0792デフォルトの名無しさん
2008/12/11(木) 17:43:08subroutine gauss(n,a,s)
dimension a(n,1), s(1)
dimension b(100,101)
**
do i = 1, n
do j = 1,n
b(i,j) = a(i,j)
enddo
enddo
do i = 1, n
b(i,n+1) = s(i)
enddo
**
do 10 k = 1, n
m = k;
do i=k+1, n
if (abs(b(i,k)).gt.abs(b(m,k))) m = i
enddo
do j=k, n+1
t = b(k,j)
b(k,j) = b(m,j)
b(m,j) = t
enddo
0793デフォルトの名無しさん
2008/12/11(木) 17:43:59t = b(k,k)
do j=k, n+1
b(k,j) = b(k,j)/t
enddo
do i=k+1, n
t = b(i,k)
do j=k, n+1
b(i,j) = b(i,j) - b(k,j)*t
end do
enddo
10 continue
do 20 k=n, 2, -1
do i=1, k-1
b(i,n+1) = b(i,n+1) - b(k,n+1)*b(i,k)
b(i,k) = 0
enddo
20 continue
**
do i = 1, n
s(i) = b(i,n+1)
enddo
**
return
stop
end
0794デフォルトの名無しさん
2008/12/12(金) 00:29:37存在しないサブルーチンを呼んでもエラー出してくれずにコンパイルしてしまうんですが
0795794
2008/12/12(金) 00:39:52いちおう、Intel v10.1です
0796デフォルトの名無しさん
2008/12/12(金) 00:57:560797デフォルトの名無しさん
2008/12/12(金) 01:26:00「指定した出力先のフォルダが存在しない場合は新しくフォルダを作成する」
ってできますか?
F90です.
0798デフォルトの名無しさん
2008/12/12(金) 01:56:43フォルダーはFORTRANからはいじれない。処理系にもよるが。
ベンダー拡張のSYSTEM機能を使わざる終えないとおもう。
0799デフォルトの名無しさん
2008/12/12(金) 01:59:06Gaussの消去法で連立一次方程式を解くサブルーチン。
本体はDO 10 LOOPでPIVOT選択と前進消去、DO 20 LOOPで後退代入をやってる。
数値計算の教科書には必ず載っているようなもの。教科書を嫁。
nは行列の次元。a、sの入力はax=dの行列aとベクトルd、sの出力は解のx。
行列サイズは最大100までだが、サイズチェックはしていないw
作業配列がb(100,101)と列が行より1個多いのは、ax=dのdが入るようにするため。
これは筆算でもやる消去法での解き方の典型。
最初のDO LOOPで代入している。
正方行列やベクトルのはずのaやsの宣言が、 dimension a(n,1), s(1) と、
1次元になっているのは、FORTRAN77以前ではサブルーチンの引数の変数の先頭アドレスしか
渡さないので、それで十分だから。FORTRAN66時代にはこういう書き方をよくやった。
(デバッグの時、配列はみ出しエラーで引っかかるので、FORTRAN77以降ではやらなくなった。)
ただ二次元の時は、行数は必要になるので、a(1,1)ではなくa(n,1)にする必要がある。
これの意味は、FORTRANでの2次元配列の取り方が縦書き改行になっていることを知らないと
わからない。もしくは二次元配列がどうメモリー上に一次元的に取られるのかということ。
FORTRANの教科書読めば書いてある。
プログラムの形式は、FORTRAN77っぽいが、FORTRAN66時代のような仮引数の配列宣言を使い
それでいて中途半端にFortran90の機能も使うちぐはぐさを見せている。
作者はFORTRAN66時代の教科書やプログラムの残る80年代に中期にFORTRAN教育を受け
当時だんだんFORTRAN77に拡張で導入されていたDO...END DOのFortran90の機能を聞き
かじったのではないかと推測w
おk?
0800794
2008/12/12(金) 02:27:17失礼、コンパイルというのはリンクも含めての話でした。
どうやらコンパイルの段階で「ここには来ない」と判明した部分についてはチェックをかけないようで、
参照エラーだけでなく変数未宣言のエラーも出ませんでした。
おそらくオプションで強制的に全部チェックするのがあるんだろうなぁ
0801デフォルトの名無しさん
2008/12/12(金) 02:59:08ありがとうございます.
FORTRAN単体からは無理なようですね
システム機能という単語から調べていってフォルダの作成に成功したので
今後のために簡単に残しておきます.
【コンパイラ】Compaq Visual Fortran 6.1
【OS】XP SP3
CHARACTER delimiter
CHARACTER*150 command
CALL getenv('DELIMITER',delimiter)
command='mkdir '//delimiter//'NEWFOLDER'
CALL system(command)
実行したところこのワークがおいてあるフォルダに「NEWFOLDER」という
新しいフォルダが作成されました.
0802デフォルトの名無しさん
2008/12/12(金) 04:35:41ありがとうございます
参考にさせていただきます
0803デフォルトの名無しさん
2008/12/12(金) 07:05:22>>800
たぶんその理解でOK!そのとおり、intel fortranは
「呼ばれることがない事が自明なサブルーチン」が無くても文句を行ってこない。
logical lmydebug
parameter(lmydebug = .false.)
if (lmydebug) call mydebug()
があったばあい、サブルーチン mydebug() がどこにもなくても文句行ってこない、はず。
これ実は結構便利。昔のメタコマンド #if のようなことを(全部ではないけど)
FORTRAN文法に一応則った形で出来る。
上の例だと一行Parameter文いじるだけで、デバッグ用と実行用コードを同じファイルで扱えたり。
0804803
2008/12/12(金) 07:07:20「使われることがない事が自明な行」と置き換えてね。
0805デフォルトの名無しさん
2008/12/13(土) 21:00:07gfortranだと問答無用で文句言ってくるね。intel fortranほどこった解析はしてないから?
他にも、intel fortranだと配列は宣言範囲はもちろん、宣言範囲の外でも「1つ」隣までは
0で初期化してくれるけど、gfortranはしてくれない。
↓簡単な例
integer a(5) , i
do i = 1 , 3
a(i)=i
enddo
do i = -10 , 10
print *, 'a(' , i , ')=' , a(i)
enddo
end
if(a(num)/=0) とか使いたい自分としては、intel fortranマンセーですな。www
0806デフォルトの名無しさん
2008/12/13(土) 21:53:15>if(a(num)/=0)
それ>>803の静的なものと違って動的なので、最適化が進むとトラブルかもしれない。
昔のSXコンパイラだとその手の奴がDO-LOOP内にあると、投機的実行で全部実行して、
後からマスキングで削ったりするので、せっかくチェックしているのに強行実行されて
div by 0 で死んだりした。今はNaNがあるからいいが。
0807デフォルトの名無しさん
2008/12/14(日) 07:06:0216bit刻にそろえるための埋め草(padding)なのか分からないけど
人間が宣言した配列よりすこし(1つ)広めにメモリを取るっぽいよね。
お隣りの変数を壊す機会が激減するからデバッグの時にだいぶ助かる。
Cやってた人が0番地を使う変わりに805の例だとa(5)の5番目を使わないような書き方をしても、
とりあえず動くようにという親切設計なのかもね。
0808デフォルトの名無しさん
2008/12/14(日) 13:58:18問答無用で死んでくれたほうがありがたいと思ってしまうなあ
0809デフォルトの名無しさん
2008/12/14(日) 16:32:28投機的実行の場合、最終的にはまともな数字が入るからNaNやinfが出たからといって
止まってもらっては困る。
もっともNaNとか例外が出たときに停止できるオプションもコンパイラ拡張や
あるいはFortran2003規格側に取り入れられているから、皆の望みはかなうはず。
>>807
最近のコンパイラの変数の取り方はどういう方針なのかね?
昔は変数のMAPとかを出力させると、大体宣言順に並べていたけど、最近MAPを見てないw
Cはよく知らんのだが、言語によっては配列の先頭に配列サイズが埋め込まれていたような。
それはそうと実数変数はゼロクリアではなく、NaN当たりで埋め尽くしておいて欲しい。
0810デフォルトの名無しさん
2008/12/14(日) 16:51:28某旧帝大の計算機センタの富士通のsparcのfortranは
どうもNaNだかInfだかで埋められるみたいで
それが右辺に来ると怒ってくれたw
結構助かる。別に富士通の回し者ではないけど、
富士通Fortranはかなり最適化やらInlineの強制をしても
ソースのどこでエラーが起こったのか教えてくれるのでとても良い。
普通は最適化オプションで実行ファイル作るとソースの情報は持ってないからね。
もっとも今はOpenMPを使うことが多くて、この場合最初に明示的に初期化して
だいたいの分割のやり方を教えてあげる(first touch なんたらかんたら)。
その場合、明らかにおかしい値(質量密度みたいに負になるはずのない変数に
負の数字を入れたり)して初期化してる。そのあとちゃんとした
初期値が代入されずに使われたときにエラーになってくれるので、チェックになる。
0811デフォルトの名無しさん
2008/12/14(日) 22:29:45そういう最適化の話と>>805は別のことじゃないの?
>>805のようなのは仕様として定まってることなんだと思うけど。
0812デフォルトの名無しさん
2008/12/15(月) 00:51:18>>805が>>803とは別の話をしている。
>>803は静的な解析で求まることなので確定している。
>>805は動的な実行時の事を言っており、>>803の言うようなIntel Comiplerの性質とは無関係。
>>806と>>805は動的な実行時の問題なので関係がある。
最適化に関しては実装の問題なので、仕様では決まっていない。
配列のベクトル処理では、IF文での判断はマスクとして
配列演算は全要素に関して行い、マスクの結果で書き込みを行うというのがよくやられる。
DO I = 1, 1000
IF ( IA(I) /= 0 ) X(I) = X(I) / REAL( IA(I) )
END DO
みたいな場合に、
DO I = 1, 1000
FLAG(I) = IA(I) .NEQ. 0
WK(I) = X(I) / REAL( IA(I))
END DO
DO I = 1, 1000
IF ( FLAG(I) ) X(I) = WK(I)
END DO
のような変形が行われる。ベクトル長が長いとこの方が早く終わる。
今の Intel Fortran では、この手の IF 入りのDO LOOPはベクトル化しなかったと思うが、
いずれベクトル長が伸びればこういう処理をするようになるだろう。
0813デフォルトの名無しさん
2008/12/15(月) 05:49:15なんか詳しそうなので質問!
812の例の2番目のコードを手で書いた場合、ベクトル計算機の処理系では
マスキングをコンパイラが自動でする奴とコードで書いた手動(?)のと2回することになっちゃうの?
答えがYesだと、コード書くときはあまり気を利かせてマスキングを明示しないほうが
計算は速くなりそうだから、わざわざ明示しない習慣にした方が良さそうだ。
0814デフォルトの名無しさん
2008/12/15(月) 08:43:40>>812は模式図。二番目のループに分けずにい個目のループに入れてもいい。
ベクトル計算機だと、一回で1024要素とかがマスクの取捨も含めて全処理が終わる。
0815デフォルトの名無しさん
2008/12/15(月) 12:05:58うまく処理する方法がありましたら教えてください。よろしくお願いします。
do k=1,nz
p(k)= b(k) /( a(k)-c(k)*p(k-1) )
q(k)=( c(k)*q(k-1)+d(k) )/( a(k)-c(k)*p(k-1) )
enddo
c
pp(nz)=q(nz)
c
do k=nz,1,-1
pp(k)=p(k)*pp(k+1)+q(k)
enddo
0816デフォルトの名無しさん
2008/12/16(火) 18:39:24Intel Fortran 10.1だけど、真ん中のifを含むdoループもベクトル化されたよ
ifを省いてもb(5)はNaNになってくれた
integer,parameter :: n=20
integer :: a(n), i
real :: b(n)
do i = 1 , n
a(i)=i
enddo
a(5)=0
do i = 1 , n
if(a(i)/=0) b(i) = 1 / real(a(i))
enddo
do i = 1 , n
print '(a,i,a,f)', 'b(' , i , ')=' , b(i)
enddo
end
今時のコンパイラはこの程度のことは皆やってくれるんじゃないの?
0817デフォルトの名無しさん
2008/12/16(火) 19:55:01並列化したほうが速くなるのはわかってんだけど・・・
0818デフォルトの名無しさん
2008/12/17(水) 01:27:50そのくらいはやってくれなくちゃなw
0819デフォルトの名無しさん
2008/12/18(木) 07:39:55その例でaを初期化するループでbもいっしょに同じように
b(i)=float(i)
で初期化しても最後にはb(5)はNaNになるの?
>>817
わしはFortranPowerStaion使ってるよ。8年前のパソコンだけどね。
デバッグが丁寧だから1CPUのコードチェックにはとてもいい。fpsfl32.exe ばんじゃい。
FPSと互換モードっていまのVisualFortranには付いてる?
付いてるんなら新しいPC買うついでに買っちゃうかも。
0820816
2008/12/18(木) 18:51:45>なるの?
なるよ
上でも出てたけど、Intel Fortranは勝手に0で初期化してくれるし、同じことでは
ところで、実数への型変換はrealを使うのが普通で、floatだとCっぽくてFortranらしくない感じがするw
わざわざfloatが用意された理由って何かあるのかな?昔のしがらみ?
0821デフォルトの名無しさん
2008/12/19(金) 00:44:09FLOATはFORTRAN66時代からあったから昔のしがらみなんじゃないかな?
0822デフォルトの名無しさん
2008/12/19(金) 01:46:11>FPSと互換モードっていまのVisualFortranには付いてる?
>付いてるんなら新しいPC買うついでに買っちゃうかも。
一応コンパイラオプションにFPS互換というのがあります。
DEC FORTRAN時代から根性で残ってますw
たしかFPSは(書式付?)I/O部分にメモリーリークがあって、I/Oを続けるとメモリーを
じわじわと食いつぶしていくというバグがあったのでご注意召され。
0823819
2008/12/19(金) 17:32:57ありゃ、でもb(5)=5.0が代入された後は何もされないと思うので
NaNだとおかしいと思ったんだけどな。なんかわし勘違いしているっぽかった。
float使ってるのは倍精度化したいときに一括置換すると型宣言部も
巻き添えを食うことがあるからw 個人的習慣です。
>>821
その手の古いの残ってるよね。
>>822
ありがとう。
FortranPowerStationってMicroSoftが発売元だけど中身はそっくりDEC社だった。
GUI開発環境を自力で作れなかったMSがDECに依頼した名残だったかと。
おかげで、由緒正しき(?)DECのFortranが使えたw
CompaqはいちおうAlphaと一緒にVMSやらDEC Fortranの面倒をみてくれてたけど
HPになって消えてしまったかとちょっと不安だったのです。新し目のVisual
Studioを使ってないから、ホントに分からなかったので助かります。
I/O絡みのエラーは Intel Fortran のバージョン7あたりまででも(少なくとも
Linux版には)あったけど、DECの伝統がそこまで残って他のだろうか?
0824デフォルトの名無しさん
2008/12/19(金) 19:22:090825デフォルトの名無しさん
2008/12/19(金) 20:30:28OSチームはカトラーが引っ張ってったというけど。
0826デフォルトの名無しさん
2008/12/21(日) 00:14:46一般にどういう点に気をつけていけばいいですか?
一番よくやるミスが変数名の書き間違えです。
0827デフォルトの名無しさん
2008/12/21(日) 00:52:34implicit none
0828デフォルトの名無しさん
2008/12/21(日) 07:24:25コンパイラのチームはどっちに行ったんだろうね。
CPUに近い部分が多いからIntelの方かな?SunやIBMって選択はあまりなさそうだよね。
0829デフォルトの名無しさん
2008/12/21(日) 11:44:50暗黙の型宣言を使わない。
>>827 が全て。
0830デフォルトの名無しさん
2008/12/21(日) 16:21:37暗黙の型宣言に忠実に生きるんだ。
慣れると暗黙の型から外れているものを見ると嫌悪感を覚えるようになれる。
そうなればもはや間違うことは無い。
ようするに人間のステージを上げるのが解決だw
0831826
2008/12/21(日) 20:27:44暗黙の型宣言の長所・短所をまとめると以下のような感じでしょうか。
<長所>
�@integerとrealの型宣言が不要
�Aintegerかそうでないかが一目で分かる
<短所>
�@タイプミスするとやばい
�A変数名のつけ方に縛りがある
implicit noneだと変数宣言は全てプログラムの冒頭でする必要があります。
とくに、ちょっとデバッグ用に変数を作りたいときなどは煩わしく感じます。
スコープの概念がないのはFortranの欠点の1つだと思っていますが、
最近のFortranは高機能化の一途を辿っているようなので、いずれ対応されるのでしょうか?
でもやっぱり短所�@のリスクが大きすぎるので、もうやめようかな・・・>暗黙の型宣言
0832デフォルトの名無しさん
2008/12/21(日) 20:30:050833デフォルトの名無しさん
2008/12/21(日) 22:11:25IntelコンパイラはDECのチームが入ってから劇的に良くなったって聞いたよ
CPUベンダーなら機械語レベルを熟知してるはずだが、だからといって
良いコンパイラが作れるわけじゃないってことかな
不思議だ
0834デフォルトの名無しさん
2008/12/21(日) 22:58:06Fortran2008 で BLOCK ... END BLOCK でローカル・スコープ が導入される予定。
まぁ IMPLICIT NONE をつけた上で暗黙の型と同じ先頭文字を守るのが吉かと。
0835デフォルトの名無しさん
2008/12/22(月) 11:44:50道灌
0836デフォルトの名無しさん
2008/12/22(月) 12:42:510837デフォルトの名無しさん
2008/12/22(月) 16:50:11implicit real(A-H,O-Z)とimplicit noneの中間みたいなやつ
それができればベストじゃね?
0838デフォルトの名無しさん
2008/12/22(月) 18:52:270839デフォルトの名無しさん
2008/12/22(月) 18:58:20じゃそれで
0840デフォルトの名無しさん
2008/12/22(月) 18:59:50implicit noneしてる人は毎度繰り返し文で使うi,j宣言するんですか?
0841デフォルトの名無しさん
2008/12/22(月) 21:11:00暗黙宣言は害悪でしかない。
0842デフォルトの名無しさん
2008/12/22(月) 21:42:55>Fortran2008 で BLOCK ... END BLOCK でローカル・スコープ が導入される予定。
まじか!?楽しみだなぁ
0843デフォルトの名無しさん
2008/12/23(火) 02:08:23マジw
The new features of Fortran 2008. John Reid,
ftp://ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdf
8.1 The block construct
The block construct allows entities to be declared and given the scope of the block, for example,
block
integer :: i
real :: a(n)
do i = 1,n
a(i) = i
end do
:
end block
ensures that the do index i and the automatic array a are separate from any other variables
with the same names.
Of course, the block construct must be properly nested with other constructs.
0844デフォルトの名無しさん
2008/12/23(火) 08:40:24えっと、843引用の例に配列b(n)を加えて
real :: b(n)
:
do i = 1, n
b(i) = i
enddo
:
block
integer :: i
real :: a(n)
do i = 1,n
a(i) = i
b(i) = i**2
end do
end block
とやるとスコープ範囲が終わった後も配列bの値はblockで挟まれた部分で定義された
値(この例ではiの自乗)を保持されているんだよね。
局所的でしか使わないwork変数を定義するのにいちいちそのサブルーチンの一番上に戻らなくて
いいから編集は楽になりそうだ。バグも出来にくくなるかな?
0845デフォルトの名無しさん
2008/12/23(火) 20:18:10ほとんど不便に感じることないんだけど
ローカルスコープ使うと何が便利になるの?
OOP?最適化?詳しい人教えてくれ
0846デフォルトの名無しさん
2008/12/23(火) 21:33:48自分が不便じゃないから他人も同じだと思うのはおかしい。
0847デフォルトの名無しさん
2008/12/24(水) 01:01:27他人も同じと思ってないからこそ質問してるのでは?
0848デフォルトの名無しさん
2008/12/24(水) 17:09:42一時期C#にハマってたが、いろんな意味で感動した
0849デフォルトの名無しさん
2008/12/24(水) 19:30:54「ここでほんのちょこっと使い捨て変数みたいの用意してゴニョゴニョしたい」ってときに欲しくならない?
そういうときにmoduleだのcontainsだのは大仰すぎて使い辛いし、何より見苦しい
0850デフォルトの名無しさん
2008/12/25(木) 20:59:38CやJavaとかだとある程度の慣習があるけども、Fortranの場合はそういうのないよね。
暗黙の型宣言使ってると頭文字の縛りはあるけど。
0851デフォルトの名無しさん
2008/12/25(木) 23:45:490852デフォルトの名無しさん
2008/12/26(金) 22:59:210853デフォルトの名無しさん
2008/12/27(土) 00:44:06最近のコンパイラじゃ、固定形式で書いても6文字の制限はないよね?
律儀に守ってる人ってなんなんだろう
0854デフォルトの名無しさん
2008/12/27(土) 00:55:230855デフォルトの名無しさん
2008/12/27(土) 01:11:100856デフォルトの名無しさん
2008/12/27(土) 10:10:42メインプログラムと同じフォルダに入れている外部サブルーチンを
callで呼び出してもコンパイル時に「missing routine」という表示が出てしまい、
呼び出されません。
どのようにすれば解決されるのでしょうか?
0857デフォルトの名無しさん
2008/12/27(土) 10:31:530859デフォルトの名無しさん
2008/12/27(土) 19:53:1277時代とは違うのだよ。
Externalでルーチン名を書いておくか、MODULEをつかえ。
INCLUDE使う奴は糞。
0860850
2008/12/27(土) 21:40:38まぁ集団でコーディングするときは、適当に変数名のコンセンサスを作っとく、ぐらいしかないか。
0861デフォルトの名無しさん
2008/12/27(土) 21:45:42よくつかう自作関数だけ別にしてあるんだが
0862デフォルトの名無しさん
2008/12/27(土) 21:55:25糞糞言うやつは根拠示せ
0863デフォルトの名無しさん
2008/12/27(土) 22:00:02それは別々にコンパイルして後でリンクすればinclude要らなくないか?
0864デフォルトの名無しさん
2008/12/27(土) 23:27:37INCLUDEはFORTRAN77時代のベンダー拡張を取り入れたもので、
COMMON BLOCKなどに便利という位置づけ。
Fortran90以降ではMODULEを使うのが意図しない変数名の重複とかを避けられると
Fortran95/2003 Explained 20.5 にあり。
MPIもF77版はINCLUDEだが、F90番はMODULE/USEでやってる。
0865デフォルトの名無しさん
2008/12/28(日) 03:50:27>Fortran95/2003 Explained
って何?著書?ググってもよく分からんかった。
つーか、俺もそろそろ95や2003の新しめのFortranを勉強したいと思うんだけど、
何か良い本ないですか?ネットにはちらほらあるけど、やっぱり本が欲しい。
英語の公式マニュアル(?)とかガッツリ読むのはシンドイので、できれば日本語ので
0866デフォルトの名無しさん
2008/12/28(日) 13:30:31Fortran 90/95 Explained
http://www.amazon.co.jp/Fortran-90-Explained-Michael-Metcalf/dp/0198505582
Fortran 95/2003 Explained
http://www.amazon.co.jp/Explained-Numerical-Mathematics-Scientific-Computation/dp/0198526938
規格策定に関わってるような人々が書いてるので、安心感のある本。
教科書というよりは、公式マニュアルの簡略版に近い。
とりあえずあやふやな点を調べるには便利。
だんだん分厚くなってきている。
ISOの規格を噛み砕いたとされるのは、
The Fortran 2003 Handbook: The Complete Syntax, Features and Procedures
http://www.amazon.co.jp/Fortran-2003-Handbook-Complete-Procedures/dp/1846283787
分厚くて字引のごとし。
Fortran 95 Handbook: Complete Iso/ANSI Reference
http://www.amazon.co.jp/Fortran-Handbook-Scientific-Engineering-Computation/dp/0262510960
絶版になって値段が上がっていたが、中古価格がなぜか15万円wwwww
米amazonでも中古$1000越え。
持ってる人は高く売れるかもw
2003の日本語テキストはまだ無いんじゃないかな?
Fortran 95/2003 Explained だとFortran95までのところと、Fortran2003で新たに導入されたところを
章で分けて記述してくれているので、差分だけ勉強するには便利。
0867デフォルトの名無しさん
2008/12/28(日) 17:21:09ありがとう。これ全部読んだんですか?すげー。
Fortran2003の和書はamazonではゼロだね。そろそろ誰か書いてくれんかのう。
0868デフォルトの名無しさん
2008/12/28(日) 17:29:110869デフォルトの名無しさん
2008/12/28(日) 21:53:29>ありがとう。これ全部読んだんですか?
ないないw
というか、そもそも全部は持ってない。
真面目に読んだのは、Fortran 95/2003 Explained ぐらいか。
元々77上がりだったので、プログラミングについて1から書いてある本より77からの差分だけを
教えてくれという希望だった。
そういう本を誰かが書けば売れるかも?
0870デフォルトの名無しさん
2009/01/05(月) 21:00:35intel compiler 10.1 (IA-32,intel64どっちも)がインストールされているIA-32の visual studio 2005 上で
2GB以上のメモリを確保するコードをコンパイルするにはどうすればいいでしょうか?
あと,コンパイルしたコードをwindows64bitのマシンで走らせるときに
注意することってなんでしょうか?
よろしくおねがいします
0871デフォルトの名無しさん
2009/01/05(月) 21:03:28以下、記憶だけで書くので間違ってる可能性大です。
スタートメニューのIntelコンパイラの中に「ifort_vars.bat」みたいなやつない?
64bit用のバッチを実行すると、環境変数が64bit用に設定されたコマンドプロンプトが開かれるのでそのうえでコンパイルすればいい。
・・・と思います。
0873デフォルトの名無しさん
2009/01/06(火) 12:53:21情報処理試験に未だ出てくるのかな
0874デフォルトの名無しさん
2009/01/06(火) 13:15:150875デフォルトの名無しさん
2009/01/06(火) 13:17:460876デフォルトの名無しさん
2009/01/06(火) 13:43:36case sensitiveにできるってこと?
0877デフォルトの名無しさん
2009/01/07(水) 15:34:23蔑ろにされがちだけど、見やすいってことは重要だよね
状況や個人的嗜好によるものだし、一般化するのは難しいけど
0878デフォルトの名無しさん
2009/01/07(水) 22:33:380879デフォルトの名無しさん
2009/01/07(水) 23:30:580880デフォルトの名無しさん
2009/01/08(木) 01:06:160881デフォルトの名無しさん
2009/01/09(金) 16:57:32dismin=1e100
do i=1,n
dis=( (x0-x(i))**2 + (y0-y(i))**2 + (z0-z(i))**2 )
if(dis<dismin) dismin=dis
enddo
などとしてるんですが、最初のdismin=1e100というのがどうも気に入りません。
disminに無限大を代入する方法があればスマートなんですが、そういうことってできますか?
0882デフォルトの名無しさん
2009/01/09(金) 18:31:460884882
2009/01/09(金) 21:55:06その変数の取りうるMAX値にできるだけ。
僕もスマートな書き方のためにがんばるの大好きです。
0885デフォルトの名無しさん
2009/01/10(土) 13:16:39Fortran2015あたりでよろしく
0886デフォルトの名無しさん
2009/01/10(土) 18:27:50str = "NAN"
read(str, *) a
str = "INF"
read(str, *) b
str = "-INF"
read(str, *) c
0887デフォルトの名無しさん
2009/01/11(日) 06:21:31文字列NAN、±INF(もしくはINFINITY)を内部ファイルで読ませるという手か!
実数なら確かにこれで行けるな。あったまいい!…もしかして常套手段?
てか、この方法別に2003からじゃなくない?
0888デフォルトの名無しさん
2009/01/11(日) 09:07:08へえ、これ本当に意図したとおりに行けるのかな?
今度試してみよう。
0889デフォルトの名無しさん
2009/01/11(日) 09:11:16通常の、InfinityとかNaNとか入ってる実数データのファイルを読んでるのと変わらないってのがミソかな
0890デフォルトの名無しさん
2009/01/11(日) 14:19:312段以上のdoループ抜けの場合、抜けるdoに構文名付けてそれに対して明示的にexitしてるけど、
シェルみたいに exit nでn段抜けるようにならんかなぁ。
これFortranに限らず、Cとかjavaとか他の言語でも同様だったりするんだよね。
便利だと思うんだけど何でそうしないんだろう・・・。
普段構文名なんて使ってないのに、exitのためにわざわざ使うのはどう考えてもスマートじゃない。
とくに構文名の重複がないようにするのがめんどくさすぎ・・・
0891デフォルトの名無しさん
2009/01/11(日) 20:17:14Javaはループ構造には名前をつけることができてそれでbreakかcontinueが
できる。名前ならネストが深くなったりした時に事故らないからとかそういう
理由じゃないかと思うけど。
0892デフォルトの名無しさん
2009/01/11(日) 20:33:33いや、代替すればいいとかそういう話をしてるんじゃなくて、>>890ではgotoなりcontinueなり
名前付きbreakなりを使うのがスマートじゃない、ってことを言いたかっただけで。
何重にもなってるdoループなら名前付けて明示的にやったほうが安全かもしれないけど、
例えば↓みたいな数行程度の2重doループから脱出するのに名前を付けるのは
どう見てもダサい。
label1: do i=1,max
do j=1,max
if(条件)then
適当な処理
exit label1
endif
endo
endd label1
0893デフォルトの名無しさん
2009/01/11(日) 23:58:22それは俺も感じていた。
大体この手のパターンが出るのは、それほど多くないが、例外処理みたいな場合で
元々面白くない処理で、ラベルまで書かされてカラムが乱れるしイライラしやすいw
ちょっと見た感じでではFortran2008の規格には入らないようだ。
そのかわり、BLOCK...END BLOCK の構造にDO...END DOと同様のラベルが付けられて
EXITで一気に外に出られるようになるようだ。
0894デフォルトの名無しさん
2009/01/12(月) 09:16:43そう、イライラは非常に宜しくない。精神が乱される。
プログラミングはアートだからねw
こういうのが気にならない人は、FORTRAN77時代の大量の行番号を
苦にも思わない人たちなんだろうなぁ
0895デフォルトの名無しさん
2009/01/12(月) 12:51:440896デフォルトの名無しさん
2009/01/12(月) 13:32:330897デフォルトの名無しさん
2009/01/13(火) 02:43:52(`・ω・´)ゞ ビシッ
目見当でやると8カラム目になってたりするけどな.
気にならないけど気になることも多々あり.
72文字制限があると貴重な一文字だったりするし。
0898デフォルトの名無しさん
2009/01/13(火) 19:43:55慣習には良い慣習と悪い慣習がある
例えばinteger変数の頭文字をI-Nにするのが前者であり、固定形式・行番号・goto(デバッグ時を除く)は後者だ
0899デフォルトの名無しさん
2009/01/14(水) 20:37:15ググッたりフォーラムで検索結果を調べたんですけどサポート予定という
結果ばっかであまり参考になりそうな情報がありませんでした。
サポートされてるならfortran使用までの簡単な流れを(ひとまず並列化はおくとして)
教えていただけないでしょうか?CUDAスレの方に書くべきか迷いましたが、
書き換える話題ばかりだったんで…fortranサポートってのは少なくとも並列化のための
書き換えは別として、ほぼそのままfortranコードが動くって意味ですよね?
0900デフォルトの名無しさん
2009/01/14(水) 21:49:49IntelとAMDの争いにペースを飲まれて消えると予想
0901デフォルトの名無しさん
2009/01/14(水) 23:44:58今回プログラムでtxtデータで
-------------------
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
--------------------
このような順番で並んでいるデータを
--------------------
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20
--------------------
このような並びに並び替え、エクセルで見れる状態にしようとプログラムを触り始めました。
しかし
2次元データの読み込みがうまくいきません(TT)
そして2次元データを読み込んだらどう書き出すように命令すればいいんでしょうか?
1次元の縦軸だけの読み込みと書き出しはすぐできたのですが・・・
本を読んでも何が何だかわからないorz
0902デフォルトの名無しさん
2009/01/14(水) 23:52:01しかも質問内容がFORTRAN以前の問題だし・・・
VBとかでやったほうが断然楽だとおもうよ
Excelで読むならcsv形式にするのが手っ取り早い
VBなら開発環境が無償提供されてるから安くていいし
とにかく文字列操作が苦手なFORTRANでやることじゃない
0903デフォルトの名無しさん
2009/01/14(水) 23:53:400904デフォルトの名無しさん
2009/01/15(木) 00:28:24入力データのフォーマットが今一不明だがこんな感じか。
program test
implicit none
integer, parameter :: N = 10
integer :: i, nax(N), nay(N)
open(unit=11, file="data.txt", status="OLD")
read(11, *) nax
read(11, *) nay
close(11)
do i = 1, N
print *, nax(i), nay(i)
end do
end program test
でもまあ、>>901の様な処理なら>>902-903の言うように手軽なスクリプト言語で
適当なプログラムをでっち上げた方が早い気はする。
0905デフォルトの名無しさん
2009/01/15(木) 04:31:13FortranのCUDA対応だが、PGIのx64用のLinux限定で、登録者限定のテストが始まっている。
多分、今ならまだ間に合うのでは。
春ぐらいには正式対応されるらしい。
プレスリリースでは、OpenMP的な、コメントによるコンパイラ指示行での制御によるもので対応。
バイナリーが二つ出来て動くようだが、正式版ではバイナリを統合するつもりらしい。
ここ参照
ttp://www.pgroup.com/
0906デフォルトの名無しさん
2009/01/15(木) 04:35:58質疑あり
ttp://www.pgroup.com/resources/accel.htm
白書
ttp://www.pgroup.com/lit/pgi_whitepaper_accpre.pdf
0907デフォルトの名無しさん
2009/01/15(木) 04:48:56なっていて自由に使える。FORTRAN IVコンパイラのFORTRAN GやHにJOBが投げられる状態の
IBM360用バイナリも配布されている。JOBカードのサンプルもついているので簡単なプログラムなら
すぐ動かせる。
しかし、TSS型でコンパイル実行する方法がよく分からんw
あと、我輩が昔使っていたのが370のCMS上のFORTRAN77のコンパイラ VS FORTRANなのだが、
こっちはOSの配布まではあるのだが、360ほど親切なJOBカード例などが無い。
IBMマニアでうまく動かせている人がいたら、VS FORTRANのTSSでの使い方を教えてくれ。
0908888
2009/01/15(木) 06:27:31NANやINFを小文字にすると動いた。
886のまま、大文字だと input conversion error が内部ファイル処理のところで出た。
Intel Fortran 9.1 でコンパイルオプションなし。報告終わり。
implicit none
character*3 str3
character*4 str4
real a, b, c
str3 = 'nan'
read(str3,*) a
str3 = 'inf'
read(str3,*) b
str4 = '-inf'
read(str4,*) c
write(*,*) a, b, c
stop
end
0909デフォルトの名無しさん
2009/01/15(木) 10:21:57Intel Fortran 9.0と10.1で試したけど、大文字小文字なんて関係ないよ
というかFortranの仕様だし・・・早く区別できるようになってくんないかなぁ
SunのFortranはできるぽいが、独自規格なのかな
0910デフォルトの名無しさん
2009/01/16(金) 03:20:410911888
2009/01/16(金) 05:43:25同意。だから大文字・小文字に変えることを思いつくのに時間がかかった
909みると他のバージョンのifortでは動いてるね。わけ解からん
0912デフォルトの名無しさん
2009/01/16(金) 12:32:47オプションで選べればいいじゃん
0913デフォルトの名無しさん
2009/01/17(土) 07:04:51ややこしくない?
0914デフォルトの名無しさん
2009/01/17(土) 12:42:38もちろんデフォルトはcase insensitive、オプションでsensitiveにはすべきだけど
俺は視認性を挙げるため、変数に大文字小文字を織り交ぜてるよ
0915デフォルトの名無しさん
2009/01/17(土) 16:11:38大多数だろうが、C言語との連携の関係の方で、CASE SENSITIVEが導入される気がする。
0916デフォルトの名無しさん
2009/01/17(土) 16:16:53逆に厄介なバグを引き起こす可能性がある。
一見違うように見える2つの変数が
実は同じ変数だったなんてことも起こりうるし。
0917デフォルトの名無しさん
2009/01/17(土) 16:34:21こっちは大文字小文字を区別したら動かなくて
このソースは大文字小文字区別しないと動かない
なんていうソースコードを渡されてメンテしろといわれたら泣くしかない
0918914
2009/01/17(土) 18:37:06混ぜるといっても、ほんとに決まりきった部分だけで、紛らわしいような使い方はしてない
NODETMPをNODEtmpにするとか、その程度
Javaほど糞冗長な命名にしろとはいわないけど、視認性を考えた命名はFortranでも重要だと思う
まぁ異論はあるだろうけど、そういう人もせめてコメントは大文字だけで書かないようにしてくれw
0919デフォルトの名無しさん
2009/01/17(土) 19:03:26case sensitiveな言語をやってきた人たちから見れば、
case insensitiveな言語はかなり奇異に映るだろう。
逆はそうでないかもしれんが。
0920デフォルトの名無しさん
2009/01/17(土) 19:05:48今更6文字縛りなんてしてないでしょ。
0921デフォルトの名無しさん
2009/01/17(土) 19:19:030922デフォルトの名無しさん
2009/01/17(土) 19:24:21>実は同じ変数だったなんてことも起こりうるし。
implicit noneにしとけば早々起こらんだろう。
0923デフォルトの名無しさん
2009/01/17(土) 21:12:10それとも自分一人でしかプログラムを書かないつもりかな?
オプション一つでプログラムの実行結果が変わる可能性があるのに
問題ないとか発想がおかしい
Fortranにとって後方互換性こそが命なのに
0924デフォルトの名無しさん
2009/01/17(土) 21:25:190925デフォルトの名無しさん
2009/01/18(日) 15:16:24昔の遺産を引きずるだけなら、コボルと変わらんだろ。
昔は知らんが、少なくとも現在のFortranはHPCのためにあると言っていい。
後方互換を捨てろとはいわないが、効率化・高速化のための改良は貪欲に行うべき。
>オプション一つでプログラムの実行結果が変わる可能性があるのに
後方互換を失うような設定はデフォルトでオフなら文句ないだろ。
0926デフォルトの名無しさん
2009/01/18(日) 15:45:070927デフォルトの名無しさん
2009/01/18(日) 16:01:470928デフォルトの名無しさん
2009/01/18(日) 16:38:44非フォートランナーの知人(もっぱらc#やjava)曰く
全部大文字のfortranコードを見ると頭がクラクラするそうだw
自分は慣れてるから平気だけど、その気持ちはよく分かる
0929デフォルトの名無しさん
2009/01/18(日) 16:49:24ちょっと前まで、大文字しか表示できないダム端末とかあったし。
ASCIIよりEBCDICの方が優位だった時代には{}こんな記号使う連中は、
アホかという感じだったこともあったくわけだしwww
ようするにFortranはわが道を行くべし。
0930デフォルトの名無しさん
2009/01/18(日) 16:52:50育ちが悪いと一蹴するのが育ちの悪いFortrannnerなんだよな。
0931デフォルトの名無しさん
2009/01/18(日) 16:54:16そりゃいくらなんでも頭が固すぎだろう・・・
わが道を行くのは君だけでいいよ
0932デフォルトの名無しさん
2009/01/18(日) 17:05:06ってゆーか見た目云々なら、コーディングルール決めてきちんと守らせた方がよっぽど効果的じゃないの?
case-sensitiveな言語でも、ほっとくとスゴいコード書く人もいるし。
0933デフォルトの名無しさん
2009/01/18(日) 17:10:160934デフォルトの名無しさん
2009/01/18(日) 17:29:46いることからわかるように、自然言語的な構造を持っている。
この辺は計算機学科が観念で作る新奇な人工言語とは文化を異にしている。
過去との後方互換性が豊かな文化的蓄積となっているのが特徴で、それが強みでもある。
文化集団の歴史や伝統、固有の慣習を尊重できないのは、下層階級出身の育ちの
悪い輩が間違って高等教育を受けてしまったような場合によく見られる主張。
要するに新参者は頓珍漢なことをほざいていないで、共産党に入って組合活動でもやるか
10年後には消えてる流行の新言語でもやってろということだ。
0935デフォルトの名無しさん
2009/01/18(日) 17:52:16プログラミング言語において自然言語的であることを誇るなんてのは、
むしろ「人間にやさしい言語」を主張する計算機学科発の珍言語の発想。
だいたい計算機学科発の言語だなんてメジャーになったのは近年では
Haskellかそのお仲間達程度。たいていの言語は生産現場で生まれてる。
0936デフォルトの名無しさん
2009/01/18(日) 18:18:41なんで Fortran や COBOL が21世紀まで生き延びたのか理解しているのか?
40年前のコードがそのまま動くことの価値はそんなに軽いのか?
というか Fortran 使う必要ないじゃん
C/C++ でも F でも HPF でも Java でも C# でも Fortress でも自分の趣味に
合った言語を使えばいいのに
自分が昔作ったプログラムが動かなくなってもいい人がこんなに多いとはね
case sensitive をオプションで変えればいいとか言ってるけど
どのオプションでまともに動くかソースコードを見ただけでは分からないのに
どうやって管理するつもりなんだろう
0937デフォルトの名無しさん
2009/01/18(日) 18:27:46そのまま動くコードね?
当時書かれたコードの何割がそのまま動くか数字で語ってほしいものだな。
0938デフォルトの名無しさん
2009/01/18(日) 18:42:15ありますか?
0939デフォルトの名無しさん
2009/01/18(日) 18:54:02アフォか?
FortranをCOBOLのような過去の遺産のためだけに生かされてる言語といっしょにするな。
今でもバリバリ現役のHPC言語じゃ。Cより最適化しやすいし。
0940デフォルトの名無しさん
2009/01/18(日) 19:07:45ttp://slashdot.jp/it/08/09/20/1452223.shtml
> 1997年、Gartner Groupが発表した調査によれば、現在使われているアプリケーションのうち
> 2400億行はCOBOLで書かれており、毎年何十億行ものCOBOLコードが新たに書かれている
COBOL も Fortran も現役
そしてC言語ではない理由も一緒
0941デフォルトの名無しさん
2009/01/18(日) 19:10:33だから後方互換を消せとは誰も言ってないと何度(ry
話がかみ合ってないな
0942デフォルトの名無しさん
2009/01/18(日) 19:16:01「編集モード」というとvimとかかな?
どの程度の機能を指しているのかわからないけど、キーワードやコメントの強調表示程度なら
EmEditorや秀丸エディタでも定義ファイルを追加すれば出来ます。
私はサクラエディタにFortran用のキーワードファイルを追加して使ってます。
0943デフォルトの名無しさん
2009/01/18(日) 19:17:570944デフォルトの名無しさん
2009/01/18(日) 19:23:040945938
2009/01/18(日) 19:26:15そうです。構文強調のことです。
秀丸、Em、サクラですね。
ありがとうございます!
0946デフォルトの名無しさん
2009/01/18(日) 19:31:10色がつくと格段に見やすいよね.
0947デフォルトの名無しさん
2009/01/18(日) 19:34:50>>934
「必ず」後方互換性を満たさなくなるから文句を言っている
以下のソースコードは何が出力される?
implicit none
integer :: t
t = 1
call f
contains
subroutine f
integer :: T
T = 0
T = t + 1
print *, T
end subroutine
end program
今の言語仕様なら結果は一意だ
case sensitive が許されたら絶対に混乱する
0948デフォルトの名無しさん
2009/01/18(日) 19:35:06908に対する909,910のコメントあたりと思うんだけど、
もとの908のは''で挟まれた文字列について大文字小文字をいっているので・・・
0949デフォルトの名無しさん
2009/01/18(日) 19:38:250950デフォルトの名無しさん
2009/01/18(日) 20:00:020951デフォルトの名無しさん
2009/01/18(日) 20:08:56ソフトウェア側の負担が増す厳しい時代に入ったわけだ
まぁこれは「速度」の話で、今回の「言語の仕様変更による後方互換性がウンヌン・・・」という
「動くか動かないか」の話とは別次元の話ではある
だが、よそから見れば「何のん気なことほざいてやがる」という感じだろうなw
0952デフォルトの名無しさん
2009/01/18(日) 20:12:21プログラムってそういうものだったのですね
まあ並列プログラムなら当たり前ですね
ごめんなさい私の認識が根本的に間違えてました
0953デフォルトの名無しさん
2009/01/18(日) 20:18:00もし新しいコンパイラを、仕様チェックなど何ら下調べもせずに使って
「結果違うじゃん」とか言ってるんだとしたら、おめでたすぎ
そういうやつは古いコンパイラずっと使ってればいい
つーか非線形非定常のシミュレーションだと、オプション次第で結果が微妙に変わるなんて珍しくもないんだが
0954デフォルトの名無しさん
2009/01/18(日) 20:20:03計算が大きくて特別なハードを使うのが偉いというわけでもないけどな。
古いコードを動かすことが出来るか出来ないかはそれなりに重要。
それに古いコードとの互換性を話することが即
新しいハードの機能を使うことを全く考えない、ということを
意味するわけではないんだけどな。
それこそ特定の機能を使って速度を上げる事「だけ」にうんうん悩むのも
何やってんの?ってかんじだけど。マッチ・ポンプだわな。
ま、それで飯は食えるかもしれんけどね。
0955デフォルトの名無しさん
2009/01/18(日) 20:59:25vimですかー
vi系は全然知らなくて使えないんですよねぇ
練習しようかな
0956デフォルトの名無しさん
2009/01/19(月) 01:01:17WZ Editor 5 使ってる人いる?
色分けがかなり柔軟だから大好き。
0957デフォルトの名無しさん
2009/01/19(月) 03:39:59結構高いですね
0958デフォルトの名無しさん
2009/01/19(月) 10:26:490959デフォルトの名無しさん
2009/01/19(月) 13:07:29重さはどんくらい?
コーディング用のエディタは軽いことが大事だと思うんだが
0960デフォルトの名無しさん
2009/01/19(月) 13:08:50昔elvis.exeってあったぞ。
今でもメンテされてるかどうかは知らん。
0961デフォルトの名無しさん
2009/01/19(月) 13:45:14情報ありがとう。捜してみる。
0962899
2009/01/19(月) 15:37:50ありがとうございました。用途からしてfortranにこそ最初から対応せいよ、
というのは世間の感覚からずれてるんでしょうねw
0963デフォルトの名無しさん
2009/01/19(月) 16:23:13ゲームじゃ普通C++だし
0964デフォルトの名無しさん
2009/01/19(月) 16:26:390965デフォルトの名無しさん
2009/01/19(月) 16:31:200966デフォルトの名無しさん
2009/01/19(月) 17:45:331万行くらいのソースをいじるけど、
重さを体感できないから、1mg くらい。
0967デフォルトの名無しさん
2009/01/19(月) 23:46:22日本語Windows版 Vim 7.1 にはCUI版も一緒に入ってるよ。
本家 vim.org の方には16bit DOS用まであるよ。
0968デフォルトの名無しさん
2009/01/20(火) 06:09:25おお、さんくす!
version6.3以降でCUI対応になってたんだね。さっそく使ってみるよ。
0969デフォルトの名無しさん
2009/01/21(水) 00:14:15いや、コンパイラの従来言語の範囲内での対応ではFortranとCは同時になされている。
今までのCUDA対応は、あくまで専用言語か、プログラマ側がすべてを負担するAPI
呼び出しになっていた。
倍精度、IEEE準拠の条件が整ってきた今、Fortranからやれというのは、
それほど的外れでもないと思う。HPC分野に食い込めればの話だが。
0970デフォルトの名無しさん
2009/01/21(水) 03:05:110971デフォルトの名無しさん
2009/01/21(水) 10:54:58いや、やる気はあるが体力の問題か・・・
0972デフォルトの名無しさん
2009/01/22(木) 02:20:45現在はファイル名を直接打ち込んでファイル名を指定しているのですが
Explorerのように選択式にすることってできませんか?
もしくは「あるディレクトリに存在するすべてのファイル名を取得する」コマンドはありませんか?
(DOSコマンドのdirのようなものです)
よろしくお願いします
0973デフォルトの名無しさん
2009/01/22(木) 03:59:13Win32のAPIを呼び出さないとできない。
0974デフォルトの名無しさん
2009/01/22(木) 04:19:22do-loop つかってファイル名を無差別に生成して
inquire つかってしらみっつぶしに・・・
0975デフォルトの名無しさん
2009/01/22(木) 06:11:53でプログラミングしてるのですが
倍精度に変えようと型宣言でREALをREAL*8またはDOUBLE PRECISIONに変えてみてもうまく走りません
型宣言はINCLUDEで、.incでまとめて宣言しているのですが…
倍精度で計算するにはどうしたら良いのでしょうか?
0976デフォルトの名無しさん
2009/01/22(木) 10:26:07てっきりWRITE(6,)って書くのかと思ってた
0977デフォルトの名無しさん
2009/01/22(木) 10:51:33FORTRAN77全盛時代はWRITE(6,*)、6が出るのは66時代の名残。
しかし推奨はWRITE(*, *)だった。
普段はWRITE(*,*)を使って、PRINT文はデバッグ出力用にとっておくと、
デバッグ出力の消し忘れがなくなるぞい。
READに対しては、READ(5,*)→READ(*,*)→READ *の、同等な関係がある。
0978デフォルトの名無しさん
2009/01/22(木) 16:55:37WRITE文で書くと
コンピューターって感じがして好きです
0979デフォルトの名無しさん
2009/01/22(木) 17:02:20ちょっとがんばってみます
>>973
入力ファイル名は数字のみかつある程度規則性があるので不可能ではないですがやめておきます.
0980デフォルトの名無しさん
2009/01/22(木) 17:10:35素直に打ち込みます
ありがとうございました
0981デフォルトの名無しさん
2009/01/22(木) 21:09:51ファイルに出力するようなプログラムを作っておいて前処理で走らせる
という手もある。
0982デフォルトの名無しさん
2009/01/22(木) 21:21:09無理にひとつのプログラムにしようとするから難しいので
むしろそんなフリーソフト探したらありそうな・・・あった!
それでやってみます。ありがとうございました
0983デフォルトの名無しさん
2009/01/22(木) 22:17:09>普段はWRITE(*,*)を使って、PRINT文はデバッグ出力用にとっておくと、
>デバッグ出力の消し忘れがなくなるぞい。
いいこと聞いた!
0984デフォルトの名無しさん
2009/01/23(金) 13:01:33Visual Fortran なら、サンプルがWin32の下にあったはず。
サンプルディレクトリを味噌。
0985デフォルトの名無しさん
2009/01/23(金) 16:00:36あったのですがそれをどのように使えば良いのか理解できませんでしたorz
ちょっと勉強してみようと思います
参考になりました,ありがとうございました
0986デフォルトの名無しさん
2009/01/23(金) 22:24:46F77コンパイラが使えなくなりました。そこで g77 を試しているのですが,古いソースで
コンパイルできないものが出てしまいました。例えば次のようなものです。
do 101 i = 1, 5
if (i.eq.2) go to 101
do 101 j = 1, 5
write(*,*) i, j
101 continue
end
エラーメッセージは以下の通りです。
--------------------------------------------------------------------
g77test/test4.f:4:
if (i.eq.2) go to 101
1
g77test/test4.f:5: (continued):
do 101 j = 1, 5
2
Reference to label at (2) inconsistent with earlier reference at (1)
--------------------------------------------------------------------
このような形式で書かれたソースプログラムが山のようにあり,とても全部を書き直す気に
はなれません。何かのオプションを指定してコンパイルすれば良いのではと思い,いくつか
の試みましたがどれもダメでした。良い知恵は無いでしょうか。
PC:MacBook
OS:10.5.6
g77:3.4.3-104
0987デフォルトの名無しさん
2009/01/23(金) 22:35:04! see c:\Program Files\Intel\Compiler\11.0\066\fortran\Samples\Fortran\Win32\GetOpenFileName
MODULE m_open
USE comdlg32
USE user32 ! Interface for GetForegroundWindow
IMPLICIT NONE
CHARACTER(1), PARAMETER :: eot = ACHAR(0) ! end of text (end of C string)
CONTAINS
!-----------------------------------------------------------------
SUBROUTINE get_file(filename, filter)
IMPLICIT NONE
CHARACTER(*), INTENT(OUT) :: filename
CHARACTER(*), INTENT(IN ) :: filter
TYPE (T_OPENFILENAME) :: ofn
INTEGER :: istatus
ofn%lStructSize = sizeof(ofn)
ofn%hwndOwner = GetForegroundWindow()
ofn%hInstance = NULL ! hInstance
ofn%lpstrFilter = loc(filter)
ofn%lpstrCustomFilter = NULL
ofn%nMaxCustFilter = 0
ofn%nFilterIndex = 1 ! Specifies initial filter value
ofn%lpstrFile = loc(filename)
ofn%nMaxFile = LEN(filename) - 1
ofn%nMaxFileTitle = 0
ofn%lpstrInitialDir = NULL ! Use Windows default directory
ofn%lpstrTitle = loc('' // eot)
ofn%Flags = OFN_PATHMUSTEXIST
ofn%lpstrDefExt = loc('txt' // eot)
ofn%lpfnHook = NULL
ofn%lpTemplateName = NULL
0988デフォルトの名無しさん
2009/01/23(金) 22:36:40IF (istatus .eq. 0) THEN
filename = ''
ELSE
filename = filename(1:INDEX(filename, eot))
END IF
RETURN
END SUBROUTINE get_file
END MODULE m_open
!==================================================================
PROGRAM f_open
USE m_open
CHARACTER(*), PARAMETER :: filter ='ALL Files (*.*) ' // eot // '*.*' // eot // &
'Data Files (*.xy) ' // eot // '*.xy' // eot
CHARACTER(512) :: filename = '' // eot
CHARACTER(132) :: buff
INTEGER :: i
CALL get_file(filename, filter)
OPEN (9, file = filename)
DO
READ(9, '(a)', END = 99) buff
WRITE(*, *) TRIM(buff)
END DO
99 STOP
END PROGRAM f_open
これは特にオプションなどを変えることなくコンソールアプリとしてコンパイル・実行できる。
サブルーチンのパラメータは、ファイルの拡張子の限定だ。
ファイル名を第一引数で返す。
0989デフォルトの名無しさん
2009/01/23(金) 23:18:18文法的に厳密に言うと、101にとんだ後、どっちのDO...LOOPをまわせばいいのか
決めかねるので、コンパイラが文句を言う気持ちもよくわかる。
文脈的には外側のループを回したいのだろうと思う。
それならば、
C if (i.eq.2) go to 101
if (i.eq.2) CYCLE
で、元のをコメントアウトして、F90文法のCYCLEを使えばいい。
それがいやならABSOFTのMac版を買うのがよろしいw
30日くらいの試用もできたんじゃなかったかな?
あるいはg77ならいくかもしれない。
0990デフォルトの名無しさん
2009/01/23(金) 23:51:28いやもう本当になんとお礼を言ったらいいのかわかりません
出来ました.完璧です.
buffのところをReal型の変数に変えたらファイルの中の数値もバッチリ読み込んでくれました
ありがとうございます
私の使ってるCompaqの方にもGetOpenFileNameのサンプルありました
(これがファイル名取得のサンプルってことにさえ気づいてませんでしたがw名前モロですね)
それより断然分かりやすくて良かったです
Compaqの方はどれがファイル名の引数かわからなかったですし
私はFortranを本当に少しかじったくらいなのでもう諦めてたんですが
(DO文が指定無しで無限に回ってくれることも知りませんでした)
本当にお手数おかけして申し訳ありません
ただちょっと楽をしたかっただけなのにここまでしてもらってw
このサンプルが理解できるくらいちょっとずつ勉強していきます
本当にありがとうございました
0991デフォルトの名無しさん
2009/01/24(土) 03:36:08えらいな。
先頭のコメントをみてVisual Fortranのバージョンが11になっているのを今初めて知った。
0992デフォルトの名無しさん
2009/01/24(土) 04:08:08コンパイル時のオプションのAUTODBLを使うという安易な手がある。
FTN77の場合は、
/DREAL
Enables the automatic generation of DOUBLE PRECISION and DOUBLE
COMPLEX for all REAL and COMPLEX and intrinsic functions.
あと、正攻法で行きたいのなら、メインルーチン、サブルーチン、関数、ブロックデータ等のすべての
プログラム単位の冒頭に、
IMPLICIT REAL*8(A-H,O-Z)
を入れるのが昔の定石。
べた書きの数値定数や複素変数は個別に対応しないと駄目だが・・・
0993デフォルトの名無しさん
2009/01/24(土) 11:10:45マジレスするとだな
君が応援してる若手騎手を長らく見守って、
彼が中堅になり、やがてはベテランになるころにはわかるよ。
0994デフォルトの名無しさん
2009/01/24(土) 12:54:210995デフォルトの名無しさん
2009/01/24(土) 13:18:14WRITE(*,*) '小さい順に入力して下さい。'
READ(*,*) (A(I), I=1,10)
もしくは ソート でググれ
そんなことより、だれか次スレお願い
0996デフォルトの名無しさん
2009/01/24(土) 14:23:24テンプレを充実させようかと思ったが遅かったorz
次スレでやろう
0997デフォルトの名無しさん
2009/01/24(土) 16:44:300998デフォルトの名無しさん
2009/01/24(土) 18:34:04くだすれFORTRAN(超初心者用)その4
http://pc11.2ch.net/test/read.cgi/tech/1232789521/
0999デフォルトの名無しさん
2009/01/24(土) 18:56:401000デフォルトの名無しさん
2009/01/24(土) 18:57:21誤爆?
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。