ポインターの再定義

ポインター・データ項目やプロシージャー・ポインター・データ項目は、REDEFINES 文節の主語 (サブジェクト) にすることも目的語 (オブジェクト) にすることもできます。

ポインターが REDEFINES 文節のサブジェクトである場合は、そのオブジェクト・データ項目は 16 バイト境界になければなりません。 たとえば、以下の場合、

 
 WORKING-STORAGE SECTION.
  01  AB.
      05 ALPHA-NUM PIC X(16).
      05 APTR REDEFINES ALPHA-NUM USAGE POINTER.
      05 BPTR  USAGE POINTER.
      05 CPTR REDEFINES BPTR USAGE POINTER.

上記の例では、APTR と CPTR は、いずれも 16 バイト位置合わせがなされている項目を再定義するポインター・データ項目です。 次の例では、再定義された項目によって重大なコンパイラー・エラーになります。

 
 WORKING-STORAGE SECTION.
  01  EF.
      05 ALPHA-NUM PIC X(5).
      05 HI.
         10 ALPHA-NUM-TWO PIC X(11).
         10 APTR  USAGE POINTER.
      05 BPTR REDEFINES HI USAGE POINTER.

上記の例では、APTR が 16 バイトの境界に位置合わせされます。 したがって、ILE COBOL コンパイラーが FILLER 項目を追加して APTR を位置合わせする必要はありません。 グループ項目 HI は 16 バイト境界にないので、ポインター・データ項目 BPTR も 16 バイト境界にはなりません。 ILE COBOL コンパイラーが FILLER 項目を追加して BPTR を 16 バイトの境界にすることができないため、重大エラーになります。

次の例は上記の例と似ていますが、ILE COBOL コンパイラーはポインター・データ項目を 16 バイト境界にすることができます。

 
 WORKING-STORAGE SECTION.
  01  EF.
      05 ALPHA-NUM PIC X(5).
      05 HI.
         10 ALPHA-NUM-TWO PIC X(11).
         10 APTR  USAGE POINTER.
         10 ALPHA-NUM-THREE PIC X(5).
      05 KL REDEFINES HI.
         10 BPTR USAGE POINTER.

この例では、グループ項目 KL は 16 バイト境界になりませんが、 コンパイラーは 11 バイトの FILLER をポインター・データ項目 BPTR の前に追加することによって、BPTR が 16 バイト境界になるようにします。