MOVE ステートメントでのポインターの使用

MOVE ステートメントを使用して基本ポインターを移動することはできません。 この場合は、SET ステートメントを使用しなければなりません。 しかし、ポインターがグループ項目の一部のときは、暗黙のうちに移動されます。

MOVE ステートメントのコンパイル時に、ILE COBOL コンパイラーは、グループ項目にポインターを保持するコード (ポインター MOVE) か、保持しないコード (非ポインター MOVE) を生成します。

次のすべての条件を満たす場合、ポインター MOVE が実行されます。

  1. MOVE ステートメントのソースまたは受け取り側にポインターが含まれている。
  2. 両方の項目の長さが 16 バイト以上である。
  3. データ項目が適切に位置合わせされている。
  4. データ項目が英数字かグループ項目である。

上記の条件下では、2 つのデータ項目が適切に位置合わせされているかどうかを判別することが、非常に難しくなることがあります。

注:
SET ステートメントを使用してポインターを転送するより、ポインター MOVE を使用する方が速度は遅くなります。

ポインター MOVE を行うには、項目は、16 バイト境界に対するオフセットが同じでなければなりません。 (これが真でない場合は警告が出されます。)

次の例は、3 つのデータ構造があって、MOVE ステートメントが出された場合の結果を示すものです。

図 81. 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 
 1 
移動される各グループ項目のオフセットはゼロなので、この結果はポインター MOVE になります。 ポインターの整合性は維持されます。
 2 
オフセットが一致していないので、この結果は非ポインター MOVE になります。 グループ項目 C のオフセットは 10、グループ項目 C2 のオフセットは 6 です。 ポインターの整合性は維持されません。
 3 
グループ項目 C2 のオフセットが 6 で、16 バイト境界に関する C3 のオフセットも 6 なので、 この結果はポインター MOVE になります。(オフセットが 16 より大きい場合は、16 バイト境界に対するオフセットは、 オフセットを 16 で割って計算します。 その余りが相対オフセットになります。 この場合はオフセットが 22 なので、16 で割った余りの 6 が相対オフセットになります。) ポインターの整合性は維持されます。

グループ項目中にポインターが含まれていて、ILE COBOL コンパイラーが 16 バイト境界に対するオフセットを判別できない場合は、ILE COBOL コンパイラーは警告メッセージを出し、ポインターの移動が試行されます。 しかし、ポインターの整合性は維持されないことがあります。 LINKAGE SECTION の中で項目が定義されている場合、または認識されていない開始位置で項目が参照変更されている場合は、ILE COBOL コンパイラーはオフセットを判別できません。 ポインターの位置合わせは必ず維持しなければなりません。 そうしないと、マシン・チェック・エラーが起こることがあります。

ILE COBOL コンパイラーは、01 レベルの項目と 77 レベルの項目のすべてを、ポインターの有無に関係なく 16 バイト境界にします。