18.4.1 プログラム属性
COBOLプログラムでは,プログラムの使用形態に応じて次の属性を指定できます。
-
通常属性プログラム
-
初期化属性プログラム
-
再帰属性プログラム
-
共通属性プログラム
(1) 通常属性プログラム
プログラムの見出し部に特に何も指定しない場合,通常属性プログラムとなります。
通常属性プログラムは,ほかのプログラムから2回以上呼び出された場合,前回呼ばれたときの,次の状態を保持しています。
-
プログラムに関連するファイルの状態(報告書作成機能を使用している報告書に関連づけられたファイルを含む)
-
画面節(SCREEN SECTION)※1,画面節(WINDOW SECTION)※1,通信節(画面機能)※2,通信節(データコミュニケーション機能),サブスキーマ節で使用された資源の状態
-
作業場所節,報告書節,画面節(SCREEN SECTION)※1,画面節(WINDOW SECTION)※1,ファイル節,サブスキーマ節,通信節(画面機能)※2,通信節(データコミュニケーション機能)の内容
-
ALTER文で設定したGO TO文
- 注※1
-
AIXで有効です。
- 注※2
-
AIX(32)で有効です。
ただし,プログラム中に含まれるすべてのPERFORM文に対する制御機構は,プログラムが呼び出されるたびに,初期状態に設定されます。
保持している状態を取り消すには,CANCEL文を実行します。詳細は,「18.2 プログラムの取り消し」を参照してください。
また,通常属性プログラムは,自分自身を再帰的に呼ぶことはできません。
(2) 初期化属性プログラム
プログラムの見出し部にINITIAL句を指定した場合,初期化属性プログラムとなります。
初期化属性プログラムは,ほかのプログラムから呼ばれたときに,毎回プログラムの状態が初期化されます。そのため,プログラムの状態は,実行単位でそのプログラムが最初に呼ばれたときと同じになります。
(a) 初期化プログラムが呼ばれたときの初期化の内容
初期化プログラムが呼ばれたときのプログラムの状態を次の表に示します。
初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の初期値については,「(b) 初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の状態」を参照してください。
データ領域の種別 |
VALUE句の指定あり |
VALUE句の指定なし |
|
---|---|---|---|
CBLVALUEの指定あり |
CBLVALUEの指定なし |
||
連絡節 |
− |
− |
− |
作業場所節 |
(1) |
(2) |
不定 |
局所場所節 |
(1) |
不定 |
不定 |
ファイル節 |
− |
(2) |
不定 |
報告書節 |
(1) |
(2) |
不定 |
画面節(SCREEN SECTION)※1 |
(1) |
不定 |
不定 |
画面節(WINDOW SECTION)※1 |
(1) |
(2) |
不定 |
通信節(画面機能)※2 |
− |
不定 |
不定 |
通信節(データコミュニケーション機能) |
− |
不定 |
不定 |
サブスキーマ節 |
− |
(2) |
不定 |
- (説明)
-
-
作業場所節,報告書節,画面節(SCREEN SECTION)※1,画面節(WINDOW SECTION)※1に含まれていて,VALUE句が書かれているデータ項目の場合,VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合,初期値は規定されません。
-
局所場所節に含まれていて,VALUE句が書かれているデータ項目の場合,VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合,初期値は常に規定されません。
-
プログラムに関連する内部ファイル結合子を持つファイルや報告書は,開かれた状態ではありません。
-
通信節による画面機能の送信先画面やプリンタは,開かれた状態ではありません。※2
-
プログラム中に含まれるすべてのPERFORM文に対する制御機構は,その初期状態に設定されます。
-
同じプログラム中に含まれるALTER文によって参照されるGO TO文は,その初期状態に設定されます。
- 注※1
-
AIXで有効です。
- 注※2
-
AIX(32)で有効です。
-
(b) 初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の状態
コンパイル時にコンパイラ環境変数CBLINITVALUEがあるかどうかで,初期化プログラムの作業場所節のVALUE句の指定がないデータ項目の状態が異なります。初期化プログラムが呼ばれたときの,作業場所節のVALUE句の指定がないデータ項目の状態を次の表に示します。
VALUE句の指定なし |
|||
---|---|---|---|
CBLINITVALUEの指定あり |
CBLINITVALUEの指定なし |
||
CBLVALUEの指定あり |
CBLVALUEの指定なし |
CBLVALUEの指定あり |
CBLVALUEの指定なし |
(1) |
(2) |
不定 |
(3) 再帰属性プログラム
プログラムの見出し部にRECURSIVE句を指定した場合,再帰属性プログラムとなります。
再帰属性プログラムは,自分自身を直接的,または間接的に再帰呼び出しできます。
再帰属性プログラムが呼ばれたときのプログラムの状態を次の表に示します。
データ領域の種別 |
VALUE句の指定あり |
VALUE句の指定なし |
|
---|---|---|---|
CBLVALUEの指定あり |
CBLVALUEの指定なし |
||
連絡節 |
− |
− |
− |
作業場所節 |
(1) |
(3) |
(4) |
局所場所節 |
(2) |
不定 |
不定 |
ファイル節 |
− |
(3) |
(4) |
報告書節 |
(1) |
(3) |
(4) |
画面節(SCREEN SECTION)※1 |
(1) |
(4) |
(4) |
画面節(WINDOW SECTION)※1 |
(1) |
(3) |
(4) |
通信節(画面機能)※2 |
− |
(4) |
(4) |
通信節(データコミュニケーション機能) |
− |
(4) |
(4) |
サブスキーマ節 |
− |
(3) |
(4) |
- (説明)
-
次の個所は,プログラムが呼び出されるたびに初期化されます。
-
局所場所節に含まれていて,VALUE句が書かれているデータ項目の場合,VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合,初期値は常に規定されません。
-
プログラム中に含まれるすべてのPERFORM文に対する制御機構は,その初期状態に設定されます。
-
同じプログラム中に含まれるALTER文によって参照されるGO TO文は,その初期状態に設定されます。
次の個所は,プログラムが再帰呼び出しされた場合,前回呼ばれた状態を保持しています。
-
作業場所節,報告書節,画面節(SCREEN SECTION)※1,画面節(WINDOW SECTION)※1に含まれていて,VALUE句が書かれているデータ項目の場合,最初に呼び出されたときは,VALUE句に定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合,最初に呼び出されたときは,初期値は規定されません。
-
作業場所節,ファイル節,報告書節,画面節(SCREEN SECTION)※1,画面節(WINDOW SECTION)※1,通信節(画面機能)※2,通信節(データコミュニケーション機能),サブスキーマ節に含まれているデータ項目で,再帰呼び出しされたときは,直前の状態を保持しています。
-
局所場所節に含まれていて,VALUE句が書かれているデータ項目の場合,定義された値で初期化されます。VALUE句が書かれていないデータ項目の場合,初期値は常に規定されません。
-
プログラムに関連する内部ファイル結合子を持つファイルや報告書は,開かれた状態で再帰呼び出しをすると,開かれた状態で引き継がれます。
-
画面節(SCREEN SECTION)※1,画面節(WINDOW SECTION)※1,通信節(画面機能)※2,通信節(データコミュニケーション機能),サブスキーマ節で使用された資源の状態は,そのままの状態で引き継がれます。
- 注※1
-
AIXで有効です。
- 注※2
-
AIX(32)で有効です。
-
(a) RECURSIVE句の効果
RECURSIVE句を指定した場合の効果は,次のとおりです。
-
RECURSIVE句は,最外側のプログラム(この場合は,-Main,System/-Main,V3オプションを指定しないプログラム)でも指定できます。
また,プログラムが入れ子状態であるとき,外側のプログラムにRECURSIVE句の指定があれば,その直接または間接的な内側のプログラムにRECURSIVE句の指定がなくても,暗黙的に再帰属性プログラムとなります。
-
-Main,System/-Main,V3オプションを指定した最外側のプログラムにRECURSIVE句を指定した場合,警告エラーとなり,最外側のプログラムのRECURSIVE句の指定は無視されます。ただし,内側のプログラムについては,再帰属性となります。
上記の最外側のプログラム("OYA")を呼び出そうとした場合,次の結果となります。
-
最外側のプログラムの手続き,または含まれるプログラムの手続きから,CALL定数(CALL 'OYA')で呼び出そうとした場合は,コンパイル時にエラーとなります。
-
別翻訳単位のプログラムの手続きから,CALL定数(CALL 'OYA')で呼び出そうとした場合,-DynamicLink,Callオプションの指定があれば実行時にエラー,-DynamicLink,Callオプションの指定がなければリンク時にリンクエラーとなります。
-
CALL一意名で呼び出そうとした場合は,実行時にエラーとなります。
-