1

いくつかのレガシー FORTRAN コードを使用しています。作成者は、REDUCE_VEC() という関数 (サブルーチンではなく、重要になる関数) を定義しました。1D 配列を受け取り、スカラー実数*8 を返します。したがって、ベクトルを「縮小」したい場合は、関数を呼び出します

RV = REDUCE_VEC(V1)

そしてすべてが順調です。しかし、時折、彼は次のようなセリフを持っています

CALL REDUCE_VEC(V2)

では、2 つの質問があります。1) この 2 番目の形式の呼び出しは一体何をするのでしょうか? (データを返す方法がないことに注意してください。) 2) これは、たとえ PGI でコンパイルできたとしても、gfortran でコンパイルすることさえできません。

ありがとう。

4

2 に答える 2

5

インターフェイスが暗黙的である場合、これは多くのプロセッサでコンパイルされます。コンパイラはそれをチェックできないため、シンボルを呼び出すだけです。次の点を考慮してください。

function f(a)
  dimension a(*)
  f = 0
  do i=1,10
    f = f + a(i)
  end do
end function

program p
  call f([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])
end program

コンパイルしてすぐにクラッシュすることさえありませんがifortsunf90gfortranはそれが別のソースファイルにある場合にのみコンパイルし、結果も私のマシンでクラッシュしません。戻り値がレジスタに配置されている場合、プログラムの残りの部分に害を及ぼすことはありませんが、それ以外の場合はスタックの破損が発生する可能性が非常に高くなります。

于 2013-09-08T10:43:59.220 に答える
4

正当な Fortran ではありません。提示されているように、プログラミングエラーである可能性が高いです(異なるスコープの同じ名前が異なるものを参照することは可能ですが、それは質問によって暗示されているものではありません)。Fortran プロセッサがたまたまこれを可能にする言語の拡張機能をサポートしている場合、何が起こるかは Fortran プロセッサ次第です。そうしないと、「何でも」が発生する可能性があり、「何も」には「何もない」または「非常に非常に悪いこと」が含まれる可能性があります (ただし、これらに限定されません)。

于 2013-09-06T23:57:52.807 に答える