Assignment (=) - ユーザー定義代入

:インタフェース宣言を使って,総称代入を定義することができます。このようなインタフェース宣言中で使用できる手続は,ユーザー定義代入として引用できるサブルーチンに限られます。

このようなインタフェース宣言の最初の行は次の形式を取ります。

形式

INTERFACE ASSIGNMENT(=)

インタフェース宣言中のサブルーチンは,2 つの省略できない引数を持たなくてはなりません。第 1 の引数は OUT または INOUTINTENT を持ち,第 2 の引数は ININTENT を持たなくてはなりません。

ユーザー定義代入は,サブルーチンの引用として扱われます。代入の左辺は,サブルーチンの第 1 仮引数に対応します。代入の右辺は,第 2 引数に対応します。

ASSIGNMENT キーワードは,等号の両辺が同じ構造型である場合,代入演算を拡張または再定義します。

ユーザー定義要素別処理代入は,SUBROUTINE 文中で ELEMENTAL を宣言することによって指定します。

総称代入が関わるすべての手続引用は,1 つの固有手続に対して解決可能でなくてはなりません。つまり,曖昧であってはなりません。詳細については,「総称手続の一義的な引用」を参照してください。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

INTERFACE代入文

次に,代入を定義する手続インタフェース宣言の例を示します。

	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'

以下に他の例を示します。

	! サークル・データをインターバル・データに変換
	module mod1
		TYPE CIRCLE
			REAL radius, center_point(2)
		END TYPE CIRCLE
		TYPE INTERVAL
			REAL lower_bound, upper_bound
		END TYPE INTERVAL
		CONTAINS
		SUBROUTINE circle_to_interval(I,C)
			type (interval),INTENT(OUT)::I
			type (circle),INTENT(IN)::C
			! 円の中心を x=-axis に投影します。
			! 注意:インターバルの長さは円の直径です。
			I%lower_bound = C%center_point(1) - C%radius
			I%upper_bound = C%center_point(1) + C%radius
		END SUBROUTINE circle_to_interval
	end module mod1

	PROGRAM assign
		use mod1
		TYPE(CIRCLE) circle1
		TYPE(INTERVAL) interval1
		INTERFACE ASSIGNMENT(=)
			module procedure circle_to_interval
		END INTERFACE
	!	プログラムの実行部分を開始します。
		circle1%radius = 2.5
		circle1%center_point = (/3.0,5.0/)
		interval1 = circle1
		. . .
	END PROGRAM