XL Fortran for AIX V8.1.1

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


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

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

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

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

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

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

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

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

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

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

注:

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

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

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

+--------------------------------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 が文字定数の場合は、組み込み演算が実行されます。

    +--------------------------------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 が文字定数の場合は、組み込み割り当てが実行されます。

    +--------------------------------IBM 拡張の終り-------------------------------+

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

定義済み割り当ての例

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


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