ポインターの位置合わせ

ポインターは、任意のレベル (88 を除く) のプログラムの FILE SECTION、 WORKING-STORAGE SECTION、または LINKAGE SECTION に定義できます。

ポインターが iSeries サーバーで参照される場合、16 バイトのストレージ境界になければなりません。 ポインターの位置合わせは、ILE COBOL コンパイラーによって、グループ項目中のポインター項目の位置を、レコードの先頭から 16 バイトの倍数のオフセットにする処理のことです。 ポインター項目が 16 バイトの境界にない場合は、ポインター位置合わせ例外が ILE COBOL プログラムに送られます。 通常、ポインター位置合わせ例外は LINKAGE セクションで発生します。 そこでの位置合わせは、ユーザーが行うことになります。

FILE SECTION と WORKING-STORAGE SECTION では、コンパイラーは暗黙の FILLER 項目を追加することにより、 この例外が起こらないようにします。 コンパイラーが暗黙の FILLER 項目を追加すると、警告が出されます。 LINKAGE SECTION では、コンパイラーが暗黙の FILLER 項目を追加することはありません。 しかし、FILE SECTION または WORKING-STORAGE SECTION にグループ項目が検出されたとしたら何バイトの FILLER が追加されることになるかを示す警告が出されます。

以下の例のように、USAGE IS POINTER 文節または USAGE IS PROCEDURE-POINTER 文節を指定することで、データ項目をポインターとして定義することができます。

 
 ID DIVISION.
 PROGRAM-ID. PROGA.
 WORKING-STORAGE SECTION.
  77  APTR USAGE POINTER.
  77  APROC-PTR USAGE PROCEDURE-POINTER.
  01  AB.
      05 BPTR  USAGE POINTER.
      05 BVAR  PIC S9(3) PACKED-DECIMAL.
 LINKAGE SECTION.
 01  AVAR.
     05 CVAR  PIC X(30).
 PROCEDURE DIVISION.
      SET APTR TO ADDRESS OF AVAR.
      SET APROC-PTR TO ENTRY "PROGA".

上記の例で、AVAR は 01 レベルのデータ項目なので、ADDRESS OF AVAR は ADDRESS OF 特殊レジスターです。 特殊レジスターは実際のストレージ域なので、SET ステートメントにより ADDRESS OF AVAR の内容がポインター・データ項目 APTR に転送されます。

上記の例で、SET ステートメントで ADDRESS OF CVAR が使用される場合には、特殊レジスターは存在しません。 その代わりに、計算された CVAR のアドレスがポインター・データ項目 APTR に割り当てられます。

上記の例の 2 番目の SET ステートメントは、プロシージャー・ポインター・データ項目 APROC-PTR を最外部の ILE COBOL プログラム "PROGA" に設定します。