XL Fortran for AIX V8.1.1

ランゲージ・リファレンス

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


純粋プロシージャー

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

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

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

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

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

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

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

純粋プロシージャーでは、内部 I/O だけを行うことができます。したがって、I/O ステートメントの装置識別子をアスタリスク (*) にしたり、外部装置を参照したりすることはできません。 I/O ステートメントは、BACKSPACEENDFILEREWINDOPENCLOSEINQUIREREADPRINTWAIT、および WRITE です。 PAUSE ステートメントおよび STOP ステートメントは、純粋プロシージャーでは使用できません。

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

  1. サブルーチンのポインター以外の仮データ・オブジェクトは意図を持つ場合もありますが、関数のポインター以外の仮データ・オブジェクトは 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

+------------------------------Fortran 95 の終り------------------------------+


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]