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