有効域中で手続名は,以下のいずれかが真であれば総称名として確立されます。
有効域がその手続名を持つインタフェース宣言を含んでいる。
手続名が総称組込み手続の名前と一致し,その有効域中で INTRINSIC 属性を付けて指定されている。
手続名がモジュール内で総称名として確立されており,有効域がその手続名を参照可能にする USE 文を含んでいる。
有効域はその手続名の宣言を含んでいないが,親有効域でその手続名が総称名として確立されている。
総称名として確立された手続名の引用を解決する際には,以下の規則がこの順序で使用されます。
その手続名を持つインタフェース宣言が以下のどちらかに含まれている場合,引用は,そのインタフェースを提供する個別手続に対して行われます。
引用を含んでいる有効域
有効域中で USE 文によって参照可能にされているモジュール
引用は,インタフェース宣言の個別インタフェースの 1 つと一貫性を持っていなくてはなりません。
手続名が以下のいずれかで INTRINSIC 属性を付けて指定されている場合,引用はその組込み手続に対するものになります。
同じ有効域
有効域中で USE 文によって参照可能にされているモジュール
引用は,その組込み手続のインタフェースと一貫性を持っていなくてはなりません。
以下の条件が満たされている場合,引用は,親有効域に規則 1 と 2 を適用することによって解決されます。
手続名は親有効域中で総称名として確立されている。
有効域と親有効域の間で,手続が関数名とサブルーチン名のどちらなのかという点に関する合意がある。
上記のどの規則も適用されない場合,引用はその名前を持つ総称組込み手続に対するものとなります。引用は,その組込み手続のインタフェースと一貫性を持っていなくてはなりません。
例
以下の例は,モジュールが 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 に対して仮引数 x と y が実数の代わりに整数で宣言された場合,DUP のどの呼び出しも曖昧になります。この場合,コンパイル・エラーが発生します。
サブルーチン定義,DUP1,DUP2, および DUP3 は,異なった名前を持たなくてはなりません。総称名はインタフェース宣言の第 1 行で指定され,この例では DUP です。