1

ここで説明されている問題と非常によく似た問題があります:外部関数を Fortran の他の関数/モジュールにアクセス可能にする

Lahey/Fujitsu LF95 コンパイラを使用して、Fortran ソース コードからコンパイルされた DLL を使用しています。外部コールバック関数 (関数ポインタ) へのグローバル参照を保存して、後で呼び出すことができるようにしようとしています。 Fortran DLL の他の関数。

シナリオは次のようなものです。

  • ホスト アプリケーションが Fortran DLL からサブルーチン (プロシージャ) を呼び出し、参照をコールバック関数に渡します。
  • コールバック関数への参照は、グローバルとして保存する必要があります
  • その後、ホスト アプリケーションは Fortran DLL からさまざまな関数を呼び出す可能性があり、これらの関数はコールバック関数を呼び出して、ホスト アプリケーションを呼び出す必要があります。

問題は、質問から受け入れられた回答が Lahey Fortran コンパイラでコンパイルされないことです。どうやら、Intel コンパイラと LF95 コンパイラにはかなりの違いがあります。

次のように、コールバック参照が単一のサブルーチンで正常に機能するようになりました。

subroutine testcallback(cbk)
dll_export :: testcallback                    ! Lahey LF95 extern declaration to export this function

character(len=*) :: text

    interface
       subroutine cbk (string, length)
         character(len=*), intent (in) :: string
         integer, intent (in) :: length
       end subroutine cbk
    end interface

    text = "Hello World"
    call cbk(text, len(text))                 ! invoke the cbk callback; works very well

    return
end

ホスト アプリケーション (私の場合は C# ですが、それは重要ではありません) からこの関数を呼び出すと、非常にうまく機能します。関数参照 (C# の delegatae) を渡すと、Fortran が正しく呼び出しを行い、期待どおりの結果が得られます。

interface問題は、宣言を の外に移動してから、別の Fortran 関数から をtestcallback呼び出すことができないように見えることです。cbk

これが私が達成したいことの例です:

subroutine setcallback(cbk)
dll_export :: setcallback                    ! Lahey LF95 extern declaration to export this function        

    interface
       subroutine cbk (string, length)
         character(len=*), intent (in) :: string
         integer, intent (in) :: length
       end subroutine cbk
    end interface

    ! instead of calling cbk here, I'd like to save a reference to it and make it
    ! available to other functions..

    return
end

subroutine testcallback()
dll_export :: testcallback           ! Lahey LF95 extern declaration to export this function

character(len=*) :: text        

    text = "Hello World Again"

    !    somehow I want to be able to invoke the stored reference to cbk here
    !
    call cbk(text, len(text))                 ! this obviously doesn't work like this

    return
end

最後に、現時点で LF95 コンパイラからの移行は選択肢にないことを付け加えたいと思います。誰かがこれを処理する方法を知っていれば、私は非常に感謝しています!

4

0 に答える 0