総称名の引用

有効域中で手続名は,以下のいずれかが真であれば総称名として確立されます。

総称名として確立された手続名の引用を解決する際には,以下の規則がこの順序で使用されます。

  1. その手続名を持つインタフェース宣言が以下のどちらかに含まれている場合,引用は,そのインタフェースを提供する個別手続に対して行われます。

    1. 引用を含んでいる有効域

    2. 有効域中で USE 文によって参照可能にされているモジュール

    引用は,インタフェース宣言の個別インタフェースの 1 つと一貫性を持っていなくてはなりません。

  2. 手続名が以下のいずれかで INTRINSIC 属性を付けて指定されている場合,引用はその組込み手続に対するものになります。

    1. 同じ有効域

    2. 有効域中で USE 文によって参照可能にされているモジュール

    引用は,その組込み手続のインタフェースと一貫性を持っていなくてはなりません。

  3. 以下の条件が満たされている場合,引用は,親有効域に規則 1 と 2 を適用することによって解決されます。

    1. 手続名は親有効域中で総称名として確立されている。

    2. 有効域と親有効域の間で,手続が関数名とサブルーチン名のどちらなのかという点に関する合意がある。

  4. 上記のどの規則も適用されない場合,引用はその名前を持つ総称組込み手続に対するものとなります。引用は,その組込み手続のインタフェースと一貫性を持っていなくてはなりません。

以下の例は,モジュールが 3 つの別々の手続を定義し,主プログラムがインタフェース宣言を通して総称名 DUP をそれらに与えている様子を示しています。主プログラムは総称名で 3 つすべてを呼び出していますが,引数が異なったデータ型を持ち,DUP がサブルーチンではなく関数であるため,曖昧さはありません。モジュール UN_MOD は,各手続に異なった名前を与えなければなりません。

	MODULE UN_MOD
	CONTAINS
	  subroutine dup1(x,y)
	    real x,y
	    print *, ' Real arguments', x, y
	  end subroutine dup1

	  subroutine dup2(m,n)
	    integer m,n
	    print *, ' Integer arguments', m, n
	  end subroutine dup2

	  character function dup3 (z)
	    character(len=2) z
	    dup3 = 'String argument '// z
	  end function dup3
	END MODULE

	program unclear
	! 総称手続引用の使い方を示します。

	  USE UN_MOD
	  INTERFACE DUP
	    MODULE PROCEDURE dup1, dup2, dup3
	  END INTERFACE

	  real a,b
	  integer c,d
	  character (len=2) state

	  a = 1.5
	  b = 2.32
	  c = 5
	  d = 47
	  state = 'WA'

	  call dup(a,b)
	  call dup(c,d)
	  print *, dup(state)	! 実際の出力は 'S' のみです。
	END

モジュール UN_MOD が関数結果に長さパラメタを指定していないため,関数 DUP3 は 1 文字を出力するのみであることに注意してください。

DUP に対して仮引数 xy が実数の代わりに整数で宣言された場合,DUP のどの呼び出しも曖昧になります。この場合,コンパイル・エラーが発生します。

サブルーチン定義,DUP1DUP2, および DUP3 は,異なった名前を持たなくてはなりません。総称名はインタフェース宣言の第 1 行で指定され,この例では DUP です。