15.4.2 COMPUTE文(アドレス操作機能)
COMPUTE文でアドレス名またはアドレスデータ項目にアドレスを設定または更新する。
- 形式
-
書き方1
書き方2
- 【標準仕様との関連】
-
「COBOL2002 言語 標準仕様編」 「11.5 関数の要約」
機能
-
アドレス名またはアドレスデータ項目にアドレスを設定する(書き方1)。
-
アドレス名またはアドレスデータ項目に外部プログラムのアドレスを設定する(書き方1)。
-
アドレス名またはアドレスデータ項目の更新をする(書き方2)。
構文規則
-
一意名1および一意名3のデータ項目はアドレスデータ項目でなければならない。
-
一意名2には,アドレスで参照したいデータ項目の名前を指定する。部分参照を指定してはならない。
-
定数1は英数字定数でなければならない。
-
定数1にはプログラム名の規則を適用する。
-
Windows(x86) COBOL2002の場合,定数1に,呼び出し規約がSTDCALLの外部プログラム名を指定してはならない。
コンパイラオプションの指定
呼び出し規約
コンパイルの結果
-DynamicLink,Callオプションなし
CDECL
正常終了
STDCALL
リンクエラー
-DynamicLink,Callオプションあり
CDECL
正常終了
STDCALL
コンパイルエラー
-
一意名4は,整数項目でなければならない。
-
定数2は,正の符号なし整数でなければならない。
-
一意名2には,ファクトリ定義およびインスタンス定義で定義したデータ項目の名前を指定してはならない。
一般規則
-
書き方1の一意名2を指定したCOMPUTE文を実行すると,一意名2のデータ項目の占める記憶領域の先頭番地(アドレス)が,アドレス名1または一意名1に設定される。
-
書き方1のアドレス名1,一意名1にROUNDED指定をしてはならない。
-
書き方1で定数1を指定する場合,アドレス参照したいプログラムの外部プログラム名を指定する。
-
書き方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.
-
Windows(x86) COBOL2002では,書き方1の定数1で示される外部プログラムは,CDECL属性だけが対象となる。
-
-DynamicLink,Callオプションが指定されている場合,定数1で示される外部プログラムが,ロードされた実行可能ファイル,DLL(Windows COBOL2002),共用ライブラリ(UNIX COBOL2002)のどちらからも見つからなかった場合,アドレスはNULLを返す。
備考
外部プログラムが存在するかどうかは,リンカまたはローダによってチェックされる。外部プログラムが存在しない場合は,外部シンボル未解決エラーとなる。
なお,-DynamicLink,Callオプションの指定がある場合は,リンカやローダでチェックは行われず,実行時にプログラムのアドレスまたはNULLを返す。
定数1の指定
プログラムのローディング状態
ADDR関数で返される値
存在する外部プログラム名
ロードされている
プログラムのアドレス
ロードされていない
NULL
存在しない外部プログラム名
ロードされていない
NULL
-
書き方1にON SIZE ERROR,NOT ON SIZE ERRORを指定してはならない。
-
書き方2のCOMPUTE文を実行すると,アドレス名2または一意名3の内容に,一意名4または定数2の値を加算または減算し,その結果がアドレス名1または一意名1に設定される。
-
書き方2のアドレス名1,一意名1にROUNDED指定をしてはならない。
-
書き方2のCOMPUTE文で算術演算式中に乗除算やべき乗を指定してはならない。
-
書き方2にON SIZE ERROR,NOT ON SIZE ERRORを指定してはならない。
-
書き方2で等号の右辺に括弧を指定してはならない。
-
書き方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文」