いくつかの関数を渡す必要があるプロシージャポインタがあり、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なぜこれが起こるのですか?私は何を間違っているのですか、そしてどうすればそれを正しくすることができますか?