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文
All Rights Reserved. Copyright (C) 2003, 2013, Hitachi, Ltd.