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

解決済みの質問

なぜ計算結果が出力されないのか・・・

エラーも何もないプログラムなのに、計算されません。
答えは、401.0になるはずなのに・・
理由がわかりません。
コード載せておくので、どなたかお願いします。

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

Parr_M=1.0d0
Temp=1.0d0
Mc=val_Mc (p,M_C_gamma,M_C_alpha)

x=Mc+1.0d0

write(6,10) x
10 format(1H ,F9.3)
end
ーーーーーーーーーーーーーー
real*8 function val_p (Parr_M)
implicit real*8 (a-h,o-z)

val_p=Parr_M(ix,iy)**3

return
end
ーーーーーーーーーーーーーー
real*8 function val_Mc (p,M_C_gamma,M_C_alpha)
implicit real*8 (a-h,o-z)

val_M_C_alpha=M_C_alpha(Temp)
val_M_C_gamma=M_C_gamma(Temp)
p=val_p (Parr_M)
*
val1=val_M_C_alpha
val2=val_M_C_gamma*p
val=val1*val2
*
val_Mc=val

return
end
ーーーーーーーーーーーーーーー
real*8 function M_C_alpha(Temp)
implicit real*8 (a-h,o-z)

M_C_alpha=Temp/2.0d0

return
end
ーーーーーーーーーーーーーーー
real*8 function M_C_gamma(Temp)
implicit real*8 (a-h,o-z)

M_C_gamma=Temp

return
end
ーーーーーーーーーーーーーーー
以上をはしらせると、
『forrtl: severe (157):Program Exception - access violation』
と出てきます。謎です。結果もちゃんと出る様に、F9.3で入力してるはずだが・・

投稿日時 - 2008-07-08 21:28:13

QNo.4161542

すぐに回答ほしいです

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

処理の意味は判らないのでとりあえず動くように余計な物を削除しました。
#渡すべき変数、不要な変数がメチャクチャです・・
また、答えは1.5にしかならないので、どこか式が違うと思われます

最初のプログラムに含まれていた
val_p=Parr_M(ix,iy)**3   は
val_p=Parr_M**3       に変わっていますが合っていますか?
#Parr_Mは関数ですか?変数ですか?
もう一度、FORTRANの文法を見直しましょう!

implicit real*8 (a-z)

Parr_M=1.0d0
Temp=1.0d0
Mc=val_Mc (Parr_M,Temp)
x=Mc+1.0d0
write(6,10) x
10 format(1H ,F9.3)
end
c----------------------------------------
real*8 function val_p (Parr_M)
implicit real*8 (a-z)

val_p=Parr_M**3
return
end
c----------------------------------------
real*8 function val_Mc (Parr_M,Temp)
implicit real*8 (a-z)

val_M_C_alpha=M_C_alpha(Temp)
val_M_C_gamma=M_C_gamma(Temp)
p=val_p (Parr_M)
val1=val_M_C_alpha
val2=val_M_C_gamma*p
val=val1*val2
val_Mc=val
return
end
c----------------------------------------
real*8 function M_C_alpha(Temp)
implicit real*8 (a-z)

M_C_alpha=Temp/2.0d0
return
end
c----------------------------------------
real*8 function M_C_gamma(Temp)
implicit real*8 (a-z)

M_C_gamma=Temp
return
end

投稿日時 - 2008-07-09 00:32:39

補足

はい、1.5にしかなりません。書き間違えです。あと、Parr_M(ix,iy)は間違いです。正確にはx,y成分を含むParr_Mを計算していこうかと思っていますが、問題の筋に不必要なので、削除しています。Parr_M(ix,iy)は消し忘れです。

Parr_Mは変数です。
書いて頂いたもので走らせたのですが、*********でした。
計算エラーはでなかったのですが、その様に出力されました。
なので、確認のため、p,val_G_C_alpha,val_G_C_gammaを出力してみたのですが、pしか思い通り(1.0)にでませんでした。。。
(Mcのルーチンを消し、mainに直接val_G_C_alpha,val_G_C_gammaを返して試みたのですが・・・)
よろしくお願いします。

投稿日時 - 2008-07-09 10:49:30

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

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

回答(6)

ANo.6

>書いて頂いたもので走らせたのですが、*********でした。

わずか数行の部分ですから、どこがNGかチェックできませんか?
function M_C_gamma なんか代入しているだけですから・・
#私はWATCOMのFORTRANで確認しました

投稿日時 - 2008-07-09 18:03:00

お礼

