インタフェース宣言を使って,総称代入を定義することができます。このようなインタフェース宣言中で使用できる手続は,ユーザー定義代入として引用できるサブルーチンに限られます。
このようなインタフェース宣言の最初の行は次の形式を取ります。
INTERFACE ASSIGNMENT (=)
インタフェース宣言中のサブルーチンは,2 つの省略できない引数を持たなくてはなりません。第 1 の引数は OUT または INOUT の INTENT を持ち,第 2 の引数は IN の INTENT を持たなくてはなりません。
ユーザー定義代入は,サブルーチンの引用として扱われます。代入の左辺は,サブルーチンの第 1 仮引数に対応します。代入の右辺は,第 2 引数に対応します。
ASSIGNMENT キーワードは,等号の両辺が同じ構造型である場合,代入演算を拡張または再定義します。
ユーザー定義要素別処理代入は,SUBROUTINE 文中で ELEMENTAL を宣言することによって指定します。
総称代入が関わるすべての手続引用は,1 つの固有手続に対して解決可能でなくてはなりません。つまり,曖昧であってはなりません。詳細については,「総称手続の一義的な引用」を参照してください。
次に,代入を定義する手続インタフェース宣言の例を示します。
INTERFACE ASSIGNMENT (=) SUBROUTINE BIT_TO_NUMERIC (NUM, BIT) INTEGER, INTENT(OUT) :: NUM LOGICAL, INTENT(IN) :: BIT(:) END SUBROUTINE BIT_TO_NUMERIC SUBROUTINE CHAR_TO_STRING (STR, CHAR) USE STRING_MODULE ! 型 STRING を定義 TYPE(STRING), INTENT(OUT) :: STR ! 可変長文字列 CHARACTER(*), INTENT(IN) :: CHAR END SUBROUTINE CHAR_TO_STRING END INTERFACE
次の例は,サブルーチン BIT_TO_NUMERIC を引用する 2 つの等価な方法を示しています。
CALL BIT_TO_NUMERIC(X, (NUM(I:J))) X = NUM(I:J)
次の例は,サブルーチン CHAR_TO_STRING を引用する 2 つの等価な方法を示しています。
CALL CHAR_TO_STRING(CH, '432C') CH = '432C'
関連情報