0

変数を計算する関数をコードに追加したいと考えています。ダミー関数を作成しました

  double precision FUNCTION rawSE(x)
  double precision x
  real ax
  rawSE = 0.0d0
  return
  END

そして、私はそれを使用して呼び出します

  selfE=rawSE(1.0d0)

コードをコンパイルしようとすると、タイトルにエラーが表示されます。rawSE を値 (1.0d0) に置き換えても、エラーは発生しません。別の関数に置き換えると、エラーは発生しません。正常に動作する関数をコピーして名前を変更しました。エラーが発生します。

それで... ここで何が起こっているのですか?これらはすべて同じ行から始まるため、これは列の位置の問題ではありません (少なくとも単純なものではありません)。

これを解決するには?

4

2 に答える 2

0

rawSEそれを使用するプログラムで宣言したかどうかを尋ねたところ、 として宣言したと答えましたdouble precision。モジュールとモジュールを使用するプログラムの両方で関数を宣言するということですか? このような?

module my_stuff

implicit none

contains

double precision FUNCTION rawSE(x)
  double precision x
  rawSE = 2.0d0 * x
  return
end FUNCTION rawSE

end module my_stuff


program test_rawSE

use my_stuff

implicit none

double precision rawSE   ! <-- This line

write (*, *) rawSE (2.0d0)

end program test_rawSE

もしそうなら、それが問題です。関数は一度宣言する必要があるため、「この行」という行は削除する必要があります。モジュールを保持することをお勧めします。これにより、インターフェイスがコンパイラに対して明示的になるからです。関数の戻り値が倍精度であることを「認識」するだけでなく、関数が単一の倍精度引数を持っていることも「認識」します。これにより、これらのプロパティとの一貫性について呼び出しの引数をチェックできます。

PS gfortran 4.1 は本当に古くて時代遅れです。最近のバージョンは大幅に改善されています。そのため、エラー メッセージが不可解である可能性があります。gfortran 4.7 は、2 つのステートメントが互いに競合することを識別します。

double precision rawSE
                      1
rawSE.f90:18.4:

use my_stuff
    2
Error: Symbol 'rawse' at (1) conflicts with symbol from module 'my_stuff', use-associated at (2)
于 2013-03-03T17:11:15.893 に答える