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


エレメント型プロシージャー

エレメント型サブプログラム定義 には、ELEMENTAL プレフィックス指定子がなければなりません。 ELEMENTAL プレフィックス指定子を 使用した場合、RECURSIVE 指定子は使用できません。

エレメント型プロシージャーを指定した場合、-qrecur オプションは 使用できません。

エレメント型サブプログラムは、純粋なサブプログラムです。 ただし、純粋なサブプログラムは必ずしもエレメント型サブプログラムではありません。 エレメント型サブプログラムの場合、必ずしも ELEMENTAL プレフィックス指定子および PURE プレフィックス指定子の両方を指定する必要はありません。PURE プレフィックス指定子は、 ELEMENTAL プレフィックス指定子の指定によって暗黙に指定されます。 標準準拠のサブプログラム定義またはインターフェース本体には、 PURE および ELEMENTAL プレフィックス指定子 の両方を入れることができます。

エレメント型プロシージャー、サブプログラム、および ユーザー定義エレメント型プロシージャーは、以下の規則に従わなければなりません。

エレメント型プロシージャーへの参照は、以下の場合にのみエレメント型になります。

エレメント型サブプログラムへの参照は、 そのすべての引き数がスカラーである場合はエレメント型ではありません。

参照内のエレメント型プロシージャーへの実引き数は、 以下のいずれかにすることができます。

エレメント型参照の場合、エレメント型の結果の値は、サブルーチンまたは関数が、 それぞれの配列の実引き数の対応するエレメントに対して、任意の順序で別々に 適用された場合に得られる結果の値と同じになります

組み込みサブルーチン MVBITS が使用される場合、TO および FROM 仮引き数に対応する引き数は、同じ変数にすることができます。 これとは別に、エレメント型サブルーチンまたはエレメント型関数への参照内の 実引き数は、引き数関連付けで説明されている制限事項を 満たさなければなりません。

特定のエレメント型プロシージャーがある総称プロシージャーには、特別な規則が適用されます。 これについては 総称名に対するプロシージャー参照の解決を参照してください。

例 1:

! Example of an elemental function
PROGRAM P
INTERFACE
  ELEMENTAL REAL FUNCTION LOGN(X,N)
     REAL, INTENT(IN) :: X
     INTEGER, INTENT(IN) :: N
  END FUNCTION LOGN
END INTERFACE
 
REAL RES(100), VAL(100,100)
  ...
DO I=1,100
   RES(I) = MAXVAL( LOGN(VAL(I,:),2) )
END DO
    ...
END PROGRAM P

例 2:

! Elemental procedure declared with a generic interface
INTERFACE RAND
   ELEMENTAL FUNCTION SCALAR_RAND(x)
     REAL, INTENT(IN) :: X
   END FUNCTION SCALAR_RAND
 
   FUNCTION VECTOR_RANDOM(x)
     REAL X(:)
     REAL VECTOR_RANDOM(SIZE(x))
   END FUNCTION VECTOR_RANDOM
END INTERFACE RAND
 
REAL A(10,10), AA(10,10)
 
! The actual argument AA is a two-dimensional array. The procedure
! taking AA as an argument is not declared in the interface block.
! The specific procedure SCALAR_RAND is then called.
 
A = RAND(AA)
 
 
! The actual argument is a one-dimensional array section. The procedure
! taking a one-dimensional array as an argument is declared in the
! interface block. The specific procedure VECTOR_RANDOM is then called.
! This is a non-elemental reference since VECTOR_RANDOM is not elemental.
 
A(:,1) = RAND(AA(6:10,2))
END

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

IBM Copyright 2003