みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

fortranのプログラムで困っています。

implicit real*8(a-h,o-z)
dimension h(10,300)

h(1,g)=1.0d0
h(2,g)=g*2.0d0

open(6, file='testes-ex.f', status='replace')
do 12 n=1,2
do 11 i=1,2
g=2.0d0*i
11 write(6,*) h(n,g)
12 write(6,*)

stop
end

として出力させると値がすべて0になってしまいます。
私としては1.0 2.0  1.0 4.0 と出力させたいのですが、
どこに問題があるのでしょうか?

当方fortran初心者ですのですごく馬鹿げた質問をしているかも
しれませんが…気付くことがあればご指摘よろしくお願いします。

投稿日時 - 2011-08-10 15:54:19

QNo.6934043

すぐに回答ほしいです

質問者が選んだベストアンサー

いまさら FORTRAN77 ってのもどうかと思うんだけどねぇ. Fortran90 ですら 20年以上前の規格. 今の最新は 2010年版 (通称 Fortran2008).

さておき,
dimension h(10,300)
って書いてあるんだから h は配列です. 誰が何と言おうと. で, 配列の添字は整数であるべきです. FORTRAN77 では実数でもよかったかもしれないけど, 今の Fortran では整数に限定されています.

あと, 厳密な意味で「h(n,g)を、nの値で関数が決まり、gがその関数の変数 (引数?) となるように定義」することは不可能です. もちろん「n と g を引数とする関数」で定義することはできるし, そうするしかありません.

投稿日時 - 2011-08-11 02:00:43

お礼

回答ありがとうございます。

古い規格を使ってるのはおそらく私の先生の趣味だと
思います。

配列と関数は異なるものなのですね。No.3さんのいう通り、
ごっちゃにしていました。


精進あるのみですね。
皆様回答ありがとうございました。

投稿日時 - 2011-08-11 23:28:15

ANo.4

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

書き方がfortran90ぽくない。もしかしてfortran77?
fortran77だとするとimplicit noneは通らなかったかも?
fortran77だとしても、配列と文関数がごっちゃになっています。
よくこんなので、コンパイルが通りましたね。

多分、dimension h(10,300) はいらないのだと思います。第一、こんな問題に
配列は必要ないですよね?
あと文関数も書き方がおかしいです。
h(g)=g*2.0d0
のように書くべきです。(引数には定数入れない)

また、既にgの値はn=1で2.0、n=2で4.0ですので、このまま改修
したとして、1.0 4.0 1.0 8.0 と出力されそうです。

以上

投稿日時 - 2011-08-10 22:03:31

お礼

回答ありがとうございます。

コンパイルするときにはg77としていますが、
これが関係あるのかどうかはわからないです。
ですが確かにimplicit noneというのは初耳ですね。

No.2さんのお礼欄でも書きましたが、nは関数を定める整数で
gはその関数の実変数としてh(n,g)を定めたつもりです。
本来の文章はもう少し複雑なのでこのように例を挙げたのですが、
この例は悪かったかもしれません。

投稿日時 - 2011-08-11 00:43:37

ANo.2

#1 では書き忘れたけど, 本題についていえば
h(1,g)=1.0d0
と書いたら「そのときの g の値」を使って配列要素に値を代入する. だからそれ以外の要素は一切値が変化しない.

でどうするかというと, do でループすればいい. あるいは, いまどきの Fortran なら配列代入がいい感じ.

投稿日時 - 2011-08-10 17:49:33

お礼

回答ありがとうございます。

gを定義してからh(n,g)の定義文を書くことでちゃんとした値が出るように
なりました。助かりました。重ねてありがとうございます。

>初心者ならなおのこときちんとした知識をつけなきゃならないので
私の先生は使って覚えろと言っておりましたのでこのように初歩的な問題が
起きているのでしょうね。

配列の添え字というのはh(n,g)のnやgのことですよね?
添え字は整数しか取れないものなのでしょうか?

私はこの文章でh(n,g)を、nの値で関数が決まり、gがその関数の
変数となるように定義したかったのですが、そうはならないのでしょうか?

重ね重ね質問してしまい失礼は承知の上ですが、助言していただければ幸いです。

投稿日時 - 2011-08-11 00:22:18

ANo.1

初心者ならなおのこときちんとした知識をつけなきゃならないので厳しくいく.

まず, implicit は
implicit none
だけ覚えろ. そして, それを必ず使え.

つぎに, 配列の添え字には整数だけを使え.

投稿日時 - 2011-08-10 17:32:59

あなたにオススメの質問