COBOL2002 言語 拡張仕様編


15.4.2 COMPUTE文(アドレス操作機能)

COMPUTE文でアドレス名またはアドレスデータ項目にアドレスを設定または更新する。

形式

書き方1

[図データ]

書き方2

[図データ]

【標準仕様との関連】

COBOL2002 言語 標準仕様編」 「11.5 関数の要約

機能

  1. アドレス名またはアドレスデータ項目にアドレスを設定する(書き方1)。

  2. アドレス名またはアドレスデータ項目に外部プログラムのアドレスを設定する(書き方1)。

  3. アドレス名またはアドレスデータ項目の更新をする(書き方2)。

構文規則

  1. 一意名1および一意名3のデータ項目はアドレスデータ項目でなければならない。

  2. 一意名2には,アドレスで参照したいデータ項目の名前を指定する。部分参照を指定してはならない。

  3. 定数1は英数字定数でなければならない。

  4. 定数1にはプログラム名の規則を適用する。

  5. Windows(x86) COBOL2002の場合,定数1に,呼び出し規約がSTDCALLの外部プログラム名を指定してはならない。

    コンパイラオプションの指定

    呼び出し規約

    コンパイルの結果

    -DynamicLink,Callオプションなし

    CDECL

    正常終了

    STDCALL

    リンクエラー

    -DynamicLink,Callオプションあり

    CDECL

    正常終了

    STDCALL

    コンパイルエラー

    備考

    コンパイルが正常終了する場合は,実行時にプログラムのアドレスが取得できる。

  6. 一意名4は,整数項目でなければならない。

  7. 定数2は,正の符号なし整数でなければならない。

  8. 一意名2には,ファクトリ定義およびインスタンス定義で定義したデータ項目の名前を指定してはならない。

一般規則

  1. 書き方1の一意名2を指定したCOMPUTE文を実行すると,一意名2のデータ項目の占める記憶領域の先頭番地(アドレス)が,アドレス名1または一意名1に設定される。

  2. 書き方1のアドレス名1,一意名1にROUNDED指定をしてはならない。

  3. 書き方1で定数1を指定する場合,アドレス参照したいプログラムの外部プログラム名を指定する。

  4. 書き方1の定数1を指定したCOMPUTE文を実行すると,定数1で示される外部プログラムの先頭番地がアドレス名1または一意名1に設定される。

    (例)

            DATA DIVISION.
            WORKING-STORAGE SECTION.
                 77 KAKUNO     ADDRESS.
            PROCEDURE DIVISION.
                 COMPUTE KAKUNO = FUNCTION ADDR('SUB_PROGRAM').
                 IF  KAKUNO = NULL
                    THEN  DISPLAY 'SUB_PROGRAM NO LOAD'
                 END-IF.
  5. Windows(x86) COBOL2002では,書き方1の定数1で示される外部プログラムは,CDECL属性だけが対象となる。

  6. -DynamicLink,Callオプションが指定されている場合,定数1で示される外部プログラムが,ロードされた実行可能ファイル,DLL(Windows COBOL2002),共用ライブラリ(UNIX COBOL2002)のどちらからも見つからなかった場合,アドレスはNULLを返す。

    備考

    外部プログラムが存在するかどうかは,リンカまたはローダによってチェックされる。外部プログラムが存在しない場合は,外部シンボル未解決エラーとなる。

    なお,-DynamicLink,Callオプションの指定がある場合は,リンカやローダでチェックは行われず,実行時にプログラムのアドレスまたはNULLを返す。

    定数1の指定

    プログラムのローディング状態

    ADDR関数で返される値

    存在する外部プログラム名

    ロードされている

    プログラムのアドレス

    ロードされていない

    NULL

    存在しない外部プログラム名

    ロードされていない

    NULL

  7. 書き方1にON SIZE ERROR,NOT ON SIZE ERRORを指定してはならない。

  8. 書き方2のCOMPUTE文を実行すると,アドレス名2または一意名3の内容に,一意名4または定数2の値を加算または減算し,その結果がアドレス名1または一意名1に設定される。

  9. 書き方2のアドレス名1,一意名1にROUNDED指定をしてはならない。

  10. 書き方2のCOMPUTE文で算術演算式中に乗除算やべき乗を指定してはならない。

  11. 書き方2にON SIZE ERROR,NOT ON SIZE ERRORを指定してはならない。

  12. 書き方2で等号の右辺に括弧を指定してはならない。

  13. 書き方1で定数1を指定する場合,利用者定義関数名,メソッド名およびオブジェクトプロパティ名は指定できない。

    (例)

           DATA            DIVISION.
           FILE            SECTION.
           FD INFIL        BLOCK  CONTAINS 5 RECORDS.
           01 INREC.
             02 HONTAI   PIC X(10).
             02 HUKA     PIC X(20).
           FD OUTFIL.
           01 OUTREC.
             02 FILLER   PIC X(5).
             02 OUTREC1  PIC 9(6).
             02 FILLER   PIC X(5).
             02 OUTREC2  PIC Z,ZZZ,ZZ9.
           WORKING-STORAGE SECTION.
           01 HUKAREC      ADDRESSED BY REC-AD1.
             02 HUKAREC1 PIC 9(3).
             02 HUKAREC2 PIC 9(7).
           77 KAKUNO       ADDRESS.
           PROCEDURE       DIVISION.
                :
               READ INFIL.
                :
               COMPUTE REC-AD1 = FUNCTION ADDR(HUKA). …(1)
               MOVE HUKAREC2 TO OUTREC2.              …(2)
                :
               COMPUTE KAKUNO = REC-AD1               …(3)
               COMPUTE REC-AD1 = REC-AD1 + 10.        …(4)
               MOVE HUKAREC2 TO OUTREC2.              …(5)

    (1)のCOMPUTE文でREC-AD1にアドレスを設定する(書き方1)ことによって,(2)のMOVE文でHUKAREC2という名前で,HUKAの4バイト目から7バイトのデータ項目を参照できる。

    (4)のCOMPUTE文でREC-AD1のアドレスを更新する(書き方2)ことによって,(5)のMOVE文でHUKAREC2という名前で,HUKAの14バイト目から7バイトのデータ項目を参照できる。

    (3)のCOMPUTE文では,KAKUNOにREC-AD1のアドレスを一時退避している。

【標準仕様との関連】

COBOL2002 言語 標準仕様編」 「10.8.8 COMPUTE文