PROCEDURE 宣言ステートメントによって、ダミー・プロシージャー、外部プロシージャー、またはプロシージャー・ポインターを宣言します。これらのエンティティーに EXTERNAL 属性を指定します。
procedure_interface が、明示的インターフェースを持つプロシージャーかプロシージャー・ポインターの名前の場合、宣言済みプロシージャーまたはプロシージャー・ポインターは、明示的インターフェースを持ちます。procedure_interface は既に宣言されている必要があります。procedure_interface の名前は、組み込み型を指定するキーワードと同じにすることはできません。procedure_interface は、組み込みプロシージャーが実引数として渡されるかぎり、組み込みプロシージャーにすることができます。procedure_interface が、エレメント型プロシージャーの場合、プロシージャー・エンティティー名は、外部プロシージャーから構成されている必要があります。
procedure_interface が宣言型仕様の場合、宣言されるプロシージャーまたはプロシージャー・ポインターは、暗黙的インターフェースおよび指定した結果型を持つ関数です。これらの関数が外部関数である場合、関数定義は、同じ結果型と型パラメーターを指定する必要があります。
procedure_interface が指定されない場合、PROCEDURE 宣言ステートメントは、宣言されるプロシージャーまたはプロシージャー・ポインターが、サブルーチンか関数であることを指定します。それらが関数の場合、暗黙の型の規則が関数の型に適用されます。
BIND 属性を使用してプロシージャー型言語結合を指定する場合、procedure_interface は、プロシージャー型言語結合で宣言されたプロシージャーかプロシージャー・ポインターの名前にする必要があります。
プロシージャー型言語結合で NAME= を指定する場合、プロシージャー・エンティティー名は、1 つのプロシージャー・エンティティー名のみで構成されている必要があります。このプロシージャーを、ダミー・ポインターにしないでください。また、POINTER 属性を持たせないでください。
OPTIONAL を指定する場合、宣言されるプロシージャーやプロシージャー・ポインターを、ダミー・プロシージャーまたはプロシージャー・ポインターにする必要があります。
ステートメントが、モジュールの仕様部分にある場合、指定できるのは PUBLIC または PRIVATE のみです。
INTENT、SAVE、または null_init が指定される場合、宣言されるエンティティーは、POINTER 属性を持つ必要があります。
null_init が指定される場合、対応するプロシージャー・ポインターの初期関連付け状況が関連付け解除されることを示します。これは、また SAVE 属性をも意味します。これは、プロシージャー宣言ステートメント内の SAVE 属性を明示的に使用して、あるいは SAVE ステートメントによって再び確約できます。
プロシージャー・ポインター宣言の場合、POINTER 属性を指定する必要があります。
例 1
以下の例は、外部プロシージャー宣言を示しています。
CONTAINS
SUBROUTINE XXX(PSI)
PROCEDURE (REAL) :: PSI
REAL Y1
Y1 = PSI()
END SUBROUTINE
END
例 2
以下の例は、プロシージャー・ポインター宣言とその使用を示しています。
PROGRAM PROC_PTR_EXAMPLE
REAL :: R1
INTEGER :: I1
INTERFACE
SUBROUTINE SUB(X)
REAL, INTENT(IN) :: X
END SUBROUTINE SUB
FUNCTION REAL_FUNC(Y)
REAL, INTENT(IN) :: Y
REAL, REAL_FUNC
END FUNCTION REAL_FUNC
END INTERFACE
! with explicit interface
PROCEDURE(SUB), POINTER :: PTR_TO_SUB
! with explicit interface
PROCEDURE(REAL_FUNC), POINTER :: PTR_TO_REAL_FUNC => NULL()
! with implicit interface
PROCEDURE(INTEGER), POINTER :: PTR_TO_INT
PTR_TO_SUB => SUB
PTR_TO_REAL_FUNC => REAL_FUNC
CALL PTR_TO_SUB(1.0)
R1 = PTR_TO_REAL_FUNC(2.0)
I1 = PTR_TO_INT(M, N)
END PROGRAM PROC_PTR_EXAMPLE