くだすれFORTRAN(超初心者用)その3at TECH
くだすれFORTRAN(超初心者用)その3 - 暇つぶし2ch259:デフォルトの名無しさん
08/04/23 23:54:16
>>255
Fortranはスピード優先なので、配列のはみだしは普通チェックしない。
コンパイラの実行時オプションでチェックするように出来るのが普通だが、あくまでデバッグ用の位置づけ。
今の場合、配列をはみだして他の変数を上書きしている可能性が高い。
MAPオプションでメモリー上に変数がどうアロケートされているかを調べれば、どの変数が壊されているか
見当がつく。

>>257
そういう関数はFortranの標準には無い。
今の場合、ATAN(y/x)よりもATAN2(y、x)を使うほうが適切、X=0.0の場合の0割エラーなどを避けられる。
詳しくはマニュアル味噌。

>>258
素直に前後左右斜めを調べるしかないべ。
DO i=-1,1
DO j = -1,1
CALL check(ix + i, iy + j)
END DO
END DO
枡をはみだす端っこの処理を簡素化するには、配列を0~9までで宣言して端っこマスは
別途の方法で処理するとかできる。空=0、白=1、l黒=2、マスの外=-999とか。


260:デフォルトの名無しさん
08/04/24 09:51:47
>>259
atan2なんてあったんですね!ありがとうございました。

261:デフォルトの名無しさん
08/04/24 17:00:17
form指定子のunformattedとbinaryはどちらが推奨とかあるんですか?
unformattedは機種依存みたいだから、やっぱりbinary?

「Fortranのunformatted=バイナリ」と勘違いしてる人もたまに見かけますが
確かに紛らわしいところだと思いますが、どういう経緯でそういう仕様になったのだろう・・・

262:デフォルトの名無しさん
08/04/24 23:52:06
>>261
普通に数値ファイルなどをシーケンシャルに読み書きするなら UNFORMATTED のほうがいいと思う。
ここでUNFORMATTED の SEQUENTIAL FILE は、改行コードが入っている。

DIRECT ACCESS の場合はベンダー依存だが、トランスパレントにべた書きされていることが多いと思う。
本来はランダムアクセスのためのファイル形式だが、レコード長を1BYTEに指定して順繰りに読んでゆく
ことで binary の代用に出来ることが多い。

昔のマンガや映画でコンピュータがガタガタ磁気テープをアクセスしているのは、DIRECT ACCESS で
ランダムアクセスしてデータを読み出しているところと思われる。

binary は、本当に改行コードなども含めてトランスパレントな生のデータが欲しいときに使うものなので
UNFORMATTED と直接比較されるものではないと思う。

ついでにいうと binary は Fortran2003 で導入される規格で、Fortran95までではコンパイラー側の拡張になっているはず。


歴史的には、文字コードも、数値フォーマットも、1ワードのビット数も機種依存だったので、
UNFORMATTED を機種依存と責めるのは可哀想です。

たとえていうなら、『僕の肛門もEBCDIC(K)をぶち込まれそうです(><;』といった感じ。


263:デフォルトの名無しさん
08/04/25 10:39:23
改行コードって、一行のバイト数合計値を一行の前後にサンドイッチするやつだよね?
od -t x4で覗いたら、この値って4バイトだけど、これだと一行4Gバイトまでしか書けないことにならない?

264:デフォルトの名無しさん
08/04/25 11:14:27
>>263
処理系依存だろうけど、今まで一語4バイトが主流だったから、そのくらいなんじゃない。
10年位前まではスパコンでも1配列のMaxが4Gだったし。


265:デフォルトの名無しさん
08/04/25 15:07:14
>>264
そっか
でもそろそろ拡張してもいいような

266:デフォルトの名無しさん
08/04/26 23:34:36
アナル拡張


267:デフォルトの名無しさん
08/04/28 13:05:57
*

268:助けてください
08/04/29 14:17:32
あの~私FORTRAN90初心者なんですが、ガウスの消去法のプログラムを作りたいのですが、
どなたか簡単に作っていただけないでしょうか?
ちなみに格子点の間隔は0.25で格子点9個です。
時間が無いので本当にお願いします。




269:助けてください
08/04/29 14:51:02
マルチポストしています。


270:デフォルトの名無しさん
08/04/29 16:05:54
>>268 ググレカスでございます
URLリンク(www.tnb.sd.kanagawa-it.ac.jp)

271:デフォルトの名無しさん
08/04/29 19:02:53
複素数のべき乗の計算はどのようにすればいいのでしょうか

272:デフォルトの名無しさん
08/05/01 00:52:00
>>271
複素数の実数べきか?実数の複素数べきか?


273:デフォルトの名無しさん
08/05/01 10:28:55
いえ10の100乗のタンジェントです

274:デフォルトの名無しさん
08/05/06 01:05:31
行列を作って対角化するプログラムを作っています。

行列を作るプログラムが動いたので
それをサブルーチンに入れると
コンパイルできるのですが、実行すると
Segmentation fault (core dumped)のエラーが出ます。
行列の大きさは1000×1000です。

試しに行列のサイズを小さくすると350×350では動きました。

使ってるOSはvistaでcygwin上でg77でコンパイルしています。
メモリは2Gです。

行列サイズを大きいままで動かすことはできないでしょうか?

275:274
08/05/06 01:07:44
行列を作るプログラムは
1000×1000でもちゃんと動きます。

276:デフォルトの名無しさん
08/05/06 03:06:32
>>274
これだけでは、なんとも言えんなw
g77だから動的にメモリー取ったりはしていないんだろうし?

とりあえず、
-fbounds-check
-ffortran-bounds-check
この辺のオプションで配列はみだしチェックを。



もう少しヒントを呉。 
たとえば行列は実対称の単精度の密行列で、ライブラリはLAPACK、呼んでるルーチンは、某。
呼び出し行は
CALL xxxxx(xxxxxx)
使用変数の宣言行は、カクカクしかじか
REAL H(1000, 1000), xxxxxxxxxxxx
ぐらいあるとありがたい。


277:274
08/05/06 04:16:04
>>276
-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

278:274
08/05/06 04:22:23
上のようなプログラムです。
subroutineに入れなければm=2000でもきちんと動いたのですが
入れるとコンパイルはとおりますが
実行するとSegmentation fault (core dumped)のエラーが出ます(上に書いたとうりです)
このくらいの情報でよろしいでしょうか?
足りないのなら付け足します。
よろしくお願いします。

279:274
08/05/06 17:18:06
自己解決しました。
subroutine の中の大きい行列(>>277のa(m,m)、b(m,m)など)全部を
メインプログラムので定義してやるとm=1000でも動きました。
subroutineの中にだけでかい行列を何個も定義したらダメなんですね。
知らなかった。

280:デフォルトの名無しさん
08/05/06 18:48:57
>>279
それは多分スタックオーバーフローだな。
g77エラーメッセージは不親切だな。


281:デフォルトの名無しさん
08/05/06 19:02:33
>>277
よく分からないのだけど mm はメインで定義しなくてイイの?


282:274
08/05/06 21:25:45
>>280
スタックオーバーフローと思います。
今まででかい行列はメインで定義しないと
スタックからあふれるということを知らなかったです。

>>281
すいません、メインでmmは定義してます。

283:281
08/05/06 22:25:27
下のコードを g77 でオプション無しでコンパイルした時も
-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

284:274
08/05/07 04:21:21
>>283さんのプログラムをg77でオプション無しでコンパイルして実行したところ
Segmentation 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


285:デフォルトの名無しさん
08/05/07 09:54:02
>>284
509 * 509 * 8byte(倍精度) = 2,072,648 なので virtual memory の
MAX超えてるのかもしれんな。Cygwin はよく知らんが、こんな小さい初期値なのか?


286:285
08/05/07 09:55:53
ごめんw 
よく見たら単位が kbytes だったw
だからメモリーはまだ余裕だwwwwww

287:281
08/05/07 12:09:31
コンパイラを変えてみたらどうでしょうか?
g95 と gfortran くらいしか思いつきませんが。

288:デフォルトの名無しさん
08/05/07 16:16:23
配列サイズを引数で渡さずにサブルーチン内で定義すれば?
んで、common 文をつかって、コンパイラに
「いちいちallocateしなくてもいいよ」と教えてあげる。
「common文は使っちゃだめ教」があるのは知ってるけど
試してみてちょ。


289:288
08/05/07 16:16:54
program call_matrix
implicit 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


290:288
08/05/07 16:19:57
あと、関係なとは思うけど多重ループはこの例の場合、
ループ制御のincrementalの整数は
内側をi
外側をj
にする習慣を付けていた方が良いよ。知ってたらごめん。



291:288
08/05/07 16:25:02
コンパイル通らなかったw
サブルーチンの中でmを2回定義しているから後のはとってね。
自分の所の g77 on linux (バージョン不明) だと動いたよ。
がんばってね。

292:288
08/05/07 16:48:44
更にお節介。
parameter文で定義した変数を
subroutineの引数に使うのはよした方が良いよ。

・・・・ cygwin 最近使ってないなぁ。
274さんはhostのOSは何?もうvistaに対応してる?

293:デフォルトの名無しさん
08/05/07 18:10:04
OS :Windows Vista
gfortranをインストールしてコンパイルしようとしたのですが、
下記のようなメッセージが出てコンパイルできません。
ld: crtbegin.o: No such file: No such file or directory
どうすれば、コンパイルできるようになりますか?

294:293
08/05/07 18:20:36
下記のページを参考にして、コンパイルを行いました。
URLリンク(www.esst.kyushu-u.ac.jp)

295:デフォルトの名無しさん
08/05/07 18:41:31
>>293
可能性は3つある。
インストールしたバイナリに問題がある。
インストール方法に問題がある。
コンパイルしようとしたプログラムソースに問題がある。

あとは任せた。君なら出来る。

296:281
08/05/07 19:11:08
>>292
> 更にお節介。
> parameter文で定義した変数を
> subroutineの引数に使うのはよした方が良いよ。

ココ詳しく。実はよくやってます。

297:293
08/05/07 19:35:54
>>295
g95をインストールしてコンパイルしたら、できました。
ありがとうございました。

298:デフォルトの名無しさん
08/05/08 11:51:23
>>296
281さんが例として出したプログラムだと問題ないんだけど、
何かの拍子にサブルーチン内で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
みたいにループ制御の(整数)変数も引数に使わない方が安心。
あくまで「安心と安全」という気分の問題だけどね。コードが大きくなるとデバッグするときに
こういう部分ががボディブローよろしく効いてくるので。老婆心。

299:デフォルトの名無しさん
08/05/10 18:09:15
100×100くらいの大きな対称行列の逆行列を求める方法を探しています。
どのような方法が一番精度が良いでしょうか?お知恵をお貸し頂ければ幸いです。

300:デフォルトの名無しさん
08/05/10 20:46:45
>>299
対象の行列に因ると思う。実対称とか色々。
私は考えるのがメンドーなので lapack に丸投げしてるが。


301:デフォルトの名無しさん
08/05/10 20:59:38
lapack 丸投げでいいと思う。
lapack は誤差減らす工夫してたと思うし。
対称行列なら対角化を経由する方法がいいかと。
数値誤差で対称性がくずれるなんてこともないし。
三角行列で扱うから。

302:デフォルトの名無しさん
08/05/11 22:23:14
やっぱ極力ライブラリ使うべきだよね
大抵のはあるし

303:デフォルトの名無しさん
08/05/12 01:02:12
Fortranでは何次元配列で何要素数あつかえるのでしょうか。
メモリとCPUによる?

ちなみにFloatの4次元で、130559044000個(1ファイルで50GBのデータサイズ)を処理したい。

304:デフォルトの名無しさん
08/05/12 01:16:18
確実にメモリには載らない。

1. 小出しに処理する
2. 圧縮する

のどちらかになるな。

305:299
08/05/12 04:37:39
300,301,302さん、レスどうもありがとうございます。
自分の素人っぷりが恥ずかしい限りなのですが
扱う行列が倍精度でもLAPACKで大丈夫でしょうか?
何はともあれ、試行錯誤してみます

306:助けてください
08/05/13 13:59:50
今FORTRANで「ガウスの消去法のプログラムを作れ」とのことなのですが、サブルーチンを
使ったプログラムが作れません。ALLOCATABLEを使ったプログラムなら作れたのですが、誰か
ひとつ例として作って頂けませんか?お願いします。

307:デフォルトの名無しさん
08/05/13 16:29:56
>>306
宿題スレではないぞよ。

308:デフォルトの名無しさん
08/05/13 16:48:18
では宿題スレを紹介してください

309:299
08/05/13 19:27:04
>>305
DSYTRF、DSYTRIを使ったのですがうまくいきませんでした ...orz

310:300
08/05/13 19:47:51
>>309
DSYSV で B = 単位行列ってしたらダメ?やったコト無いけど(私は固有値問題しか解かないし)。
上手くいかないというなら何が可笑しいか。INFO の値は? 多くの場合、INFO=0 は正常終了の筈。
man を見る限り、DSYTRF は目的に合ってないように思うが、それはきっと私の気のせいだ。

ということで、もちっと何か晒せません?(差し障りの無い範囲で)

311:デフォルトの名無しさん
08/05/13 23:47:10
>>310
丁寧な指導ありがとうございます。

いま扱っている対称行列Aは倍精度で、次元が40×40です。
各要素の値には8桁ぐらいのバラつきがあります。
DSYSVでAX=EとなるようなXを求めて、その後実際に
matmulでAXの積を計算して出力しているのですが
対角部分以外の値が全く0に近づきません。
infoは0で出てきてます。
WinXp、cygwin、g95でやってます。これがまずいのでしょか

312:300
08/05/14 00:21:48
>>311
dsysv() から出た後の A が最初の A のままという保証は無いような。その所為では?
つまり dsysv() の中で A の中身が書き変わっている可能性がある。
だとしたら AX =E が成立しなくても可笑しくはない。

313:デフォルトの名無しさん
08/05/14 00:29:11
説明不足ですみません。
DSYSVにはAをコピーしたA'を入力しています。
matmulには元のAを使っています。


314:300
08/05/14 00:41:25
B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
On 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) の実対称でやったら、ソレっぽい結果が出てた。

