サブプロシージャー演算
サブプロシージャーの場合にはサイクル・コードは生成されないので、それを
メイン・プロシージャーとは異なる方法でコーディングしなければなりません。 サブプロシージャーは、次の 1 つが起こった時に終了します。
- RETURN 命令が処理された。
- サブプロシージャーの本体の最後の演算が処理された。
図 39 は、サブプロシージャーの通常の処理ステップを示しています。
図 40 は、例外/エラーの処理順序を示しています。
- 1
- 「いいえ」の分岐をとることは、プログラムが活動化されていたために、別
のプロシージャーがすでに呼び出されていることを意味します。 別のプロシージャーではファイルがクローズされていたり、データ域がアンロッ
クされていたりすることがあるため、ファイル、データ域などの状態について間
違った前提をとっていないことを確認しなければなりません。
- 2
- モジュールのどこかでメイン・プロシージャーへの入り口パラメーターが RESET にな
っている場合には、これによって例外が起こります。 サブプロシージャーを
メイン・プロシージャーの前に呼び出すことが可能な場合には、
メイン・プロシージャーについて入り口パラメーターを RESET することは
望ましくありません。
図 40. サブプロシージャーの例外/エラーの処理順序
以下は、サブプロシージャーのコーディング時に考慮すべきいくつかの点です。
- サブプロシージャーと関連した *INZSR はありません。 データは、サブプロシージャーが初めて呼び出された時に、演算を開始する前に
(INZ 値かまたはデフォルトの値によって) 初期化されます。
サブプロシージャーがモジュール内の呼び出される最初の プロシージ
ャーである場合には、他のグローバル・データの初期化は実行されても、メインプ
ロシージャーの *INZSR は (それがあった場合) 実行されないことにも注意してください。
メイン・プロシージャーの *INZSR は、そのメイン・プロシージャーが呼び出され
た時に実行されます。
- サブプロシージャーが通常戻り値を戻してきた時に、呼び出されるプログ
ラムまたはプロシージャーのプロトタイプに指定されていれば、その戻り値が呼び出し元に渡されます。
自動的には何も行われません。 ファイルおよびデータ域はすべて手操作でクローズしなければなりません。 ファイルへは手操作で書き出さなければなりません。 LR のような標識をオンに設定することができますが、メイン・プロシージャーが終了
するまで、プログラムの終了は行われません。
- サブプロシージャーの中での例外処理は、サブプロシージャー用のデフォルトの例外
処理プログラムはなく、そのような状況ではサブプロシージャーの異常終了と
対応してメイン・プロシージャーのデフォルトの処理プログラムが呼び出されるため、メインプ
ロシージャーとは基本的に異なっています。 例えば、サブプロシージャーの中の *PSSR サブルーチンのための ENDSR 命令の
演算項目 2 はブランクでなければなりません。
メイン・プロシージャー内のブランクの演算項目 2 の結果として、デフォルトの処理プログラ
ムに制御が渡されます。 サブプロシージャーでは、ENDSR に達した場合に、その
サブプロシージャーは異常終了し、サブプロシージャーの呼び出し元に RNX9001 の
信号が送られます。
異常終了は、*PSSR に RETURN 命令をコーディングするか、あるいはサブプロシ
ージャーに処理を続行するための GOTO およびラベルをコーディングすることに
よって、避けることができます。
- *PSSR エラー処理サブルーチンは、サブプロシージャーにとってローカルなものです。 これに対し、ファイル・エラーは定義上はグローバルなものであるため、INFSR
をサブプロシージャーにコーディングすることもできなければ、INFSR がコーデ
ィングされたファイルを使用することもできません。
- サイクルを制御する標識は、NOMAIN
モジュールで使用されている場合、あるいは活動中のサブプロシージャーで使用されていても、そこにはモジュールのメイン・プロシージャーがない場合は、条件付け標識としてのみ機能します。
サイクルを制御する標識には、LR、RT、H1 から H9、および制御レベル標識があります。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.