関連付けは、同一の有効範囲単位内で同一のデータ項目を複数の異なる名前で識別する場合、または同一の実行可能プログラムの異なる有効範囲単位で、同一のデータ項目を同じ名前または複数の異なる名前で識別する場合に生じます。
ホスト関連付け を使用すれば、内部サブプログラム、モジュール・サブプログラム、または派生型定義からそのホスト内の名前付きエンティティーにアクセスできるようになります。アクセスされるエンティティーは、ホスト内のときと同じ属性を持ち、 (もしあれば) 同じ名前で識別されます。上記エンティティーには、オブジェクト、派生型定義、名前リスト・グループ、インターフェース・ブロックおよびプロシージャーなどが含まれます。
EXTERNAL 属性が指定されている名前はグローバル名です。この名前を非総称名として持つホスト有効範囲単位内のどのエンティティーにも、その名前およびホスト関連付けを使用してアクセスすることはできません。
ある有効範囲単位内で宣言または初期化が行われる場合、次に示すエンティティーはその有効範囲単位内でローカルとなります。
サブプログラムに対してローカルであるエンティティーは、ホスト有効範囲単位内ではアクセスできません。
次のような場合、DATA ステートメントの前にローカル・エンティティーの参照または定義を行うことはできません。
ホストの派生型名にアクセスできない場合でも、そのタイプの構造体またはそのような構造体のサブオブジェクトにはアクセス可能です。
サブプログラムがホスト関連付けを介してポインター (または複数ポインター) にアクセスすると、サブプログラムの呼び出し時に存在するポインター関連付けはサブプログラムに現行のまま残ります。このポインター関連付けは、サブプログラム内で変更してもかまいません。プロシージャーが実行を終了しても、ポインター関連付けは現行のまま残ります。ただし、これによってポインターが未定義になる場合は例外です。この場合、ホストに関連したポインターの関連付け状況は未定義となります。
インターフェース本体は、使用関連付けを介してエンティティーを使用することはできますが、ホスト関連付けを介して名前付きエンティティーを使用することはありません。
内部サブプログラムまたはモジュール・サブプログラムのホスト有効範囲単位には、同一の使用関連付けをもったエンティティーを指定することができます。
SUBROUTINE MYSUB TYPE DATES ! Define DATES INTEGER START INTEGER END END TYPE DATES CONTAINS INTEGER FUNCTION MYFUNC(PNAME) TYPE PLANTS TYPE (DATES) LIFESPAN ! Host association of DATES CHARACTER(10) SPECIES INTEGER PHOTOPER END TYPE PLANTS END FUNCTION MYFUNC END SUBROUTINE MYSUB
使用関連付け は、USE ステートメントによってモジュールのエンティティーにアクセスする際に生じます。使用に関連したエンティティーの名前を変更して、ローカルの有効範囲単位内で使用することが可能です。この関連付けは実行可能プログラムの実行時の間は有効です。詳細については、USEを参照してください。
MODULE M CONTAINS SUBROUTINE PRINTCHAR(X) CHARACTER(20) X PRINT *, X END SUBROUTINE END MODULE PROGRAM MAIN USE M ! Accesses public entities of module M CHARACTER(20) :: NAME='George' CALL PRINTCHAR(NAME) ! Calls PRINTCHAR from module M END
ポインターに関連したターゲットは、ポインターに対する参照によって、参照することができます。これをポインター関連付けと呼びます。
ポインターはすべて次のような関連付け状況となります。
ALLOCATE (P(3))
P => T
NULLIFY (P)
DEALLOCATE (P)
NULLIFY (Q); P => Q
POINTER P(:), Q(:) ALLOCATE (P(3)) Q => P DEALLOCATE (Q) ! Deallocate target of P through Q. ! P is now undefined. END
ポインターの定義状況は、そのターゲットの状況を示します。ポインターが定義可能なターゲットに関連している場合、そのポインターの定義状況は、変数の規則にしたがって定義または未定義状態にすることができます。
ポインターの関連付け状況が関連解除 (Disassociated) または未定義 (Undefined) の場合には、そのポインターを参照したり割り振りを解除できません。関連付け状況がどんな場合でも、ポインターは必ずヌル文字化され、割り振られるかまたはポインター割り当てをされます。ポインターが割り振られると、その定義状況は未定義になります。ポインターがポインター割り当てをされると、その関連付け状況および定義状況は、そのターゲットによって決められます。したがって、ポインターが定義されたターゲットに関連すると、そのポインターは定義された状態になります。
+----------------------------------IBM 拡張----------------------------------+
データ・オブジェクトに関連した整数ポインターを使用すると、データ・オブジェクトを参照することが可能になります。 これを整数ポインター関連付けと呼びます。
整数ポインター関連付けは、次のような状況でのみ生じます。
POINTER (P,A) P=LOC(B) ! A and B become associated
POINTER (P,A), (P,B) ! A and B are associated
POINTER (P,A), (Q,B) P=LOC(C) Q=LOC(C) ! A, B, and C become associated
POINTER (P,A) . . CALL SUB (P,B) . . SUBROUTINE SUB (P,X) POINTER (P,Y) P=LOC(X) ! Main program variables A ! and B become associated.
+--------------------------------IBM 拡張の終り-------------------------------+