参照結合と親子結合

参照結合によりモジュール内の要素を,他の有効域から参照することができます。参照結合の機構は USE 文です。USE 文は,ONLY が指定されていない限り,モジュール内のすべての公開要素への参照を提供します。ONLY が指定されていると,ONLY 並びで指定されている要素だけが参照可能になります。

親子結合により親有効域中の要素を,その親プログラムに含まれている内部手続,構造型定義,またはモジュール手続から参照することができます。参照先の要素は同じ名前で知られており,親プログラム内と同じ属性を持っています。手続に対して局所要素は,親プログラムからは参照できません。

参照結合と親子結合は,実行形式プログラムの実行全体を通して有効です。

参照結合によって参照される要素が親プログラム要素と同じ非総称名を持っている場合,親プログラム要素は参照不可能です。有効域で EXTERNAL 文中に外部名として現れる名前は大域名であり,これを非総称名として持っている親プログラム内の要素はすべて参照不可能です。

インタフェース本体は,親子結合によって名前付き要素を参照することはしませんが,参照結合によって要素を参照することはできます。

手続が親子結合によってポインタを参照する場合,ポインタと手続の呼び出しの時点での指示先との間の結合は,その手続中で有効となります。このポインタ結合は手続内で変更することができます。手続の実行後,ポインタ結合は,実行の結果として指示先が不定の状態にならない限り有効のまま残ります。指示先が不定の状態になると,親子結合されたポインタは不定となります。


注意:暗黙の宣言は親子結合にとって問題となることがあります。IMPLICIT NONE は,親プログラムとそれに含まれている手続の両方で使用し,すべての要素を明示的に宣言することをお勧めします。

すべての要素が明示的に宣言されていると,局所宣言は親プログラム宣言を無効にし,無効にされなかった親プログラム宣言は,含まれている手続中で使用可能となります。


次の例は,親子結合と参照結合を示しています。

	MODULE SHARE_DATA
	  REAL Y, Z
	END MODULE

	PROGRAM DEMO
	  USE SHARE_DATA	! SHARE_DATA のすべての要素は,
	  REAL B, Q		! 参照結合を通して利用可能です。
	  ...
	  CALL CONS (Y)
	CONTAINS
	  SUBROUTINE CONS (Y)	! Y は局所要素 (仮引数) です。
	    REAL C, Y
	    ...
	    Y = B + C + Q + Z	! B と Q は親子結合を通して利用可能です。
	    ...			! C は局所要素で明示的に宣言しています。
	  END SUBROUTINE CONS	! Z は参照結合を通して利用可能です。
	END PROGRAM DEMO

以下の例は,親プログラムと内部手続がどのように親子結合した言語要素を使うことができるかを示しています。

	program INTERNAL
	  ! 内部サブルーチンと CONTAINS 文の使用例
	  real a,b,c
	  call find
	  print *, c
	  contains
	    subroutine find
	      read *, a,b
	      c = sqrt(a**2 + b**2)
	    end subroutine find
	 end

この例では,変数 ab,および c が親子結合を通して内部サブルーチン find で利用可能になっています。これらは,内部手続に引数として渡される必要がありません。実際,そのようにした場合,それらはサブルーチンに対して局所変数となり,親プログラムで宣言された引数を隠します。

逆に,c を定義している内部サブルーチンから返された時,親プログラムは c の値を知ります。

関連情報