まぁアレだ、頑張れ。

315:313
08/05/14 02:03:19
>>300
アドバイスどうもありがとうございまs。
もすこし頑張ってみます

316:名 無し
08/05/14 18:06:09
質問があります。
linux上でFortran77を使えるようにするにはどうすればいいのですか?
何かインストールすべきコンパイラがあったりしたら教えて下さい。

317:デフォルトの名無しさん
08/05/15 00:00:21
>>316
大抵のディス鳥はg77が含まれているだろうから
$ which g77
で見つからなかったら

# yum install gcc-g77
とか
# apt-get install gcc-g77
とか
# yum install compat-gcc-34-g77
みたいな感じで。

318:名 無し
08/05/15 15:47:37
>>316
$ which g77で見つかったんですけど開けませんでした・・・

319:デフォルトの名無しさん
08/05/15 17:24:18
>>318
which g77 で見つかったなら、Fortran77が使える準備が出来てるってことよん。
g77は開くものじゃない。

320:デフォルトの名無しさん
08/05/15 21:15:39
fortranってブール型ないんですか?

321:デフォルトの名無しさん
08/05/15 21:21:57
>>320

つ LOGICAL

322:デフォルトの名無しさん
08/05/16 09:03:44
>>321
あったんですか、失礼しました
今まで0、1をfalse、trueとしてやってて、なんかかっこ悪いなぁと思ってまた。というか危険ですよね

ありがとうございました

323:デフォルトの名無しさん
08/05/17 21:46:14
初歩的な質問で申し訳ないのですが。
資料を読み込む時、上からのn行が全ていりません場合はどうすればいいのですか?
僕はこう考えますが:

open(unit=10,file=filename,access="sequential",status="old")
do while( .true. )
read(unit=10,fmt="???",iostat=status)

???のところをいじればいいのですか?
それとも何か他の書き方にした方がいいのですか?

324:デフォルトの名無しさん
08/05/17 22:37:39
>>323
DO i = 1, 10
READ(10, *)
END DO


325:デフォルトの名無しさん
08/05/19 12:50:03
DO i = 1, 10
READ(10, *)
END DO
はどこに入れますか?

これで10行までの資料が読まれるけど保存されてないですよね?
僕はn行まではいらないけが、
n+1以後の資料はちゃんと読まれて配列に保存したいんです。

326:デフォルトの名無しさん
08/05/19 19:09:07
fortran90で、ターミナルへの出力を一旦停止して、
例えば1分後に再開するという感じにしたいのですが
これは pause を使ってできますか?
pause だけだと、何か入力しないと再開しないのですよね?
僕は1分後に自動的に再開したいんです。

327:デフォルトの名無しさん
08/05/20 00:44:47
>>325
DO 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() 関数等を用意しているので、マニュアルのコンパイラ独自拡張の所を
よく読めば出来る可能性が高い。またはライブラリなどの外部ルーチンを呼ぶという方法も無くは無い。
難易度はやや高い。


328:デフォルトの名無しさん
08/05/20 09:35:10
>>326>>327

call system( ' sleep 60 ' )

ってダメかな?

329:デフォルトの名無しさん
08/05/20 10:37:59
>>327, 328
どうもありがとうございます。がんばってみます。


330:デフォルトの名無しさん
08/06/02 20:31:19
ファイルをEOFまで読む場合、read文にend=99とかして飛ばすようにすればできますが、
行番号使うのはあまりスマートじゃないし、基本的に使うべきじゃないですよね。
他の方法ってないでしょうか?

331:デフォルトの名無しさん
08/06/03 01:00:15
>>330
>>327に出ている。
IOSTATの番号は機種依存だが、EOFの-1は確定と見ていい(これが規格に定められて
いるのか、慣習なのかよく分からんw)

それと行番号差別はよくない。行番号だっていい子なんだw
使いたいときは使うがいい。

あとFortran2003では、定数としてEOFやEOL等が定められている。

