2

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

4

0 に答える 0