COBOL2002 使用の手引 手引編


18.4.1 プログラム属性

COBOLプログラムでは,プログラムの使用形態に応じて次の属性を指定できます。

〈この項の構成〉

(1) 通常属性プログラム

プログラムの見出し部に特に何も指定しない場合,通常属性プログラムとなります。

通常属性プログラムは,ほかのプログラムから2回以上呼び出された場合,前回呼ばれたときの,次の状態を保持しています。

注※1

AIXで有効です。

注※2

AIX(32)で有効です。

ただし,プログラム中に含まれるすべてのPERFORM文に対する制御機構は,プログラムが呼び出されるたびに,初期状態に設定されます。

保持している状態を取り消すには,CANCEL文を実行します。詳細は,「18.2 プログラムの取り消し」を参照してください。

また,通常属性プログラムは,自分自身を再帰的に呼ぶことはできません。

(2) 初期化属性プログラム

プログラムの見出し部にINITIAL句を指定した場合,初期化属性プログラムとなります。

初期化属性プログラムは,ほかのプログラムから呼ばれたときに,毎回プログラムの状態が初期化されます。そのため,プログラムの状態は,実行単位でそのプログラムが最初に呼ばれたときと同じになります。

(a) 初期化プログラムが呼ばれたときの初期化の内容

初期化プログラムが呼ばれたときのプログラムの状態を次の表に示します。

初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の初期値については,「(b) 初期化プログラムが呼ばれたときの作業場所節のVALUE句の指定がないデータ項目の状態」を参照してください。

表18‒2 初期化プログラムが呼ばれたときのプログラムの状態

データ領域の種別

VALUE句の指定あり

VALUE句の指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

連絡節

作業場所節

(1)

(2)

不定

局所場所節

(1)

不定

不定

ファイル節

(2)

不定

報告書節

(1)

(2)

不定

画面節(SCREEN SECTION)※1

(1)

不定

不定

画面節(WINDOW SECTION)※1

(1)

(2)

不定

通信節(画面機能)※2

不定

不定

通信節(データコミュニケーション機能)

不定

不定

サブスキーマ節

(2)

不定

(凡例)

−:該当しない

(1):VALUE句に指定した値で初期化される

(2):最初に呼ばれたときだけ,コンパイラ環境変数CBLVALUEに指定した値での初期化は保証されるが,2回目以降に呼ばれたときは不定となる

注※1

AIXで有効です。

注※2

AIX(32)で有効です。

(説明)
  • 作業場所節,報告書節,画面節(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句の指定がないデータ項目の状態を次の表に示します。

表18‒3 初期化プログラムが呼ばれたときの,作業場所節のVALUE句の指定がないデータ項目の状態

VALUE句の指定なし

CBLINITVALUEの指定あり

CBLINITVALUEの指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

CBLVALUEの指定あり

CBLVALUEの指定なし

(1)

(2)

不定

(凡例)

(1):呼ばれるたびに,作業場所節のデータ項目がNULL(X'00')で初期化される

(2):最初に呼ばれたときだけ,コンパイラ環境変数CBLVALUEに指定した値での初期化が保証されるが,2回目以降に呼ばれたときは不定となる

(3) 再帰属性プログラム

プログラムの見出し部にRECURSIVE句を指定した場合,再帰属性プログラムとなります。

再帰属性プログラムは,自分自身を直接的,または間接的に再帰呼び出しできます。

再帰属性プログラムが呼ばれたときのプログラムの状態を次の表に示します。

表18‒4 再帰属性プログラムが呼ばれたときのプログラムの状態

データ領域の種別

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)

(凡例)

−:該当しない

(1):最初に呼び出された場合だけ,VALUE句に指定した値で初期化される

(2):呼び出されるたびに初期化される

(3):最初に呼び出された場合だけ,コンパイラ環境変数CBLVALUEに指定した値で初期化される。再帰呼び出しされた場合は,直前に呼び出された状態を保持している

(4):最初に呼び出された場合は,不定となる。再帰呼び出しされた場合は,直前に呼び出された状態を保持している

注※1

AIXで有効です。

注※2

AIX(32)で有効です。

(説明)

次の個所は,プログラムが呼び出されるたびに初期化されます。

  • 局所場所節に含まれていて,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一意名で呼び出そうとした場合は,実行時にエラーとなります。

(b) 再帰呼び出しの例

COBOL副プログラムの再帰呼び出し
(最外側のプログラムの再帰呼び出し)

[図データ]

(内側のプログラムの再帰呼び出し)

[図データ]

COBOL主プログラムの再帰呼び出し

Cプログラムなどを介して,制御プログラムから間接的に呼ばれるCOBOL主プログラムについても,再帰呼び出しができます。

[図データ]

(4) 共通属性プログラム

プログラムの見出し部にCOMMON句を指定した場合,共通属性プログラムとなります。

共通属性プログラムは,その共通属性プログラムを直接含まない,内側のプログラムから呼び出せます。