総称インターフェース・ブロック

定義された総称インターフェース・ブロックは、INTERFACE ステートメントに総称名、 定義済み演算子、または定義済み割り当てを指定する必要があります。 総称名は単一名で、その名前を 使用することによりインターフェース・ブロックで指定されている すべてのプロシージャーを参照することができます。 総称名は、アクセス可能な総称名、またはインターフェース・ブロック内の プロシージャー名のどれかと同じ可能性があります。

ある有効範囲単位内でアクセス可能な複数の総称インターフェースが 同じローカル名を持っている場合、それらの総称インターフェースは単一の 総称インターフェースと解釈されます。

明白な総称プロシージャー参照

総称プロシージャー参照がなされるとき、 特定のプロシージャーが 1 つだけ呼び出されます。 次の規則に従えば、総称参照は明白となります。

同一の有効範囲単位内にある 2 つのプロシージャーが共に、 割り当てを定義しているか、定義済みの演算子および同数の引き数を持っている場合、 異なる型、kind 型付きパラメーター、またはランクを持つ仮引き数に 引き数リスト内の位置で対応するもう 1 つの仮引き数を指定しなければなりません。

1 つの有効範囲単位内では、同じ総称名を持つ 2 つのプロシージャーは、 両方ともサブルーチンであるか、または両方とも関数でなければなりません。 また、2 つのうちの少なくとも 1 つに、次の両方の条件を満たす、オプションではない仮引き数が必要です。

  1. 他のサブプログラムの引き数リストにない仮引き数か、あるいは異なる型、異なる kind 型付きパラメーター、 または異なるランクを持つ仮引き数と、引き数リスト内の位置が対応するもの。
  2. 他の引き数リストにない仮引き数か、あるいは異なる型、異なる kind 型付きパラメーター、 または異なるランクを持つ仮引き数と、引き数キーワードが対応するもの。

インターフェース・ブロックが組み込みプロシージャーを拡張する場合 (次の節を参照)、 その組み込みプロシージャーが特定のプロシージャーの集合 (使用できる引き数の集合ごとに 1 つのプロシージャー) から構成されている場合と同様に、 前述の規則が適用されます。

+----------------------------------IBM 拡張----------------------------------+

注:

  1. BYTE 型の仮引き数の型と、INTEGER(1)LOGICAL(1)、および文字型の 対応する 1 バイトの仮引き数の型は同じであると見なされます。

  2. -qintlog コンパイラー・オプションを指定すると、整数型および論理型の仮引き数の型と、 同じ kind 型付きパラメーターを持つ整数型および論理型の対応する仮引き数の型は同じであると 見なされます。

  3. インターフェース本体内の EXTERNAL 属性を指定して仮引き数の宣言のみを行う場合、 その仮引き数は、位置と引き数キーワードがプロシージャーに対応する唯一の仮引き数でなければなりません。

+------------------------------End of IBM 拡張-------------------------------+

総称インターフェース・ブロックの例

PROGRAM MAIN
INTERFACE A
  FUNCTION AI(X)
    INTEGER AI, X
  END FUNCTION AI
END INTERFACE
INTERFACE A
  FUNCTION AR(X)
    REAL AR, X
  END FUNCTION AR
END INTERFACE
INTERFACE FUNC
  FUNCTION FUNC1(I, EXT)      ! Here, EXT is a procedure
    INTEGER I
    EXTERNAL EXT
  END FUNCTION FUNC1
  FUNCTION FUNC2(EXT, I)
    INTEGER I
    REAL EXT                  ! Here, EXT is a variable
  END FUNCTION FUNC2
END INTERFACE
EXTERNAL MYFUNC
IRESULT=A(INTVAL)             ! Call to function AI
RRESULT=A(REALVAL)            ! Call to function AR
RESULT=FUNC(1,MYFUNC)         ! Call to function FUNC1
      END PROGRAM MAIN

総称インターフェース・ブロックによる 組み込みプロシージャーの拡張

