OPTIONAL

文と属性:手続引用で仮引数を省略できるようになります。

OPTIONAL 属性は型宣言文または OPTIONAL 文で指定することができ,以下のいずれかの形式を取ります。

形式

型宣言文

type, [att-ls,] OPTIONAL [,att-ls] :: d-arg [,d-arg]...

OPTIONAL [::] d-arg [,d-arg]...

type
データ型指定子。

att-ls
省略可能な属性指定子並び。

d-arg
仮引数の名前。

規則と振る舞い

OPTIONAL 属性は,副プログラムまたはインタフェース宣言の有効域でしか指定することができず,仮引数に対してしか指定できません。

仮引数は,実引数に結合されているときに「実在」しています。省略不可な仮引数が必ず実在していなくてはなりません。PRESENT 組込み関数を使うと,省略可能な仮引数が実引数に結合されているかどうかを調べることができます。

省略可能引数を持つ手続を呼び出すためには,明示的なインタフェースを使用する必要があります。

引数キーワードが使われない場合,引数結合は場所で行われます。第 1 仮引数は,第 1 実引数と結合されます。以下同様に結合されます。引数キーワードが使われる場合,引数はキーワード名で結合されます。そのため,実引数を仮引数とは異なる順番で置くことができます。前にある省略可能引数が指定されていない,または引数列が変更される場合のみ,キーワードが引数に必要となります。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

PRESENT型宣言組込み手続における引数キーワード省略可能引数属性の互換性引数結合

次の例は,OPTIONAL 属性を指定する型宣言文を示しています。

	SUBROUTINE TEST(A)
	  REAL, OPTIONAL, DIMENSION(-10:2) :: A
	END SUBROUTINE

次に OPTIONAL 文の例を示します。

	SUBROUTINE TEST(A, B, L, X)
	  OPTIONAL :: B
	  INTEGER A, B, L, X

	  IF (PRESENT(B)) THEN		! B が存在するときのみ,
	    PRINT *, A, B, L, X		! B を印字します。
	  ELSE
	    PRINT *, A, L, X
	  ENDIF
	END SUBROUTINE

	INTERFACE
	  SUBROUTINE TEST(ONE, TWO, THREE, FOUR)
	    INTEGER ONE, TWO, THREE, FOUR
	    OPTIONAL :: TWO
	  END SUBROUTINE
	END INTERFACE

	INTEGER I, J, K, L

	I = 1
	J = 2
	K = 3
	L = 4

	CALL TEST(I, J, K, L)			! 1  2  3  4 を印字
	CALL TEST(I, THREE=K, FOUR=L)		! 1  3  4 を印字
	END

サブルーチン TEST への第 2 の呼び出しで,2 番目の引数 (省略可能) が省略されていることに注目してください。この場合,この後に続く引数はすべてキーワード引数でなくてはなりません。

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

	SUBROUTINE ADD (a,b,c,d)
	  REAL              a, b, d
	  REAL, OPTIONAL :: c

	  IF (PRESENT(c)) THEN
	    d = a + b + c + d
	  ELSE
	    d = a + b + d
	  END IF
	END SUBROUTINE

以下の例を考えます。

	SUBROUTINE EX (a, b, c)
	REAL, OPTIONAL :: b,c

このサブルーチンは,次の文のどれでも呼び出すことができます。

	CALL EX (x, y, z)		! 全引数を渡します。

	CALL EX (x)			! 第 1 引数のみを渡します。

	CALL EX (x, c=z)		! 第 1 省略可能引数が省略されています。

以下の例のように,省略した省略可能引数を示すために一連のコンマを使うことはできないことに注意してください。

	CALL EX (x,,z)			! 無効な文

これは,コンパイル・エラーを引き起こします。