サブプロシージャーの考慮事項
これらの考慮事項は、特に指定のない限り、通常のサブプロシージャーおよびリニア・メイン・プロシージャー に適用されます。
- 演算命令のどれもサブプロシージャーでコーディングすることができます。 ただし、入力仕様書および出力仕様書はサブプロシージャーでサポートされていないため、 サブプロシージャーでローカルに定義されたファイルに対するファイル入出力操作には、 データ構造結果フィールドを使用する必要があります。すべてのデータ域は、サブプロシージャーで使用することができますが、 メイン・ソース・セクションで定義しなければなりません。
- 制御仕様書は、モジュール全体を制御するので、 メイン・ソース・セクションでのみコーディングすることができます。
- サブプロシージャーは再帰的に呼び出すことができます。
各再帰呼び出しによって、プロシージャーの新しい呼び出しが呼び出しスタックに入
れられることになります。
新しい呼び出しには自動記憶域のすべてのデータ項目に対し新しい記憶域があり、
その記憶域は局所的なために他の呼び出しでは使用できません。(定義に STATIC キーワードを指定しないかぎり、サブプロシージャーで定義さ
れるデータ項目は自動記憶域を使用します)。
以前の呼び出しと関連した自動記憶域は後からの呼び出しによって影響は受けません。 すべての呼び出しは同じ静的記憶域を共用しているので、 後からの呼び出しは静的記憶域の変数によって保留されている値に影響を与えることはあります。
再帰は、適切に理解した時に強力なプログラミング手法となることができます。
- サブプロシージャー (リニア・メイン・プロシージャーを含む) の実行時の動作は、
サブプロシージャーのためのサイクル・コードがないために、
サイクル・メイン・プロシージャーの動作とは一部異なります。
- サブプロシージャーが終了すると、自動記憶域内で開かれているローカル・ファイルが
クローズされます。ただし、グローバル・ファイルのクローズなどの終了活動はいずれも、
サブプロシージャー自身と関連したサイクル・メイン・プロシージャー (存在する場合) が終了するまでは
発生しません。活動化グループの終了前に確実にグローバル・ファイルがクローズするように
するには、アプリケーション終了時のプログラム入力プロシージャー、
およびプログラム入力プロシージャー用に使用可能な取り消し処理プログラムの両方によって呼び出される『終結処置』サブプロシージャーをコーディングします。
終結処理プロシージャーの使用に代わる方法は、暗黙ファイルのオープンまたはデータ域ロックが発生しないように、 また任意のサブプロシージャー内でオープンがクローズと対応し、IN が OUT と、CRT が DLT と対応するというように、 モジュールをコーディングすることです。 サイクル・メイン・プロシージャーがアクティブでないときに、 サブプロシージャーがアクティブになっている可能性がある場合に、 サイクル・モジュールに対してこの代替処理を考慮する必要があります。
- サブプロシージャー内の例外処理は、サブプロシージャー用のデフォルトの 例外処理プログラムがないために、基本的にサイクル・メイン・プロシージャーと異なっています。 結果として、サイクル・メイン・プロシージャー用にデフォルトの処理プログラムが呼び出された場合には、サブプロシージャーの異常終了が発生します。
- サブプロシージャーが終了すると、自動記憶域内で開かれているローカル・ファイルが
クローズされます。ただし、グローバル・ファイルのクローズなどの終了活動はいずれも、
サブプロシージャー自身と関連したサイクル・メイン・プロシージャー (存在する場合) が終了するまでは
発生しません。活動化グループの終了前に確実にグローバル・ファイルがクローズするように
するには、アプリケーション終了時のプログラム入力プロシージャー、
およびプログラム入力プロシージャー用に使用可能な取り消し処理プログラムの両方によって呼び出される『終結処置』サブプロシージャーをコーディングします。