総称組み込みプロシージャーは拡張または再定義することが可能です。 拡張された組み込みプロシージャーは、既存の特定組み込みプロシージャーを 補足します。 再定義された組み込みプロシージャーは、既存の特定組み込みプロシージャーと 入れ替わります。

総称名と総称組み込みプロシージャー名が同じで、 その名前が INTRINSIC 属性を持っている場合 (または 組み込みコンテキストに指定されている場合)、総称インターフェースは 総称組み込みプロシージャーの拡張を行います。

総称名と総称組み込みプロシージャー名は同じでも、 その名前が INTRINSIC 属性を持っていない場合 (または 組み込みコンテキストに指定されていない場合)、総称インターフェースは 総称組み込みプロシージャーの再定義を行うことがきます。

総称インターフェース名が INTRINSIC 属性を持っている 場合 (またはコンテキストに指定されている場合)、総称インターフェース名と 特定の組み込みプロシージャー名は同じになることはありません。

組み込みプロシージャーの拡張および再定義の例

      PROGRAM MAIN
      INTRINSIC MAX
      INTERFACE MAX              ! Extension to intrinsic MAX
        FUNCTION MAXCHAR(STRING)
          CHARACTER(50) STRING
        END FUNCTION MAXCHAR
      END INTERFACE
      INTERFACE ABS              ! Redefines generic ABS as
        FUNCTION MYABS(ARG)      !   ABS does not appear in
          REAL(8) MYABS, ARG     !   an INTRINSIC statement
        END FUNCTION MYABS
      END INTERFACE
      REAL(8) DARG, DANS
      REAL(4) RANS
      INTEGER IANS,IARG
      CHARACTER(50) NAME
      DANS = ABS(DARG)           ! Calls external MYABS
      IANS = ABS(IARG)           ! Calls intrinsic IABS
      DANS = DABS(DARG)          ! Calls intrinsic DABS
      IANS = MAX(NAME)           ! Calls external MAXCHAR
      RANS = MAX(1.0,2.0)        ! Calls intrinsic AMAX1
      END PROGRAM MAIN

定義済み演算子

定義済み演算子とは、ユーザー定義の単項演算子、2 進演算子、または 拡張組み込み演算子のことです (拡張組み込みおよび定義済み演算を参照)。 定義済み演算子は、関数および総称インターフェース・ブロックの 両方で定義してください。

  1. 単項演算 op x1 は、次のように定義します。
    1. 正確に 1 つの仮引き数 d1 を指定する関数または入り口がなければなりません。
    2. INTERFACE ステートメント内の generic_spec で、OPERATOR (op) を指定します。
    3. x1 の型を、仮引き数 d1 の型と 同じにします。
    4. x1 に型付きパラメーターがある場合は、d1 の型付きパラメーターと一致させる必要があります。
    5. 以下を確認します。
      • 関数が ELEMENTAL である。または
      • x1 が配列の場合、そのランクおよび形状が d1 のランクおよび形状と一致している。
  2. 2 進演算 x1 op x2 は、次のように定義します。
    1. 2 つの仮引き数 d1 および d2 を指定する FUNCTION または ENTRY ステートメントで関数を指定します。
    2. INTERFACE ブロック内の generic_spec で、OPERATOR (op) を指定します。
    3. x1 および x2 の型を、それぞれ 仮引き数 d1 および d2 の型と同じにします。
    4. x1 および x2 の型付きパラメーターがある場合は、 それぞれ d1 および d2 の型付きパラメーターと一致させる必要があります。
    5. 以下を確認します。
      • 関数が ELEMENTAL で、x1x2 がこれに従ったものになっている。 または
      • x1x2 のどちらか一方または両方が配列である場合、そのランクおよび形状が それぞれ d1d2 のランクおよび形状と一致している。
  3. op が組み込み演算子である場合、x1 または x2 のいずれかの 型あるいはランクは、組み込み演算子に必要な形またはランクではありません。
  4. generic_spec は、引き数のない関数または 2 つ以上の引き数が ある関数に対して OPERATOR を指定することはできません。
  5. 各引き数は必須です。
  6. 引き数は INTENT(IN) で指定してください。
  7. インターフェース・ブロック内で指定されたそれぞれの関数は、 想定文字長の結果を保持できません。
  8. 指定された演算子が組み込み演算子の場合、その関数の引き数の数は その演算子の組み込み使用数と一致する必要があります。
  9. 指定された定義済み演算子は、総称名とともに、複数の関数に適用されます。 その場合、それはまさに総称プロシージャー名のような総称となります。 組み込み演算子記号の場合、その総称特性には、組み込み演算子記号が 表す組み込み演算が含まれます。

    +----------------------------------IBM 拡張----------------------------------+

  10. 次の規則は、拡張組み込み演算だけに適用するものです。
    1. 引き数の型の 1 つが BYTE 型であるなら、そのとき 異なる引き数の型は派生型となります。
    2. -qintlog コンパイラー・オプションが非文字演算として 指定されていて、d1 が数値または論理である場合、 d2 は数値または論理にしないでください。
    3. -qctyplss コンパイラー・オプションが非文字演算として 指定されていて、x1 が数値または論理で、x2 が 文字定数の場合は、組み込み演算が実行されます。

    +------------------------------End of IBM 拡張-------------------------------+

