PROCEDURE 宣言 (Fortran 2003)

目的

PROCEDURE 宣言ステートメントによって、ダミー・プロシージャー、外部プロシージャー、またはプロシージャー・ポインターを宣言します。これらのエンティティーに EXTERNAL 属性を指定します。

構文

構文図を読む構文図をスキップする
>>-PROCEDURE--(--+---------------------+--)--+---------------------------------+-->
                 '-procedure_interface-'     +-::------------------------------+   
                                             '-,--procedure_attribute_list--::-'   

>--procedure_entity_name--+---------------+--------------------><
                          '-=>--null_init-'   

procedure_interface
宣言型仕様または明示的インターフェースを持つプロシージャーの名前です。
procedure_attribute_list
以下のリストからの属性のリストです。
procedure_entity_name
宣言されるプロシージャーまたはプロシージャー・ポインターの名前です。
null_init
NULL 組み込み関数への参照です。

規則

procedure_interface が、明示的インターフェースを持つプロシージャーかプロシージャー・ポインターの名前の場合、宣言済みプロシージャーまたはプロシージャー・ポインターは、明示的インターフェースを持ちます。procedure_interface は既に宣言されている必要があります。procedure_interface の名前は、組み込み型を指定するキーワードと同じにすることはできません。procedure_interface は、組み込みプロシージャーが実引数として渡されるかぎり、組み込みプロシージャーにすることができます。procedure_interface が、エレメント型プロシージャーの場合、プロシージャー・エンティティー名は、外部プロシージャーから構成されている必要があります。

procedure_interface宣言型仕様の場合、宣言されるプロシージャーまたはプロシージャー・ポインターは、暗黙的インターフェースおよび指定した結果型を持つ関数です。これらの関数が外部関数である場合、関数定義は、同じ結果型と型パラメーターを指定する必要があります。

procedure_interface が指定されない場合、PROCEDURE 宣言ステートメントは、宣言されるプロシージャーまたはプロシージャー・ポインターが、サブルーチンか関数であることを指定します。それらが関数の場合、暗黙の型の規則が関数の型に適用されます。

BIND 属性を使用してプロシージャー型言語結合を指定する場合、procedure_interface は、プロシージャー型言語結合で宣言されたプロシージャーかプロシージャー・ポインターの名前にする必要があります。

プロシージャー型言語結合で NAME= を指定する場合、プロシージャー・エンティティー名は、1 つのプロシージャー・エンティティー名のみで構成されている必要があります。このプロシージャーを、ダミー・ポインターにしないでください。また、POINTER 属性を持たせないでください。

OPTIONAL を指定する場合、宣言されるプロシージャーやプロシージャー・ポインターを、ダミー・プロシージャーまたはプロシージャー・ポインターにする必要があります。

ステートメントが、モジュールの仕様部分にある場合、指定できるのは PUBLIC または PRIVATE のみです。

INTENTSAVE、または 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

関連情報