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. 32bit版PC(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. 32bit版PC(x86) COBOL2002では,書き方1の定数1で示される外部プログラムは,CDECL属性だけが対象となる。
6. -DynamicLink,Callオプションが指定されている場合,定数1で示される外部プログラムが,ロードされた実行可能ファイル,DLL(PC 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文