定義済み演算子の例

INTERFACE OPERATOR (.DETERMINANT.)
   FUNCTION IDETERMINANT (ARRAY)
    INTEGER, INTENT(IN), DIMENSION (:,:) :: ARRAY
     INTEGER IDETERMINANT
  END FUNCTION
 END INTERFACE
END

定義済み割り当て

定義済み割り当ては、サブルーチンへの参照と見なされます。左側を最初の 引き数とし、右側を 2 番目の引き数として括弧で囲まれます。

  1. 定義済み割り当て x1 = x2 は 次のように定義します。
    1. 2 つの仮引き数 d1 および d2 を指定する SUBROUTINE または ENTRY ステートメントでサブルーチンを指定します。
    2. インターフェース・ブロックの generic_spec により、 ASSIGNMENT (=) を指定します。
    3. x1 および x2 の型を、それぞれ 仮引き数 d1 および d2 の型と同じにします。
    4. x1 および x2 の型付きパラメーターがある場合は、 それぞれ d1 および d2 の型付きパラメーターと一致させる必要があります。
    5. 以下を確認します。
      • サブルーチンが ELEMENTAL で、x1x2 が 同じ形状で、x2 がスカラーであるか、または
      • x1x2 のどちらか一方または両方が配列である場合、そのランクおよび形状が、 それぞれ d1d2 のランクおよび形状に一致している。
  2. ASSIGNMENT は、2 つの引き数を持つサブルーチンにのみ 使用してください。
  3. 各引き数は必須です。
  4. 最初の引き数は、INTENT(OUT) または INTENT(INOUT) の いずれかで、2 番目の引き数は INTENT(IN) とすべきです。
  5. 引き数の型は、両方とも数値、両方とも論理、 つまり両方とも同じ種類のパラメーターを持つ文字にしないでください。

    +----------------------------------IBM 拡張----------------------------------+

    引き数の型の 1 つが BYTE 型であるなら、そのとき 異なる引き数の型は派生型となります。

    -qintlog コンパイラー・オプションが 指定されていて、d1 が数値または論理である場合、 d2 は数値または論理にしないでください。

    -qctyplss コンパイラー・オプションが 指定されていて、x1 が数値または論理で、x2 が 文字定数の場合は、組み込み割り当てが実行されます。

    +------------------------------End of IBM 拡張-------------------------------+

  6. ASSIGNMENT 総称仕様は、等号の左右両辺が同じ派生型である場合に、 割り当て演算を拡張または再定義することを指定します。

定義済み割り当ての例

INTERFACE ASSIGNMENT(=)
  SUBROUTINE BIT_TO_NUMERIC (N,B)
    INTEGER, INTENT(OUT) :: N
    LOGICAL, INTENT(IN), DIMENSION(:) :: B
  END SUBROUTINE
END INTERFACE
IBM Copyright 2003