2017-11-10 11 views
0

私たちは、インテルのVisual Fortranを使用して再コンパイルしようとしているこの古いFortranスクリプトを持っていますが、コードの古いコンパイルバージョンとは異なる計算エラーと異なる結果を得ています。'属性を保存する'とプロパティを扱う際のFortranコンパイラの違いは?

以下のコードで問題と思われるものを見つけました(これは数値レシピに由来します)。

問題は、 'it'パラメータが各呼び出しでリセットされることですが、関数呼び出しの間に格納する必要があります。

問題が起きる可能性が最も高いのは、古いコンパイラでは 'それを'保存属性 'として扱い、関数呼び出しの間に保存している可能性があるということです。

ここでは完全に間違っているかもしれませんが、一部のFortran-guruがこれを確認したり、より良い説明をすることができれば、私たちはいくつかの助けを愛するでしょう!

 subroutine TrapezoidalRule(Func, a, b, s, n) 
* 
*  This routine performs the trapezoidal rule, see Numerical Recipes 
* 
     implicit none 
     real*8 Func, a, b, s 
     Integer*4 n 
     external Func 
* 
     real*8 del, x, sum 
     Integer*4 it, tnm, j 
* 
     if (n .eq. 1) then 
* 
     s=0.5d0*(b-a)*(Func(a)+Func(b)) 
     it=1 
* 
     else 
* 
     tnm=it 
     del=(b-a)/dble(tnm) 
     x=a+0.5d0*del 
     sum=0.d0 
     do 11 j=1,it 
* 
      sum=sum+Func(x) 
      x=x+del 
* 
11  continue 
* 
     s=0.5d0*(s+(b-a)*sum/dble(tnm)) 
     it=2*it 
* 
     endif 
* 
     return 
     end 
+0

聞きたいことはありますか?一種の、ちょっと...信じる理由があれば、おそらく本当です。だから、何が問題なのですか?それは可能ですか?はい、可能です。しかし、もっと何を望んでいますか? –

+0

私たちは、あなたの間違った結果と間違った結果を持っていません。彼らはどのように違うのか分かりませんし、テストを複製することはできません。私たちは本当にあなたを信じるためにそれ以上のことはできません。 'save'属性の追加が助けになりましたか?私たちはそれがどのコンパイラであったか知りません。 –

+0

私の質問で私が不明な場合は申し訳ありません。ここで少し不満。 初期の作業にまだ誰も関与していないため、どのコンパイラが使用されたのかわかりません。 Fortranの優れた見識を持った人が、これについての良い情報を見つけるのに苦労していたため、過去に「属性の保存」がどのように扱われているかを知りたいと思っていました。 – Petter

答えて

2

はい、説明は妥当です。コードは

tnm=it 

it変数アクセスしitsaveない場合、この値は不定です。

古いコンパイルではスタックがまったく使用されていない可能性があり、すべての変数に静的ストレージが使用されている可能性があります。スタックを使用している可能性もありますが、上書きされることはなく、値は同じ場所にあることがありました。誰が知っている、我々は知るべき情報を持っていない。

save属性をこのような悪いコードのすべての変数に強制的に設定するコンパイラオプションがあります(すべてがSAVEは決して標準ではありませんでした)。インテルFortranの場合は-saveです。

+0

可能性があります、私はそれを深く掘り下げます。 コードがたくさんあるので、少し心配しています。これは、プロジェクトで問題が発生する可能性があることを意味します。 – Petter

+1

私が参照した '-save'オプションを試すことができます。詳細については、マニュアルを参照してください。インテルのサポート・フォーラムには、関連するスレッドもあります。 –

関連する問題