いくつかの関数を渡す必要があるプロシージャポインタがあり、gfortranでコンパイルするとクラッシュします(ただし、ifortではクラッシュしません)。問題を示すための最小限の例を次に示します。
モジュールmod1 抽象インターフェース 関数f(x) 倍精度f 倍精度、intent(in):: x 終了関数f エンドインターフェイス 含む サブルーチンprintme(g) プロシージャ(f)、ポインタ、インテント(in):: g write(*、*)g(1d0)、g(2d0)、g(3d0) サブルーチンprintmeを終了します サブルーチンprintme2(g) プロシージャ(f)、ポインタ、インテント(in):: g printme(g)を呼び出す サブルーチンprintme2を終了します エンドモジュールmod1 プログラムテスト mod1を使用する プロシージャ(f)、ポインタ:: pg pg => g printme2(pg)を呼び出す 含む 関数g(x) 倍精度g 倍精度、intent(in):: x g = x ** 2 戻る 終了機能g プログラムテスト終了
明らかに私のプログラムでは、私のバージョンの「printme2」はそれ以上のことをしますが、あなたは要点を理解しています。別のルーチンを何度も呼び出し、毎回プロシージャポインタを渡します。これで、Intelコンパイラを使用すると、これは期待どおりに機能します。
$ ifort segfault.f90 && ./a.out 1.00000000000000 4.00000000000000 9.00000000000000
ただし、gfortran(v4.4.5-8)の場合:
$ gfortran segfault.f90 && ./a.out セグメンテーション違反
テストプログラムでと置き換えるprintme2
と機能することに注意してください。printme
なぜこれが起こるのですか?私は何を間違っているのですか、そしてどうすればそれを正しくすることができますか?