MOVE ステートメントを使用して基本ポインターを移動することはできません。 この場合は、SET ステートメントを使用しなければなりません。 しかし、ポインターがグループ項目の一部のときは、暗黙のうちに移動されます。
MOVE ステートメントのコンパイル時に、ILE COBOL コンパイラーは、グループ項目にポインターを保持するコード (ポインター MOVE) か、保持しないコード (非ポインター MOVE) を生成します。
次のすべての条件を満たす場合、ポインター MOVE が実行されます。
上記の条件下では、2 つのデータ項目が適切に位置合わせされているかどうかを判別することが、非常に難しくなることがあります。
ポインター MOVE を行うには、項目は、16 バイト境界に対するオフセットが同じでなければなりません。 (これが真でない場合は警告が出されます。)
次の例は、3 つのデータ構造があって、MOVE ステートメントが出された場合の結果を示すものです。
WORKING-STORAGE SECTION. 01 A. 05 B PIC X(10). 05 C. 10 D PIC X(6). 10 E POINTER. 01 A2. 05 B2 PIC X(6). 05 C2. 10 D2 PIC X(10). 10 E2 POINTER. 01 A3. 05 B3 PIC X(22). 05 C3. 10 D3 PIC X(10). 10 E3 POINTER. PROCEDURE DIVISION. MOVE A to A2. 1 MOVE A to A3. 1 MOVE C to C2. 2 MOVE C2 to C3. 3
グループ項目中にポインターが含まれていて、ILE COBOL コンパイラーが 16 バイト境界に対するオフセットを判別できない場合は、ILE COBOL コンパイラーは警告メッセージを出し、ポインターの移動が試行されます。 しかし、ポインターの整合性は維持されないことがあります。 LINKAGE SECTION の中で項目が定義されている場合、または認識されていない開始位置で項目が参照変更されている場合は、ILE COBOL コンパイラーはオフセットを判別できません。 ポインターの位置合わせは必ず維持しなければなりません。 そうしないと、マシン・チェック・エラーが起こることがあります。
ILE COBOL コンパイラーは、01 レベルの項目と 77 レベルの項目のすべてを、ポインターの有無に関係なく 16 バイト境界にします。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.