ポインターの割り当てステートメントによって、ポインターがターゲットと関連させられます。また、ポインター割り当てステートメントによって、ポインターの関連付け状況は、関連のなくなった状態または未定義の状態にもなります。
>>-pointer_object-- => --target-------------------------------->< |
pointer_object は、POINTER 属性を持たなければなりません。
式であるターゲットによって、POINTER 属性を持つ値が得られなければなりません。変数であるターゲットは、TARGET 属性 (またはそのようなオブジェクトの対象となるもの) あるいは、変数であるターゲットは、POINTER 属性を持たなければなりません。ターゲットは、ベクトル添え字を持つ配列セクションであってはなりません。また、整数の想定サイズ配列であってはなりません。
関連解除された配列ポインターのターゲットのサイズ、境界、および形状は未定義です。こうした配列の一部を定義したり、参照したりはできません。ただし、配列を、関連付け状況、引き数の有無、タイプまたは型付きパラメーターの特性を参照する組み込み照会関数の引き数にすることはできます。
+----------------------------------IBM 拡張----------------------------------+
バイト・タイプのポインターは、バイト・タイプ、INTEGER(1) タイプ、 LOGICAL(1) タイプのターゲットにのみ関連させることができます。
+--------------------------------IBM 拡張の終り-------------------------------+
pointer_object とターゲット間での以前の関連付けはすべて無効にされます。 target がポインターでない場合、pointer_object は、target と関連付けられます。 target 自体がポインターに関連させられる場合、pointer_object は target のターゲットに関連させられます。 target が関連解除または未定義の状態の関連付け状況を持つポインターの場合、pointer_object は同様の状態となります。ポインター割り当ての target が割り振り可能なオブジェクトである場合は、割り振り済みでなければなりません。
ポインター構造体コンポーネントのポインター割り当ては、派生型の組み込み割り当てステートメントまたは定義済み割り当てステートメントの実行によって発生します。
配列ポインターの割り当て時、各次元の下限は、ターゲットの対応する次元に適用される LBOUND 組み込み関数の結果となります。全体配列でも構造体コンポーネントでもない配列セクションや配列式の場合、下限は 1 になります。各次元の上限は、ターゲットの対応する次元に適用される UBOUND 組み込み関数の結果となります。
関連情報:
TYPE T INTEGER, POINTER :: COMP_PTR ENDTYPE T TYPE(T) T_VAR INTEGER, POINTER :: P,Q,R INTEGER, POINTER :: ARR(:) BYTE, POINTER :: BYTE_PTR LOGICAL(1), POINTER :: LOG_PTR INTEGER, TARGET :: MYVAR INTEGER, TARGET :: DARG(1:5) P => MYVAR ! P points to MYVAR Q => P ! Q points to MYVAR NULLIFY (R) ! R is disassociated Q => R ! Q is disassociated T_VAR = T(P) ! T_VAR%COMP_PTR points to MYVAR ARR => DARG(1:3) BYTE_PTR => LOG_PTR END
+----------------------------------IBM 拡張----------------------------------+
整数ポインター変数は、次のことができます。
XL Fortran コンパイラーは、割り当てステートメント内の整数ポインターに対して、 1 バイトの算術を使用することに注意してください。
INTEGER INT_TEMPLATE POINTER (P,INT_TEMPLATE) INTEGER MY_ARRAY(10) DATA MY_ARRAY/1,2,3,4,5,6,7,8,9,10/ INTEGER, PARAMETER :: WORDSIZE=4 P = LOC(MY_ARRAY) PRINT *, INT_TEMPLATE ! Prints '1' P = P + 4; ! Add 4 to reach next element ! because arithmetic is byte-based PRINT *, INT_TEMPLATE ! Prints '2' P = LOC(MY_ARRAY) DO I = 1,10 PRINT *,INT_TEMPLATE P = P + WORDSIZE ! Parameterized arithmetic is suggested END DO END
+--------------------------------IBM 拡張の終り-------------------------------+