332:デフォルトの名無しさん
08/06/03 17:31:23
fortranってスコープ内のローカル変数とかって作れないんすかね?

333:デフォルトの名無しさん
08/06/03 18:48:12
>>332
サブルーチン化する

334:デフォルトの名無しさん
08/06/03 22:12:51
NaN を代入したいときってどうしたらいいですか。
たとえば function を作るとき、定義域外の引数を受け取ると NaN を
返すようにしたいんです。
ゼロで割り算すると NaN が返るけど、コンパイラによってはエラーや
警告が出るのでそれは避けたい。

335:デフォルトの名無しさん
08/06/04 00:47:24
>>334
PROGRAM 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を並べる必要も無い。


336:デフォルトの名無しさん
08/06/04 00:51:54
>>332
Fortranではスコープ内のローカル変数は無い。
というかスコープという概念は無い。


もともとのFortranは暗黙の型宣言がなされているので、宣言にこだわる必要は無い。
一方Fortran90以降では、ALGOL/Pascal/Modulaの系列の影響を受けたので、
宣言部はプログラム頭部に集中される。

スコープなどは忘れて、早く暗黙の型宣言を信仰するんだ。
最近の言語では型宣言の省略が流行り始めているので、一周遅れでTopに立てるww


337:335
08/06/04 00:57:48
補足

PROGRAM 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 は全ビット立ってる。


338:334
08/06/04 07:51:04
>>337
ありがとうございます。やってみます。
助かりました

339:デフォルトの名無しさん
08/06/05 18:46:57
character*3 str
str='ABC'
print *,str(1:1)
とすると、Aが出力されますが、

character*3 str(1)
str(1)='ABC'
print *,str(1:1)
とすると、ABCが出力されます。

これはどういう仕組みでこうなるんでしょうか?
characterは文字の配列で実現されているんですよね?

340:デフォルトの名無しさん
08/06/05 21:19:30
後者だと str は大きさ1の1次元配列で、配列の各要素は長さ3の文字列。

341:デフォルトの名無しさん
08/06/06 00:24:53
>>339
>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では文字列操作の便利な関数が増えたので読み甲斐ある。


342:339
08/06/06 21:33:39
>>340,341
ありがとうございます。Cとは違うんですね。

Fortranって文字処理苦手な印象持ってましたが、最近は違うんでしょうかね

343:デフォルトの名無しさん
08/06/07 02:04:05
FORTRAN90の質問です。
初心者なので課題が手につきません。お願いします。
「うるう年のプログラム」
「2次方程式の判定プログラム」


344:デフォルトの名無しさん
08/06/07 04:00:31
>>343
Fortran ResQ 閏年
fortran 方程式の実数解
でググレ

345:デフォルトの名無しさん
08/06/07 11:14:49
>>343
先生に聞けよ、授業料払ってるんだろ。

346:デフォルトの名無しさん
08/06/08 01:32:43
>>343
うるう年の方。結果を確認していない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



347:デフォルトの名無しさん
08/06/08 01:42:58
>>343
二次方程式の分類
一切チェックをしていない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


348:デフォルトの名無しさん
08/06/08 02:39:33
>>346
オマエさん、凄くいい奴。改訂ユリウス暦ってのもあるんだな。
(第三条件:西暦年を900で割った余りが200または600になる年は閏年)
出題者は、グレゴリオ暦と正確に指示しているんだろうか?
「明治31年勅令第90号に基づき閏年を判定するプログラムを作成すること」
というマニアックな教師がいたら嫌だな。

349:デフォルトの名無しさん
08/06/08 02:51:19
>>347
IF の分岐、上手いね。不定・不能まで判定してやるとは、さすが。
EPS で0判定したいところだが、READ なら不要かな?

350:デフォルトの名無しさん
08/06/08 02:57:12
BASICかと思ったぜ
FORTRAN90なのか

351:デフォルトの名無しさん
08/06/08 02:59:14
>>347
追加演習問題として、次のようなのはどう?
「数学的には重解になるが、自らのプログラムで重解と判定されない
 二次方程式の係数を一例あげよ。」

352:デフォルトの名無しさん
08/06/08 03:00:47
>>350
PRINT とあるとBASIC っぽいが、宿題レベルなら十分だろうね。

353:デフォルトの名無しさん
08/06/08 04:17:23
>>351 ぐはw 
0.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

354:デフォルトの名無しさん
08/06/08 04:27:57
0.1 2 1.0 →0.1 2.0 10.0 の間違いw

PRINT * はデバッグの時使うと便利。
普通のコンソール出力をWRITE(*,*)で書いておけば、後からデバッグ用出力を消し忘れることが無い。
READ * もたまに便利。

一応、宿題なので初心者っぽく、ちぐはぐなところを演出してみましたw

>>348
グレゴリオ暦のうるう年のアルゴリズムを確認しにWikipediaを見たときに、下のほうに改訂ユリウス暦と
いうのがあったので嫌な予感がしたがw やはりそう来ますかw

355:デフォルトの名無しさん
08/06/08 06:10:32
>>353
ダメじゃん、学生さんに考えてもらわないとw

初心者だと整数と決め込んでしまいがちだから、
試行錯誤してもらえるかなと。
「丸め誤差に対する考察と、プログラム改良とその改善効果の提示」
A4一枚にまとめてもらえると、講師冥利につきるね。
学年に数人はそういう学生さんがいてほしいな。

不能・不定は、数学的な気配りがないと見過ごしがちだから、
考慮していない学生さんもいるだろうね。

丸め誤差は、数値計算の経験がないと気付かないから、
IF文を習ったばかりなら配慮できっこないねw

356:デフォルトの名無しさん
08/06/08 06:18:01
>>353
さらに追加演習問題(表現は曖昧)として、次のようなのはどう?
「この二次方程式に解がある場合、その解を出力するように改造せよ。
 相異なる二つの実数解をもつ場合、
 数学的な厳密解と出力した実数解との誤差が大きい
 二次方程式の係数を一例あげよ。」

倍精度実数型や計算手順配慮の必要性を
学生さんに感じてもらえるかな。

357:デフォルトの名無しさん
08/06/08 16:42:46
丸め誤差ってコンパイラオプションによっては違った結果になるよね
あんま気をつけたことはないけど、精度命な人はその辺も考えてるのかな

358:デフォルトの名無しさん
08/06/08 18:45:04
文を改行後も続ける場合、&を行末に付加するって仕様、早く直らないかなぁ。
面倒で仕方ない。

359:デフォルトの名無しさん
08/06/08 20:57:27
>>358

昔のように頭の方に継続記号を入れろってことか?


360:デフォルトの名無しさん
08/06/08 21:34:06
考えようによってはCみたいに文末ごとに ; を付けるよりよっぽどお手軽だぞw

361:デフォルトの名無しさん
08/06/08 22:06:47
>>358
Fortran文法は行番号があって,しかも予約語がない

end
= 1 +
end
print *,
end,
end;
end

とか

do
10
do=
10,
10
10
end
do
end

いや聞くだけでわくわくする文法ですね

362:デフォルトの名無しさん
08/06/09 00:42:13
PASCALとかCとかって終端文字;を書くのがめんどくさくて死にそう
FORTRANはやっぱイイナと思うよ。


363:デフォルトの名無しさん
08/06/10 12:04:01
Fortran77の質問です。初心者なので次の課題がでてよく分かりません。お願いします。
 
「フィボナッチ数列を配列f()とDo文を使って計算させ、30項までの結果を8i8の書式で出力せよ。

「日本で現在の流通通貨は1万円札から1円玉まで9種類ある(2千円札を除く)。
5桁の金額 kin を最も少ない枚数でそろえるには、それぞれ何枚になるか出力する。
貨幣9種の額はファイル kahei.txt から読み込む。出力の書式は○○yen ○○mai.」

364:デフォルトの名無しさん
08/06/10 17:28:54
>>360
文が複数行に渡るなんてよくあるし、Cみたいな;のほうが良いと思う俺はFortraner失格ですか?

最近遊びでVSのC#を触ったが、色んな意味で感動したw
他の言語触るのはなかなかイイもんですな

365:デフォルトの名無しさん
08/06/10 18:11:18
>>363
フィボナッチらしき(間違えている)ものを作った。
宿題に合わせて、間違えを修正しろ。

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


366:デフォルトの名無しさん
08/06/10 18:48:57
>>363
とりあえず入出力はつくった。
計算式をよく考えろ。

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


367:デフォルトの名無しさん
08/06/11 00:45:49
>>363
しばらくぶりに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


368:デフォルトの名無しさん
08/06/11 11:32:44
>>365-367
どうもありがとうございました。助かりました。

369:デフォルトの名無しさん
08/06/12 00:12:47
>>367
「キルヒアイス、お前は優しいな。」
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

370:デフォルトの名無しさん
08/06/12 02:28:49
>>369
それも思ったが、I/Oと主演算は分離すべきかなと思って分けた。

天皇陛下万歳!


371:デフォルトの名無しさん
08/06/13 01:34:43
すいません、初心者なんですが
windows上で動くFORTRANのエミュってありますか?

