• ベストアンサー

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

エラーも何もないプログラムなのに、計算されません。 答えは、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で入力してるはずだが・・

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

  • ベストアンサー
  • equinox2
  • ベストアンサー率48% (321/660)
回答No.4

処理の意味は判らないのでとりあえず動くように余計な物を削除しました。 #渡すべき変数、不要な変数がメチャクチャです・・ また、答えは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

BOY12345
質問者

補足

はい、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を返して試みたのですが・・・) よろしくお願いします。

その他の回答 (5)

  • equinox2
  • ベストアンサー率48% (321/660)
回答No.6

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

BOY12345
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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 ですよね ・・・

BOY12345
質問者

補足

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

  • kusa_mochi
  • ベストアンサー率76% (1597/2087)
回答No.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 で事前に変数定義を強制する制約の元でプログラムを書いた方がいいかなと思う。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ととと. val_p だ.

BOY12345
質問者

補足

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

BOY12345
質問者

補足

宣言したけど、状態はかわらず・・・ 宣言の仕方あってると思いますが、一応確認して下さい。 気になる点あれば指摘してください。 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

関連するQ&A

専門家に質問してみよう