原因判明しました!!
function の前に付けていたreal*8でした!!
これ抜いたら、動きました。ただ、そのロジックは謎・・
これをサンプルの1つとして、今後も勉強して行こうとおもいます。
皆さん、付き合っていただきありがとうございました。
ちなみにimplicit noneで全て定義して組みました。
面倒だけど、組み終わった後のデバッグ作業がかなり楽なことを実感しました♪

投稿日時 - 2008-07-09 20:20:30

ANo.5

デバッグの初歩として各サブルーチンの入り口と出口で引数や計算結果を表示するようにしてみると思いますよ

これで 机上の計算とパソコンの実行結果との相違を潰してみましょう

1の1/2と ... M_C_alpha
1と ... M_C_gamma
1の3乗の積 ... val_p
の積 ... val_Mc
と1の和 って 401ですか?

(0.5 * 1 * (1*1*1) ) + 1
= ( 0.5 * 1 * (1) ) + 1
= ( 0.5 * 1 ) + 1
= ( 0.5 ) + 1
= 1.5
ですよね ・・・

投稿日時 - 2008-07-09 01:30:54

補足

すいません、ミスです。
T=10,p=2で組み込んでいたもので・・
質問の際にわかりやすいようにと、1にして・・書き間違えです。
仰るとおり1.5です。
すいません。
各サブルーチンの入り口と出口で計算結果を表示させてみます。

投稿日時 - 2008-07-09 09:38:00

ANo.3

自分はFortranは学生時代にちょっと齧ったくらいなので、もしかすると質問主殿よりも知らないかもしれない。
ただ、他の言語をやってきた経験から照らしておかしいかなという点を指摘してみたいと思う。

まず最初に、問題のプログラムはFortranのどの仕様(Fortran90とかFortran2008とか言うやつ)に準拠しているのかは知らないが、変数のスコープは問題無いのか?と思う。

具体的に言うと、メインロジックの中で定義している変数

>Parr_M=1.0d0
>Temp=1.0d0
>Mc=val_Mc (p,M_C_gamma,M_C_alpha)

上記は値をセットしている変数をFunctionのパラメーターに使っていないので、
 p
 M_C_gamma
 M_C_alpha
には不定な値しか入っていないと思う。
(また変数スコープの関連でval_Mc Functionの中のTempはメインロジックで値を設定しているTempとは別物として扱われている筈)
Fortranは暗黙の型宣言を許しているので、宣言無しの変数が出てきてもコンパイル時にエラーにならないのがたちが悪い。
不定な値が入っている場合は、その変数にアクセスした瞬間に実行時エラーとなる。
質問主殿は、現段階では必ず implicit none で事前に変数定義を強制する制約の元でプログラムを書いた方がいいかなと思う。

投稿日時 - 2008-07-08 22:46:13

ANo.2

ととと.
val_p だ.

投稿日時 - 2008-07-08 21:38:07

補足

な、な、なっ
何でしょうか!!??
何かお気付きでしたか?

投稿日時 - 2008-07-08 22:13:27

ANo.1

implicit none
にして, 全ての変数を宣言してみたら?

投稿日時 - 2008-07-08 21:36:15

補足

宣言したけど、状態はかわらず・・・
宣言の仕方あってると思いますが、一応確認して下さい。
気になる点あれば指摘してください。
implicit none
real*8 Parr_M,val_Mc,Temp,Mc,x
real*8 p,M_C_gamma,M_C_alpha

Parr_M=1.0d0
Temp=1.0d0
Mc=val_Mc (p,M_C_gamma,M_C_alpha)

x=Mc+1.0d0

write(6,10) x
10 format(1H ,F9.3)
end
ーーーーーーーーーーーーーー
real*8 function val_p (Parr_M)
implicit none
real*8 Parr_M

val_p=Parr_M**3

return
end
ーーーーーーーーーーーーーー
real*8 function val_Mc (p,M_C_gamma,M_C_alpha)
implicit none
real*8 val_M_C_alpha,val_M_C_gamma
real*8 M_C_alpha,M_C_gamma,Temp
real*8 val1,val2,val,val_p,p,Parr_M

val_M_C_alpha=M_C_alpha(Temp)
val_M_C_gamma=M_C_gamma(Temp)
p=val_p(Parr_M)
*
val1=val_M_C_alpha
val2=val_M_C_gamma*p
val=val1*val2
*
val_Mc=val

return
end
ーーーーーーーーーーーーーー
real*8 function M_C_gamma(Temp)
implicit none
real*8 Temp

M_C_gamma=Temp

return
end
ーーーーーーーーーーーーーー
real*8 function M_C_alpha(Temp)
implicit none
real*8 Temp

M_C_alpha=Temp/2.0d0

return
end

投稿日時 - 2008-07-08 22:10:57

あなたにオススメの質問