372:デフォルトの名無しさん
08/06/13 01:44:23
>>371
VMwareにLinux入れてg77使えばおkw

373:デフォルトの名無しさん
08/06/13 01:46:34
>>371
ある。77も95も。
ぐぐれw


374:デフォルトの名無しさん
08/06/13 04:53:55
>>373
お勧めの物はないのでしょうか?

375:デフォルトの名無しさん
08/06/13 08:01:12
fortran のエミュってどういう意味なんだろう?
単に IDE があってコンパイルができればいいなら silverfrost ftn95 でググれば見つかるよ。

376:デフォルトの名無しさん
08/06/16 02:07:35
>>374
G95とかどう?
URLリンク(ftp.g95.org)
Self-extracting Windows x86かそのへん


377:デフォルトの名無しさん
08/06/17 01:57:48
>>376
cygwin入れるのがだるい。


378:デフォルトの名無しさん
08/06/17 02:42:03
>>377
まあマジレスすると Self-extracting Windows x86 の方はMinGWだから
Cygwin環境が無くても単独で動くわけだが。

379:デフォルトの名無しさん
08/06/17 09:13:45
しかし Cygwin のインストールがだるいって相当だな

380:デフォルトの名無しさん
08/06/17 19:07:53
倍精度計算で、D○.○のようにして出力すると

例えば 0.12345D-3 のように表示されてしまうのですが
これを1.2345D-4
と表示する事は可能でしょうか?
試行錯誤しているのですが全然分からず教えて頂きたいです

381:デフォルトの名無しさん
08/06/17 19:41:00
昔はcygwin入れるのは当たり前って感じだったが今はな・・・
最近影薄くて心配になるけど、細々と続いてるようね

382:デフォルトの名無しさん
08/06/17 19:51:44
>>380
ESでできなかったかな。

383:デフォルトの名無しさん
08/06/17 23:44:40
>>380
フォーマット指定するだけじゃん・・・

384:デフォルトの名無しさん
08/06/17 23:55:47
>>382-383
ESとはなんでしょうか・・
ごめんなさい、どのようにしたら良いのかさっぱりで・・

385:デフォルトの名無しさん
08/06/18 00:43:11
>>384
フォーマットの指定で"D○.○"の所を"ES○.○"にする

"D○.○"→0.100D+00
"ES○.○"→1.000E+00
"ES○.○E3"→1.00E+000

試してないから間違ってるかも

386:デフォルトの名無しさん
08/06/18 01:20:56
>>380
Fortran90でよければ、上にみんなが書いているように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 . . .

387:デフォルトの名無しさん
08/06/19 11:57:12
P指定子ってすごいよな・・・
今考えるとアリエンけど、昔はああいう仕様は全然平気だったんだろうな

388:デフォルトの名無しさん
08/06/19 17:08:36
世の中の処理系のほとんどが対応してると言っていいFortranのバージョンって、95でしょうか?
ちょっと前は、95はまだ早いから無難に行くなら90にしとけ、って声を聞きましたが。

389:デフォルトの名無しさん
08/06/19 20:44:00
>>387
P指定子ってなんでありえないの??
よく使うのだが…

390:デフォルトの名無しさん
08/06/19 23:07:51
昔、>>380の様に考えて出力用にP指定子を使ったが、クリアしていなかったので
READのところでFフォーマットの値がスケールされて読まれてしまい、とんでもない結果が出て悩んだw

たしかEとかベキ記号がついているときはスケールされないので、すげー悩んだ。

Fortran90の勉強を始めたとき、ESフォーマットがあったので、あぁアリガテーと思った。

391:デフォルトの名無しさん
08/06/20 12:47:18
>>389
マジで言ってんの・・・?
まぁ気をつけてれば問題ないけどさ

392:デフォルトの名無しさん
08/06/23 16:22:50
学校の課題で次のものが出たんですけど、初心者なのでわかりません。お願いします。ちなみにFORTRAN77です。

今日の月日と曜日を入力し,これを用いて今年の任意の月日の曜日を出力させよ.
 各月の日数はファイルから読み込む.ファイル名や変数名は自分で付ける.
曜日は数値で代用してよい.日曜=1,月曜=2,・・・土曜=7.
目標の月日が何日後か(前か)を出す.それから曜日を計算する.
today
6 23 2
when
1 1
-174days 3you
today
6 23 2
when
12 31
191days 4you

393:デフォルトの名無しさん
08/06/23 17:25:50
>>392
「今年」と銘打っているのに、曜日の入力を要求するんだな。
今日の月日と曜日に不整合があった場合、どうするんだろう。

まずは次の課題を考えなさい。
今日の月日を入力し、一年の経過日数(正月=1)を出力するプログラムを作成せよ。

394:デフォルトの名無しさん
08/06/23 20:34:09
わかってるところとわからんことを書かないと、アドバイスのしようがないのでは?
全部かいてもらう気なら別だが。

395:392
08/06/23 20:41:37
>>394
上にも書きましたが初心者です。
全部わからないので全部書いてください。

396:392
08/06/23 20:54:35
上の人は別人です
まだFORTRAN77を触り始めて間が無いので表示するプログラムが限界です
勉強のためにコメントをつけてくだされば嬉しいです

って言いたいと思う

397:デフォルトの名無しさん
08/06/23 21:17:09
>>396
本質的には >>395 と言っている事が一緒だね。
さらに解説ヨロってのも凄いが。

398:デフォルトの名無しさん
08/06/23 21:36:47
まぁとりあえず、作ってみようぜ

399:デフォルトの名無しさん
08/06/23 23:13:44
学校の課題なんだから必要な構文の説明あるだろ
初心者じゃなくて怠け者だろ

400:デフォルトの名無しさん
08/06/24 02:33:14
この問題がわかりません↓

0.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です。
どうかよろしくお願いします。


401:デフォルトの名無しさん
08/06/24 09:21:12
>>396
初心者には、入出力まわりが一番難しいのだが。

402:デフォルトの名無しさん
08/06/24 10:36:12
>>400
PROGRAM 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


403:デフォルトの名無しさん
08/06/24 10:36:47
WRITE(*, *) 's < 0.2 ', NUM(1)
WRITE(*, *) '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 . . .

404:デフォルトの名無しさん
08/06/24 11:20:33
>>392
あまりチェックしてない。
曜日求め部分をよく練っていない。
うるう年対応してしまった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

405:デフォルトの名無しさん
08/06/24 11:23:50
PROGRAM CALEND
1 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 . . .

406:デフォルトの名無しさん
08/06/24 12:03:44
>>404 乙
「各月の日数はファイルから読み込む」となっているね。
最近みかける宿題の出題者は、
無駄にファイル処理をさせようとしていない?

407:デフォルトの名無しさん
08/06/24 12:09:14
>>406
問題よく読んでなかったw
後で直す。


408:デフォルトの名無しさん
08/06/24 13:48:19
>>402
ありがとうございました!!
NUMを使うんですね。
解決できました。感謝です。

409:デフォルトの名無しさん
08/06/24 15:03:32
>>408
> NUMを使うんですね。

ピントがずれてないか?

優しい人たち乙。


私なら「宿題は自分でやれ」で放置だな。

410:デフォルトの名無しさん
08/06/24 15:47:09
>>409
初心者はピントがずれているもんだよ orz

411:デフォルトの名無しさん
08/06/24 20:20:12
入力データ: test.datの中身
0,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では問題なく表示されました。

コンパイラによって読めない文字列ってあるのでしょうか?

412:デフォルトの名無しさん
08/06/24 23:55:38
>>411
漏れのCVF6.6Cはbを*にしてもエラーでない。
単なるVer.6のバグでないか。

おぼろげな記憶ではVer.6→Ver.6.5は有料うpデートで、結構大きな変化があったはず。
Ver.6.0→Ver.6.1 と Ver.6.5→Ver.6.6は無料。



413:407 >>392
08/06/25 01:25:17
FUNCTION IDAYS(IM, ID, MDAYS)
INTEGER 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

414:407 >>392
08/06/25 01:36:07
month.dat
31, 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以下の数の場合終了するようにした。

415:デフォルトの名無しさん
08/06/25 10:25:23
>>414
詳しい説明ありがとうございました。

416:411
08/06/25 13:24:19
>>412
Ver.6.0から6.1へアップデートしてみました。
今度は*のデータの後にブランクが入るようになりました。
つまり、>>411の入力データでaを*にすると、
*

b
と表示されて、500のデータは読めていない。

おっしゃる通り、Ver.6.0とか6.1固有のバグなのかもしれません。
こういうデータ処理には使うなってことでしょうか。
ありがとうございました

