引数結合

手続が実行形式プログラムで引用されるとき,手続を呼び出すプログラム単位は,1 つまたは複数の引数を使って,手続の引数に値を渡すことができます。仮引数は,制御が副プログラムに渡った時点で,対応する実引数に結合されます。

一般に,制御が呼び出し側プログラム単位に返されると,仮引数に割り付けられた最後の値が,対応する実引数に割り付けられます。

実引数としては,変数,式,または手続名を使用することができます。実引数の型,種別パラメタ,および次元数は,それに結合された仮引数と一致していなくてはなりません。

仮引数は,仮データ・オブジェクト,仮手続,または選択戻り指定子 (*) です。選択戻り指定子を除き,仮引数は省略可能です。

引数キーワードが使用されていない場合,引数結合は位置によって行われます。最初の仮引数が最初の実引数に結合され,それ以降の引数も順番に結合されていきます。引数キーワードが使用されている場合,引数はキーワード名によって結合されるので,実引数は仮引数と異なる順序で並べられていてもかまいません。

引数のキーワードが必須なのは,直前の省略可能引数が省略されている場合か,引数列が変更される場合に限られます。

スカラ仮引数はスカラ実引数としか結合されません。

仮引数が配列である場合,実引数の配列よりも大きい大きさであってはなりません。整合配列を使うと,1 つの副プログラムで異なる大きさの配列を処理することができます。

副プログラムとして引用されている仮引数は,呼び出し側ルーチンで EXTERNAL または INTRINSIC として宣言された実引数と結合されなくてはなりません。

スカラ仮引数が文字型の場合,その文字長は,結合された実引数の文字長より大きくてはなりません。

文字型仮引数の文字長が *(*) として指定されている場合 (引継ぎ文字長),結合されている実引数の文字長が使用されます。

いったん実引数が仮引数に結合されると,仮引数を通して間接的に行われる場合を除き,実引数の値や利用可能性に影響を与える動作は実行できません。たとえば,次の文が指定されているとします。

	CALL SUB_A (B(2:6), B(4:10))

B(4:6) は両方の仮引数に結合されているので,どちらの仮引数を通しても定義や再定義を行ったり,不定の状態にすることはできません。ただし,B(2:3) は第 1 の引数を通して定義可能であり,B(7:10) は第 2 の引数を通して定義可能です。

同じように,実引数のいずれかの部分が仮引数を通して定義されている場合,手続の実行中,実引数はその仮引数を通してしか引用できません。たとえば,以下の文が指定されているとします。

	MODULE MOD_A
	  REAL :: A, B, C, D
	END MODULE MOD_A

	PROGRAM TEST
	  USE MOD_A
	  CALL SUB_1 (B)
	  ...
	END PROGRAM TEST

	SUBROUTINE SUB_1 (F)
	  USE MOD_A
	  ...
	  WRITE (*,*) F
	END SUBROUTINE SUB_1 

変数 B は,仮引数 F を通して定義されているため,SUB_1 の実行中は直接には引用できません。しかし,BF を通して間接的に引用することができます (また,SUB_1 が実行を完了したら,直接に引用することができます)。

以下の項では,引数についてさらに詳しく説明します。

関連情報