提示されているコードは、合法的なFortranではありません。インターフェイス本体内の使用ステートメントは、ダミー引数と同じ名前にアクセスしやすくなります。これは、言語のスコーピングルールに違反します。
インターフェイス本体内の使用ステートメントは不必要に見えます。
質問
Ifortを使用してステートメントの下でコードをコンパイルしようとすると、次のようにエラーを返します。
error #8169: The specified interface is not declare
しかし、GFORTRANで完全に機能します。何らかの理由で、Intelコンパイラを使用してこの作業をコンパイルする必要があります。私が使用している言語はFortranです。この理由は、「ifort」コンパイラがインターフェイスに変数が表示されないためです。そこで、それを修正するためにVARと呼ばれるモジュールを開発します。すべてのブロックで使用します。しかし、それはエラーを返します:
This USE statement is not positioned correctly within the scoping unit.
VARモジュールは次のようなものです。
MODULE VAR
CHARACTER(50) :: callbackID
END MODULE
どうすれば問題を解決できますか?私のコンパイラバージョンはiFort 12.1.0です
MODULE DEMO
USE VAR
INTERFACE
SUBROUTINE callback_prototype(callbackID)
USE VAR
CHARACTER(*) :: callbackID
END SUBROUTINE callback_prototype
END INTERFACE
PROCEDURE( callback_prototype ), POINTER :: f_ptr => NULL()
CONTAINS
SUBROUTINE set_callback(func)
IMPLICIT NONE
EXTERNAL :: func
f_ptr => func
call HELLO
END SUBROUTINE
SUBROUTINE invoke_callback(callbackID)
CHARACTER(*) :: callbackID
if (associated(f_ptr)) call f_ptr(callbackID)
END SUBROUTINE
SUBROUTINE HELLO
IMPLICIT NONE
!dosomthing
END SUBROUTINE
END MODULE
解決
提示されているコードは、合法的なFortranではありません。インターフェイス本体内の使用ステートメントは、ダミー引数と同じ名前にアクセスしやすくなります。これは、言語のスコーピングルールに違反します。
インターフェイス本体内の使用ステートメントは不必要に見えます。
他のヒント
そもそもインターフェイスで使用ステートメントを使用したい理由はわかりません。適切な手順にアクセスできるため、インターフェイスをスキップできます。
PROCEDURE( invoke_callback ), POINTER :: f_ptr => NULL()