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