417:デフォルトの名無しさん
08/06/26 02:19:25
>>416
俺の予感では、
read(10,*) (dmm(i),i=1,6)
をフォーマットつけて
read(10,’(A)')
にすればおkな気がする。根拠は宇宙からのメッセージ!w


418:デフォルトの名無しさん
08/06/26 14:08:07
FortranってCの/*~*/みたいな範囲コメントってできないんでしょうか?

419:411
08/06/26 14:16:04
>>417
そんなこと・・・あるかもなって思って試してみたけど、
だめだわ。エラーで落ちる。
cygwinのg77でもダメ。

その宇宙からのメッセージ、あんまあてに出来んぞ

ま気持ちだけは嬉しかったわ。ありがとな(´・ω・`)

420:デフォルトの名無しさん
08/06/27 00:29:58
>>418
fortranは、第1行目に「c」或いは「*」を入れるか、
「!」の後がコメントになる
その他のコメントは聞いたことないし見たことない

f90以降にそんなフォーマットがあるのかもしれんけど、おれは見たことない

421:デフォルトの名無しさん
08/06/27 01:31:33
>>418
Fortranは行を基本単位とする言語なので、行毎に指示をするのが自然な形だ。
CやPascalのように、行が意味を持たない代わりに終端符号などをいちいち付ける言語とは
根源的な思想の違いがある。

しかしプリプロセッサを使えば実は範囲コメントも実現出来る。
ただ、プリプロセッサは本来の規格の外にあるので処理系依存の機能になる。
自分の処理系のFortranマニュアルでfppとかを調べてみるべし。

良いニュースとしては将来Fortran2008で、プリプロセッサが規格に入ることになっているので、
それまで、待つという手もある。
10年くらい待つことになると思うがwwwwwww


422:418
08/06/27 10:29:44
>>420,421
ありがとうございます。
行をまとめてズバッとコメントアウトしたいときとか不便だなぁと感じるのですが、仕様上諦めるしかないんですね・・・

世の中のコンパイラがFortran2008に対応するのいつごろだろう
2003だってまだ新しい感じですよね

423:デフォルトの名無しさん
08/06/27 12:39:40
>>422
え、それこそ1文字目にCや*を入れるだけでしょ。1行の前半分をコメントにするのは難しいけど。

まさか、エディタでしこしこ100行くらいの1文字目にC入れるのがしんどいとかだったら言語の問題じゃなくて
あんたの未熟さの問題だけど。

424:418
08/06/27 17:39:39
>>423
確かに私は未熟者ですが・・・。

手動でしこしこやらずに、そういうことをサクッと一発でやる方法ってないですかね?
viでしこしこ書いてるんですが、sedなどの外部コマンド呼ぶのもアレだし
emacsや他のIDEならそういう便利機能ってあるんでしょうか?

425:デフォルトの名無しさん
08/06/27 18:00:20
例えばVisual Studio + Intel Fortranの場合、
Shift押しながら複数行選択し、コメントアウトボタンを押せば行頭に!つくよ。

426:418
08/06/27 18:14:37
>>425
ありがとうございます。VSはさすがに便利ですね。
今の開発環境は、単に端末からサーバに入ってvi、なんですが
Windowsに移行しちゃおうかしら

427:デフォルトの名無しさん
08/06/27 19:47:11
do while文は最適化を妨げるから使うなって聞いたのですが、本当ですか?便利なので使いまくってますが。

428:デフォルトの名無しさん
08/06/27 23:03:57
>>426
viなら置換コマンドを使え。

10行目から20行目までの先頭に ! を挿入
:10,20s/^/!/

30行目から40行目までの先頭の ! を削除
:30,40s/^!//

行頭の ! をすべて削除
:%s/^!//

429:デフォルトの名無しさん
08/06/27 23:05:25
>>426
emacs では C-c ; でリージョンをコメントアウトできる

430:418
08/06/27 23:37:45
>>428,429
ありがとうございます。勉強になりました。

431:デフォルトの名無しさん
08/06/28 08:28:25
>>418
コメントアウトしたいブロックを「#if 0」~「#endif」で挟む。
UNIX系OS上の処理系なら、ソースファイルの拡張子を「.F」に、
Fortran90なら「.F90」にしておけば、コンパイル時に
自動でプリプロセッサを通してくれるはず。


432:デフォルトの名無しさん
08/07/02 16:58:39
Fortran90のサフィックスは普通.f90ですが、2003や2008だとどうなるんですか?.f03や.f08?

433:デフォルトの名無しさん
08/07/02 20:15:58
>>432
サフィックスは固定形式と自由形式の違いの認識じゃない?
f90 以降は、.f90だと思う。


434:デフォルトの名無しさん
08/07/03 09:47:29
>>433
そうでしたね・・・お恥ずかしい質問失礼しました。

435:デフォルトの名無しさん
08/07/05 17:34:50
Fortran90以降の(自由形式の)ソースファイルとして認識されるファイルの拡張子は処理系によって
.f90, .f95, .f2k, .f03, .f08
などがある。
固定形式の方は .f, .for, .ftn などがある。

436:デフォルトの名無しさん
08/07/10 11:41:15
URLリンク(www.uploda.org)
このファイルなんだけど、
stv=c1*cos(t)-(0.5d0)*(exp(-c*t/2.0d0)*(c*cos(t*e1)-(e)*sin(t*e1)
の部分で絶対にエラーを吐かれます
何がいけないのかまったくわからないのですが文字数制限とかでしょうか?

437:デフォルトの名無しさん
08/07/10 11:46:53
事故解決しました

438:デフォルトの名無しさん
08/07/11 20:28:27
nはサブルーチンの引数で0<n<100の整数とします。

GOTO n
1 CALL hogehoge01(...)
GOTO 999
2 CALL hogehoge02(...)
GOTO 999
...
99 CALL hogehoge99(...)
999 PRINT *, '終わり'

みたいな事がやりたのですがコンパイルエラーになります。
現在は IF THEN FLSE で場合分けしているのですが分岐の数が多くて
あまりスマートではありません。何か上手い方法は無いでしょうか?

439:デフォルトの名無しさん
08/07/11 21:23:35
>>438
使っている言語を詳しく

440:デフォルトの名無しさん
08/07/12 00:31:01
>>439
Intel Fortran Compiler 10.1 です

441:デフォルトの名無しさん
08/07/12 00:36:14
すいません、言語でしたね。Fortran 90 を使っています。
Fortran 95 で Intel Compiler がサポートしている機能なら使っても問題ないです。

442:デフォルトの名無しさん
08/07/12 14:38:07
>>438
割り当てGOTO文の行き先はASSIGN文で与えないといけない。ただし、常数じゃないと駄目だったはず。
GOTO n, (1, 2, 3, 4, ....) と書く方法もあるが。

まぁFortran90だったら、素直に SELECT CASE にしとけ。



今時Fortran66時代の割り当てGOTOを持ち出し、しかもIF-THEN-ELSEより割り当てGOTOを
スマートだと感じ、エラーメッセージを貼らないで質問し、
おまけにhogehogeなどというUnix界隈の嫌な語を使うwwww

はっきり言えば、チミはセンスがズレてるから、ちゃんとFortran90以降を基礎から習え。

443:デフォルトの名無しさん
08/07/24 10:03:56
昔のFORTRANって引数に渡した定数をサブルーチン側で変更すると
呼び出し側にも影響が出たって本当ですか?
function(1, 2)
とかで呼んだ場合定数の1と2が入れ替わるみたいな話を耳にしたのですが。

444:デフォルトの名無しさん
08/07/24 17:17:05
フォートラン90なんですが、途中結果をターミナルに出力させた後に
pause 文を入れて、出力結果を確認してリターンキーを押さないと
プログラムが再開しないようにしてあります。
これを、リターンキーを押さなくても、ある程度の時間(10秒とか)が
経つと勝手に再開するようには出来ないのでしょうか。。


445:デフォルトの名無しさん
08/07/24 19:30:07
>>444
OS とコンパイラは何?

446:444
08/07/24 20:38:42
WinXpのcygwinで g95でコンパイルしてます

447:デフォルトの名無しさん
08/07/24 21:40:55
fortranを使って双子素数(連続した奇数が素数になっているものの組)を出力する課題に取り組んでいるんですが
完全にお手上げ状態です。
一応素数の出力はできてるみたいなんですが・・・

*素数の出力
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

こんな感じです。
違う方法でやったほうがいいんでしょうか…

448:デフォルトの名無しさん
08/07/24 22:46:10
解読できんw

449:デフォルトの名無しさん
08/07/24 23:05:23
>>446
CALL SLEEP(10)  ! 10秒間待つ

>>447
そのプログラムを修正するのなら、
 ・調べた奇数が素数だったのか素数で無かったのかを記録する変数を用意して
  「DO 10 i=…」 のループで毎回結果を記録しておく。
 ・素数が見つかったら上記の変数を調べて、1つ前の奇数も素数だった場合は
  両方の値を出力する。

450:デフォルトの名無しさん
08/07/24 23:34:50
>>443
その通り。ただ定数を直接書くのではなくパラメータ指定した定数を書かないと
はっきり分からんだろう。これはサブルーチンの引数が参照渡しなので起こりうる。
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と重複している。その回答を読め。


451:デフォルトの名無しさん
08/07/25 00:13:07
>>449
本当に申し訳ないのですが素数だったか素数じゃなかったかを判別するプログラムが作れません…
まるなげになってしまって申し訳ないですが具体的にどうなるか教えていただけないでしょうか?
(面倒だったり自分でやれとおっしゃるならいいですが)


452:デフォルトの名無しさん
08/07/25 09:09:52
449 ではないが。
素数を画面に書かせることはできてるわけでしょ?
それなら
(1)素数を画面に書くかわりに、適当な変数たとえば prime_prev に代入
(2)あらたに素数を見つける。その素数と prime_prev との差を調べる
(3)差が2なら双子素数。2でないなら、(2)で見つけた素数を prime_prev に代入して
   ふたたびステップ2へ。
でいいんじゃね?

453:デフォルトの名無しさん
08/07/25 11:54:47
普通素数はエラトステネスのふるいをつかって求めるから、
その表で連続している奇数を捜せば良いのではないかい?


454:名無し
08/07/28 17:48:07
FORTRAN77を用いてモンテカルロシミュレーションのプログラムを作成しようと思っています。
しかしFORTRAN77を用いたプログラミング自体始めたばかりであり、プログラムの作成方法についてピンときません。
もしよかったならどのようにしてプログラムを作ればよいのか教えてもらえませんか?
大まか過ぎる質問ではありますが・・・。


455:デフォルトの名無しさん
08/07/28 23:27:16
その質問だと回答してくれる人少ないんじゃない?

まず
1. 計算機にやらす内容を手作業でできるかどうか(時間は別として)

ここでつまづくならFortranの問題じゃなく、
モンテカルロって何?
何を入力して、何を出力するの?
などがわかってないのでちょっと別問題。

1.をクリアしてるなら、次に
2. その処理をコーディングしていくと、どこでつまづくのか
を考えよう。
その部分が明確になっているなら、このスレッドの方は回答くださるかと思います。



大まかな質問なので大まかな回答しかできないけど
RANDOM_NUMBERやRANDとかいった乱数発生関数があるのでこれを利用することになるんだと思うよ。
ちなみにどんな関数があるかはコンパイラに依存するので・・。

456:デフォルトの名無しさん
08/07/28 23:57:35
>>454
分子シミュレーション講座1 モンテカルロ・シミュレーション
ISBN978-4-254-12691-4、神山新一・佐藤明、朝倉書店
付録 7.7 基本的なFORTRANの計算プログラム集
図書館で借りろ。

457:デフォルトの名無しさん
08/07/29 00:49:18
>>454
FORTRANでプログラム出来るとはありがたいこと。
まず天皇陛下に感謝をささげよ。

次に先輩から下敷きになるプログラムを貰うこと。
これで将来の運命が決まる。
筋の悪いウンコプログラムを貰ったらもうアウトw
筋が良くても長大な完成版を貰ったらやはりアウトww
筋が良くて簡素で、自分で拡張してゆける物を貰えたら、おのずから上達して成功する。

つまり、すべては運なので神に祈れw


458:デフォルトの名無しさん
08/07/29 03:21:57
>>457
課題がモンテカルロだしw

459:デフォルトの名無しさん
08/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

460:デフォルトの名無しさん
08/07/29 18:12:22
SUBROUTINE PHIBO
IMPLICIT 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忘れました・・・申し訳ない

461:デフォルトの名無しさん
08/07/29 22:29:02
>>459
>>460
・IMPLICIT NONEがあるのに宣言されていない変数が使われている
・サブルーチンの宣言に仮引数がない
・綴りの間違い

何行目に間違いがあるのかはエラーメッセージに示されているはずなので
それを参照して自分で探すこと。

462:デフォルトの名無しさん
08/07/30 01:04:09
>>461
ありがとうございます

463:デフォルトの名無しさん
08/07/30 12:14:25
>>462
エラーメッセージをコピペしてもらえると、回答はすごく楽になる。


464:デフォルトの名無しさん
08/07/30 15:27:02
>>463

In file ttt.f90:16

CALL PHIBO(i,result)

Error: Symbol 'r' at (1) has no IMPLICIT type

とだけ表示されます。
>>461の宣言されていない変数がなんなのかと綴りがどこが間違っているか発見できません。


465:デフォルトの名無しさん
08/07/30 15:30:31
間違えました

>Error: Symbol 'r' at (1) has no IMPLICIT type

ではなく

Error: Symbol 'result' at (1) has no IMPLICIT type

です

466:デフォルトの名無しさん
08/07/30 16:07:50
>>464-465です

解決しました。ありがとうございました!!

また質問に来た時はよろしくお願いします。

467:デフォルトの名無しさん
08/07/30 20:58:51
>>454-458
アドバイスありがとうございました。
説明不足でしたので少し補足をしておきます。

モンテカルロシミュレーションを用いたタンパク質と低分子の結合実験を行えるプログラム(使用言語:FORTRAN77)を作ろうと考えています。
ここでのモンテカルロシミュレーションはタンパク質上の各部分に乱数とよばれる数をふりわけて、確率的な試行(低分子をタンパク質に結合させる操作)を何回も繰り返すことを意味します。
これによってタンパク質上での低分子の結合しやすい部分を見つけ出そうと考えています。
しかしプログラミングを本格的に始めて間もないということもあり、プログラムを作るための糸口がいま一つ見つかりません。
(例えばタンパク質上の各部分での乱数のふりかた、パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方)

話がまた戻りますが、プログラム完成にいたるまでの手順、方法等についてのアドバイスを頂けませんか?


468:デフォルトの名無しさん
08/07/30 23:34:14
> 例えばタンパク質上の各部分での乱数のふりかた

乱数はRANDOM_NUMBER関数で0<=x<1の値を発生させることができる。
発生させたい数字が5~10なのなら、
発生させたい数字 = 5.0 + x * 5.0 になる。


> パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方

パソコンではどうあがいても分子結合はできません。
揚げ足を取りましたが、シミュレーション方法は先生に聞くべき。

ここではそのシミュレーション方法をプログラミングに反映させる方法を聞いてください。


469:デフォルトの名無しさん
08/07/31 08:07:51
fortran77 だと RANDOM_NUMBER 関数は使えないらしいぞ
URLリンク(www.geocities.jp)
しかし >>467 は fortran90 か 95 を使わない理由はあるの?
77より便利だよ。

470:デフォルトの名無しさん
08/07/31 09:10:48
>>467
この質問内容を見る限り、自分で一から作るのは無理っぽいので、
下敷きになるプログラムをどこかから手に入れることだ。
論文読めばプログラム名があって、ググレば出るだろ。

今はそれどころではないと思うが、真面目な計算に入る前に、乱数も自前のを用意したほうがいい。
というか本来は擬似乱数の評価からはじめないと、叩きまくられる。
乱数マニアがいてうるさいw
スパコンのたぐいならハードウェア実装の乱数とかもあるが。


471:デフォルトの名無しさん
08/07/31 18:52:31
モンテカルロで使う乱数はメルセンヌツイスターでいいだろ。
fortran のコードも公開されてるから、ググってダウンロードして、出力される数列を
自分でチェック。

472:デフォルトの名無しさん
08/08/14 19:04:40
くだらない質問ですが
closeしたファイルに書き加えるってどうやるのでしょうか?

473:デフォルトの名無しさん
08/08/14 20:56:17
>>472
もう一度openする。そのときにposition='append'で書き込み位置を指定する。
そうするとwriteで書き込みしたときにファイルの最後に書き足される。

474:デフォルトの名無しさん
08/08/14 21:06:56
FORTRAN90と95のgnu版が欲しいな

475:472
08/08/14 22:12:29
>>473
ありがと~

476:デフォルトの名無しさん
08/08/14 22:18:44
フリーのFORTRAN95なら
URLリンク(www.silverfrost.com)

477:デフォルトの名無しさん
08/08/14 22:33:19
>>474
gfortran

478:デフォルトの名無しさん
08/08/14 22:40:42
gfortranのwin32版はないみたいだ

479:デフォルトの名無しさん
08/08/14 22:43:31
>>478
あるよ
URLリンク(gcc.gnu.org)

480:デフォルトの名無しさん
08/08/22 14:34:23
以下のコードは、配列を受け取る手続きcallbackを別の手続きforward
に渡すコードです。forwardでは、callbackに対応する仮手続きの引用
仕様で、この配列が1開始添え字(つまりデフォルト)としているが、
callbackでは、0開始添え字になっています。

このような「添え字のずらし」は合法のはずですが、これをコンパイル
すると、g95ではOK、intel fortranではコンパイルエラーとなります。
質問は、これがintel fortranの方言によるものなのか、規格上の根拠
があるのか、どちらなのかということです。



481:デフォルトの名無しさん
08/08/22 14:36:14
module dummyproc
contains
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

482:デフォルトの名無しさん
08/08/23 00:28:50
>>480-481
>>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






483:デフォルトの名無しさん
08/08/25 23:12:11
すみません、教えて下さい。
fortran77で、プログラム途中に print *, A みたいに
Aを出力させるとさせないのとでは
最後の結果(計算にAの値を使う)が異なってしまいます。
(printを入れると正しい値、入れないと NaN)
出来ればprint無しで動かしたいのですが、これって何が悪いのでしょうか?
WinXp-Cygwin、g77でコンパイルしています。

484:デフォルトの名無しさん
08/08/26 04:53:09
>>483
書いたプログラム晒せや。

485:デフォルトの名無しさん
08/08/26 21:26:44
デバッグ文入れたときにのみ結果が違うってのは、
大抵の場合、配列破壊が起きてる。

サブルーチンの引数渡しをチェック、宣言文チェック等すべし。

ちなみにprint文周辺だけ見てもわからない場合が多いよ。



後は、晒すしかないね。

486:483
08/08/26 22:10:28
>>485
ありがとうございます。
ここで晒すには長すぎるので、なんとか地力で頑張ってみます


487:デフォルトの名無しさん
08/08/27 01:06:04
>>486
PRINT文を入れて結果が変わるのは、最適化による場合もある。
最適化レベルを0にする、もしくはデバッグモードで実行してみるという手もある。

また>>485で指摘された可能性を追求する場合には、サブスクリプト・チェックの
オプションをつけてコンパイル・実行することにより容易に確認できる。


488:デフォルトの名無しさん
08/08/27 19:22:23
>>486
77なら暗黙の型宣言使ってるだろうから、その A がプログラムの実行順で、
どこに初めて現れるのかも確認すれ。初期化に失敗してるかもしれん。

どうしてもバクがみつからなかったら、90/95で書き直すべし。
固定形式と暗黙の型宣言の組み合わせは、バクの温床。


489:デフォルトの名無しさん
08/08/27 21:04:19
新しく独学でFORTRAN勉強したいのですが、
77と90/95ではどちらがいいのでしょうか?

完全にプログラミング初心者です。

490:486
08/08/27 22:24:09
>>487-488
追加アドバイスどうも感謝です
参考になります!



491:デフォルトの名無しさん
08/08/28 01:01:36
二次元配列とかで
行列の一部に数値を与えた場合
他の数値を与えられてないところの部分はどのように処理されるのでしょうか?


492:デフォルトの名無しさん
08/08/28 01:12:29
>>491
基本的に変数や配列の中身はゴミが入っていると思ったほうが良い。
0が入っていると思ってはいけない。

共同利用のコップと同じで洗ってから使えw

493:491
08/08/28 01:26:19
なるほど!ありがとうございます。

494:デフォルトの名無しさん
08/08/29 21:57:13
コンパイルは成功するのですが
データを入力すると

RUNTIME ERROR
Error 29.Call to missing routine AAA

といってエラーが出ます、これはどういう意味でしょうか??

495:デフォルトの名無しさん
08/08/30 00:22:31
>>494
副プログラムAAAが存在しないというエラーだが、普通はリンク時に存在しないと怒られる。
externalとかで引数にでもしてるのかな?

もう少しコンパイラ等を詳しく。

496:デフォルトの名無しさん
08/08/30 19:20:51
>>489
しがらみのない自由の身なら、断然90/95。並列化など、将来性も多少はあるかもしれない。
一方77は、過去の遺産を引き継ぐはめになった人が、発狂しながら解読するもの。


497:デフォルトの名無しさん
08/09/01 21:25:09
今までfortran77を使っていたのですが、90や95を使いたくなり、g95をインストールしました。

それで実際に試してみたのですが、コンパイルが上手くいきません。
77を使っていた時はテキストエディタにfcpadを使っており、マウス操作でコンパイルしていましたが、
g95ではコマンドプロンプトでコンパイルするため、勝手がよく分からず困っています。

例えばhello.f90というファイルを作ってコンパイルするとき、
g95 hello.f90 -o a.exe
とコマンドプロンプトで入力すると
g95: hello.f90: No such file or directly
となってしまいます。

こうなってしまうのは入力した内容がおかしいからでしょうか?
ファイルの保存場所などにも関係があるのでしょうか?

あまりに初歩的な内容で申し訳ないのですが、よければよろしくお願いします。

498:デフォルトの名無しさん
08/09/01 22:40:26
>>497
>g95: hello.f90: No such file or directly
hello.f90 が(g95から見て)見つからないのでコンパイルできません。

cd コマンドで hello.f90 が保存してあるディレクトリに移動してからコンパイルして下さい。
現在居るディレクトリ(カレントディレクトリ)は通常コマンドプロンプトのカーソルの左に
C:\hage\> 等と表示されています。


499:デフォルトの名無しさん
08/09/02 07:53:41
>>498
わかりやすい説明ありがとうございます。
申し訳ないですが、もう1つ質問してもいいですか?

helloの拡張子がfだとコンパイルできるのですが、f90やf95に変えると
g95: hello.f90: No such file or directly または
g95: hello.f95: No such file or directly 
となってしまいます・・・。これはなぜでしょうか?

500:デフォルトの名無しさん
08/09/02 23:06:57
>>499
まずエクスプローラでファイル名及び拡張子が確実に「hello.f90」になっているかチェック。
エクスプローラは必ず「拡張子を表示する」設定にしておくこと。

メモ帳で編集している場合は「テキスト文書(*.txt)」で保存すると勝手に拡張子 .txt を付けられて
「hello.f90.txt」となっている場合がある。


501:デフォルトの名無しさん
08/09/04 11:22:12
うちの研究室の先輩からソースコードをもらったのだが・・・
COMMON文やGOTO文がそこらじゅうにあって解読するのが大変だ・・・。

個人的にはF90以降形式で書きたいけれど、ここに書き加えて大丈夫かな?

>>499
windowsなら、g95の後にソースコードをドラッグ&ドロップか、
vistaならソースコードのアイコンを、shiftを押して右クリック、パスとしてコピーをして
プロンプトにパスを貼り付けて実行してもダメ?

502:デフォルトの名無しさん
08/09/04 19:58:26
>>500
>>501

色々と試してみましたが、やはり上手くいきませんでした・・・。
もうちょっと試行錯誤してみます。
こんなくだらない質問に答えていただき、ありがとうございました!

503:デフォルトの名無しさん
08/09/06 01:22:52
Intel Fortran の次期バージョンベータテストが始まっている。
V.11が来年一月までの期限付きだが、無条件に配布されている。
Windows版はVisualStudio(Fortran 専用)つきで。
気になる人はチェキラ!w

ここの右下に入り口あり。
URLリンク(www.intel.com)
めーる登録でライセンスキー送られてくる。
Fortran2003対応の模様。インストールにXP以降が必要。
仕事マシンWin2kの俺様涙目w


504:デフォルトの名無しさん
08/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成分の配列を取り扱います。
#ゾーンの大きさがマチマチなので最大のものに合わせて配列を宣言すると
#メモリが足りなくなってしまいます。


505:デフォルトの名無しさん
08/09/06 08:51:02
>>503
つかってみよっと

506:デフォルトの名無しさん
08/09/06 11:28:03
>>504
F90以降なら構造型を使う。

F77なら、確かEQUIVALENCEで部分配列に別名を付ければ、そのようなことが出来なくもなかったはず。
ただ、諦めて複数の配列変数に分割する方か、見通しがよくなるかもしれない。
F77では、まともにコーディングしたことない、つーか、したくないので、他に定石があるかもしれんが…


507:デフォルトの名無しさん
08/09/06 13:59:21
>>504
配列の持たせ方を変える方法はどうかな?
上記の例の場合、
実際にデータのあるa(9)に値を入れ、
参照配列b(3)にa中の各行の値の入る先頭番号を入れる。 b(1)=1,b(2)=4,b(3)=6
各行の先頭の値は例えば下記のように取り出す
do i = 1, 3
print *, a(b(i))
enddo


508:デフォルトの名無しさん
08/09/06 15:07:44
90なら ALLOCATALE で配列を宣言して、必要なだけそのときに
ALLOCATEすればいいかな。


509:デフォルトの名無しさん
08/09/06 17:03:26
窓用gfortran試してるんだけど、a.exeじゃなくてコンパイル後のファイル名を指定してコンパイルする方法ってある?

510:デフォルトの名無しさん
08/09/06 17:39:30
いつもどおり-oでいいとおもった
ためしてない

511:デフォルトの名無しさん
08/09/06 18:24:23
CompaqのFortranV6.6からIntelFortranV10.1に乗り換えました
付属のVisualStudio環境ではF90の作業用の前提となっているのか
そのエディタは6カラム目の素敵な継続行カラムなどに配慮されていません
そのあたりF77の固定カラムに便利なように設定は変更できないでしょうか?

512:デフォルトの名無しさん
08/09/06 19:25:04
>>511
ツール>オプション>フォントおよび色
で変えられたはず。



のであったが、>>503の新版入れたらなんかおかしくなったwww



513:デフォルトの名無しさん
08/09/06 21:29:47
固定形式は廃止予定事項だから、新機能の実装を優先して、後回しにしたんじゃw


514:デフォルトの名無しさん
08/09/07 01:00:56
>>506-508
ありがとうございます。
構造体を使うことも検討したのですが、ゾーンを指す変数nzでdo文を回したいと考えていたので、今回は用いませんでした。
割付け配列についても、ゾーン間で補完を行う必要があり、同時にすべてのゾーンのデータを保持する必要があるため、今回の用途には適さないのではないかと考えています。
>>507さんのアドバイスを検討してみます。


515:デフォルトの名無しさん
08/09/07 21:38:02
>>509
gfortran -o xxx.exe 2ch.f90でおkですよ。

でも、同じくgfortranで自作ライブラリのリンクの仕方が分からない・・・
どうやってコマンドを入力すればいいんだろう・・・。

516:デフォルトの名無しさん
08/09/07 22:16:59
>>515
gfortran hage.f90 -lmytoupee
または
gfortran hage.f90 libmytoupee.a

モジュールとライブラリのパスはそれぞれ -I, -L で適時指定すること。

517:デフォルトの名無しさん
08/09/08 03:10:45
というかGCCってコンパイラオプション統一してんの?

518:デフォルトの名無しさん
08/09/08 21:58:22
>>516
ありがとうございます。

でも、自分がものすごく初歩的な勘違いをしているかもしれませんが、
ネット上のライブラリはOKでしたが、自作ライブラリがうまく使えないんです。
ライブラリってサブルーチンやモジュールをいろいろなプログラムで使えるようにしたもの、
という認識でいいのでしょうか?

519:デフォルトの名無しさん
08/09/11 00:35:44
gfortran -c subroutine.f90
ar cr module.a *.o
ranlib module.a
gfortran main.f90 ./module.a
./a.out

でダメか?作った静的ライブラリをパスの通っている場所にコピーして使ってもおk

520:デフォルトの名無しさん
08/09/11 21:00:58
プログラムをつい最近始めたばかりの超初心者です。
微妙にスレチですみませんが・・・

intel fortran compiler10.1をknoppix(5.3.1)の環境でインストールしようと思い、
URLリンク(www.obihiro.ac.jp)
の手順にそって行っていました。
しかし、ライセンス文を読み進めたあとに

Where do you want to install to? Specify directory starting with '/'.
[/opt/intel/fc/10.1.015] :

でそのままEnterを押し、インストールが開始され、

Installing...

という文字が出るのですが、そのままPCがフリーズしてしまいます。
何度か再起動しやり直しましたが同じでした。
これはkoppixそのままの環境ではインストールできない
ということでしょうか?
初歩の初歩だと思うのですが、
どなたかご教授お願いいたします。

521:デフォルトの名無しさん
08/09/12 00:14:12
knoppix を LiveCD で使っているとか?

522:520
08/09/12 01:17:25
CD-Rに焼きこんでそのまま起動させて使っています。
他で少し調べたのですが、
HDDにknoppixをインストールして使うべきなのでしょうか・・・。

523:デフォルトの名無しさん
08/09/12 11:26:51
容量が足りんとかかなぁ

knoppixのハードディスクインストールって、普通のディストロのインストールと
比べて簡単かなぁ

524:デフォルトの名無しさん
08/09/13 00:30:43
>>519
ありがとうございます。うまくできました。
こうして作ると、modファイルも生成されるのですが、
このmodファイルもライブラリ配布の時に必須なのでしょうか?
modファイルが無いとコンパイルに失敗するので・・・。

525:デフォルトの名無しさん
08/09/14 02:17:51
>>522
/opt が CD-R にあるから書き込めないんだと思う
knoppix を HDD にインストールして使えば大丈夫でしょ

>>524
モジュールを使ったライブラリ配布するならモジュールが記述されたソースファイルを配布すればいい

それ以前に、ライブラリを配布するなら全てのソースファイルを配布してくれるのが一番ありがたい
どうしてもソースの公開がいやならば、静的ライブラリだけでなく、動的ライブラリも付けたほうがいい

526:デフォルトの名無しさん
08/09/17 11:02:26
fortran77を使っているのですがファイルをopen分で読み込むプログラムを作成した際
attempt to read past end-of-failというエラーメッセージが表示されます。
この原因と対策について教えていただければありがたいです。

527:デフォルトの名無しさん
08/09/17 11:36:35
>>526
>attempt to read past end-of-fail
end of file じゃないの?
ファイルを読み込んでいるうちに、まだ読まねばならないはずなのに、おしまいまで
来てしまったというエラーだと思う。


528:デフォルトの名無しさん
08/09/18 21:56:24
Windows用gFortranに対応しているIDEって何かある?
あと>>503に登録したけどメール来ない(´・ω・`)

529:デフォルトの名無しさん
08/09/18 23:05:08
524です。
>>525
ありがとうございます。確かに、ソースファイルを渡すのが手っ取り早いですね。
静的、動的ライブラリがいいんですね。覚えておきます。

何度も質問で申し訳ありません。Fortran90形式でplplotを使いたいと思うのですが、
CMAKEを使って処理をすればよいとのことでしたが、f90コンパイルをONにしてもエラーになって
C++とF77形式のみでしかmakeができません・・・。
できたファイルを見てもほとんどがC++の形式で、VS2005で開いてコンパイルも失敗してしまいます。

どうしたらFortran90形式でライブラリを読み出して使えるようになるでしょうか。

530:デフォルトの名無しさん
08/09/23 19:37:35
>>528
eclipse + Photran で大丈夫だと思う。Windows版は使ったことないから保証できんが。

>>529
plplot は使ったことないからわからんな。すまんこ。
おいらはグラフィックは gnuplot に描かせている。system 関数で端末のコマンド打てるから
それ使えば自動でグラフ表示できるよ。

531:デフォルトの名無しさん
08/09/23 22:01:39
>>528
Sign Up Now! のところではなく、右下のLINKを踏んで登録だぜ!



532:デフォルトの名無しさん
08/09/25 02:48:38
もしかすると基本的なことなのかもしれないのですが調べてもわからなかったので・・・
以下のようなファイルに収められた数値を順番(?)に読み込むことは可能でしょうか
200709150   左から4文字までが年、そこから2文字で月、さらに3文字でガソリンの価格
200710151   最近30年を対象に年ごとのガソリン価格の平均を求めるプログラムを作りたいのですが
200711153   とりあえずデータを年・月・ガソリン価格に分けて読ませたいのですが
200712151   なにかいいアイデアはございませんでしょうか?
200801149
(以下同様に続く)

533:532
08/09/25 02:50:20
書き忘れましたがfortran77を使ってます

534:デフォルトの名無しさん
08/09/25 08:08:25
format指定すれば簡単に読めるけど、
「調べてもわからなかったので・・・」の内容を詳しくよろしく

535:532
08/09/25 09:04:20
詳しくいうといくつかのfortran関連サイトや教科書を見たけどわからなかった  ということです

536:デフォルトの名無しさん
08/09/25 09:19:49
>>535
だれが"調べる"の定義を詳しく言えといったんだ…

537:532
08/09/25 09:28:28
といいますと・・・

538:デフォルトの名無しさん
08/09/26 18:01:49
質問者が主に3種類
1) 自分で調べる気がないので神が答えを書いてくれることを期待した丸投げ
2) 丸投げだと印象が悪いかと思い、調べてもいないくせに「調べてもわかりません」
3) ちゃんと調べたけどわからない勤勉な人

