+---------------------------------Fortran 95---------------------------------+


純粋プロシージャー

純粋プロシージャーには副次作用がないため、コンパイラーが プロシージャーを呼び出す場合、特定の順序に束縛されません。 この例外は次のとおりです。

純粋プロシージャーは、FORALL ステートメントおよび構文で特に有用です。 参照されるすべてのプロシージャーに副次作用が起きないように設計されているからです。

次のコンテキストでは、プロシージャーは純粋でなければなりません。

組み込み関数 (RAND、 XL Fortran 拡張は除く) および MVBITS サブルーチンは必ず純粋となります。 純粋であると明示的に宣言する必要はありません。ステートメント関数は、参照する関数がすべて純粋である場合にのみ、 純粋になります。

純粋関数の specification_part は、すべての仮引き数が INTENT(IN) を持つこと (プロシージャー引き数を除く) および属性が POINTER である引き数を指定しなければなりません。純粋サブルーチンの specification_part は、 プロシージャー引き数、アスタリスク、および POINTER 属性を持つ引き数を除き、 すべての仮引き数のインテントを指定します。このような純粋プロシージャーの ためのインターフェース本体は同様に、 仮引き数の意図を指定しなければなりません。

純粋プロシージャーの execution_part および internal_subprogram_part は、値を変化させるコンテキスト、つまり副次作用を引き起こすコンテキストでは、INTENT(IN) の意図を持つ仮引き数、グローバル変数 (または関連したストレージであるオブジェクト)、またはそのサブオブジェクトを参照できません。純粋関数の execution_part および internal_subprogram_part は、 次のようなコンテキストでは、仮引き数、グローバル変数 (または関連した ストレージであるオブジェクト)、そのサブオブジェクトを使用してはなりません。

純粋プロシージャーは、どのエンティティーも VOLATILE であると指定できません。 また、VOLATILE であるデータへの参照を含める ことはできません。含めた場合、使用関連付けまたは ホスト関連付けを介してアクセス可能になります。 これには、NAMELIST I/O を介して生じるデータへの参照も 含まれます。

純粋プロシージャーでは、内部入出力だけを行うことができます。 したがって、入出力ステートメントの装置識別子をアスタリスク (*) にしたり、外部装置を参照したりしては いけません。 入出力ステートメントには以下があります。

PAUSE ステートメントおよび STOP ステートメントは、 純粋プロシージャーでは使用できません。

純粋関数と純粋サブルーチンには、次の 2 つの違いがあります。

  1. サブルーチンのポインター以外のダミー・データ・オブジェクトは 意図を持つ場合もありますが、関数のポインター以外のダミー・データ・オブジェクトは、INTENT(IN) でなければなりません。
  2. POINTER 属性を伴う サブルーチンのダミー・データ・オブジェクトは、関連付け状況または定義状況、あるいはその両方を変更する場合があります。

プロシージャーが純粋として定義されていない場合、 インターフェース本体で純粋と宣言することはできません。 しかし、その逆は真ではありません。プロシージャーが純粋と定義される場合、 インターフェース本体で純粋と宣言する必要はありません。 もちろん、インターフェース本体がプロシージャーを純粋と宣言しない場合、 そのプロシージャー (明示的インターフェースを介して参照するとき) は、 純粋プロシージャー参照だけが許可されるところでは参照として使用でき ません (たとえば、FORALL ステートメントの中)。

PROGRAM ADD
  INTEGER ARRAY(20,256)
  INTERFACE                              ! Interface required for
    PURE FUNCTION PLUS_X(ARRAY)          !   a pure procedure
      INTEGER, INTENT(IN) :: ARRAY(:)
      INTEGER :: PLUS_X(SIZE(ARRAY))
    END FUNCTION
  END INTERFACE
  INTEGER :: X
  X = ABS(-4)                            ! Intrinsic function
                                         !   is always pure
  FORALL (I=1:20, I /= 10)
    ARRAY(I,:) = I + PLUS_X(ARRAY(I,:))  ! Procedure references in
                                         !   FORALL must be pure
  END FORALL
END PROGRAM
PURE FUNCTION PLUS_X(ARRAY)
  INTEGER, INTENT(IN) :: ARRAY(:)
  INTEGER :: PLUS_X(SIZE(ARRAY)),X
  INTERFACE
    PURE SUBROUTINE PLUS_Y(ARRAY)
      INTEGER, INTENT(INOUT) :: ARRAY(:)
    END SUBROUTINE
  END INTERFACE
  X=8
  PLUS_X = ARRAY+X
  CALL PLUS_Y(PLUS_X)
END FUNCTION
 
PURE SUBROUTINE PLUS_Y(ARRAY)
  INTEGER, INTENT(INOUT) :: ARRAY(:)     ! Intent must be specified
  INTEGER :: Y
  Y=6
  ARRAY = ARRAY+Y
END SUBROUTINE

+-----------------------------End of Fortran 95------------------------------+

IBM Copyright 2003