ここで説明されている問題と非常によく似た問題があります:外部関数を 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 コンパイラからの移行は選択肢にないことを付け加えたいと思います。誰かがこれを処理する方法を知っていれば、私は非常に感謝しています!