サブプロシージャー演算

サブプロシージャーの場合、サイクル・コードは生成されないため、サイクル・メイン・プロシージャーとは異なる方法でコーディングする必要があります。 サブプロシージャーは、次の 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、および制御レベル標識があります。