回答:
a) 質3なら回答してあげたい
b) 質2なら遠まわしに回答
c) 質1なら放置

532が教科書等で何を調べたのかどう調べたのかで
教えてあげるかどうか決めたいってことでしょ



539:デフォルトの名無しさん
08/09/26 18:21:17
fortranのことで調べてもわからなかったような奴のどこが勤勉なんだよ
こんなもん調べてもわからないような奴の方がカス

540:デフォルトの名無しさん
08/09/26 22:08:54
>>532
READ(10, '(I4, I2, I3)') IYEAR, IMONTH, IPRICE

これで読め!



541:デフォルトの名無しさん
08/09/27 17:31:14
read文は終わった後に次の行に改行しますが、改行しないで今の位置を保持する方法ってありますか?

542:デフォルトの名無しさん
08/09/27 18:46:24
>>541
do i=1, 3
read(unit=10, fmt='(I5)', advance='NO') n(i)
end do


543:541
08/09/27 19:09:10
>>542さん
advanceってreadでも使えるんですか!ありがとうございました。

544:デフォルトの名無しさん
08/09/29 14:28:56
実行時にエラーメッセージ「invalid character in field」が表示されます
原因として何が考えられますでしょうか


545:544
08/09/29 15:35:53
自己解決しました。単純なミスでした・・・
一息ついて後でみると以外とすぐミスがわかったりしますよね

546:デフォルトの名無しさん
08/09/29 16:42:11
FORTRANってやったことないんだけど
なんかこのスレ見てるぶんには
PL/Iに文法が似てますねえ

547:デフォルトの名無しさん
08/09/29 18:28:02
そりゃ大昔の言語という仲間だからな

548:デフォルトの名無しさん
08/09/29 23:08:21
>>546
FORTRANの方が先祖だけどな。
PL/I=FORTRAN+COBOL かな。

昔はIBMに勤めると嫌でもならわされていたような。

549:デフォルトの名無しさん
08/09/30 00:48:45
>>530
ありがとうございます。
gnuplotをダウンロードして、早速使ってみました。
うまく工夫すれば直接Fortran計算結果をグラフにできるようなので、いろいろと試してみます。



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch