サブプロシージャーの定義
サブプロシージャーとは、メイン・ソース・セクションの後に定義されるプロシージャーです。
サブプロシージャーは、サイクル・メイン・プロシージャーと異なる点がいくつかあります。 その中でも大きな違いは、サブプロシージャーでは実行中に RPG サイクルを使用しない (使用できない) という点です。
メイン・ソース・セクションの定義仕様書の中に、サブプロシージャーの対応プロトタイプを指定することができます。 このプロトタイプが指定された場合、これは、プログラムまたはプロシージャーを正しく呼び出し、呼び出 し元が確実に正しいパラメーターを渡せるように、コンパイラーによって使用されます。 指定されない場合、プロシージャーはプロシージャー・インターフェースから暗黙的に生成されます。
プロシージャーを定義したモジュール内では、プロトタイプの指定はオプションですが、 プロシージャーがモジュールからエクスポートされて、他の RPG モジュールから呼び出される場合には、オプションにはなりません。 この場合には、プロトタイプをコピー・ファイルに指定して、 サブプロシージャーを定義したモジュール、およびサブプロシージャーを呼び出すすべてのモジュールにコピーする必要があります。
以下に示すのは、各構成部分を分かりやすく表示したサブプロシージャーの例です。 最初に自由形式定義を使用する例を示し、2 番目に固定形式を使用する例を 示します。
このプロシージャーは、値パラメーターとして渡される 3 つの数値に対して関数を 実行します。 この例は、プロシージャーに対してプロシージャー・インターフェースがどのように 指定されるのか、および、値がプロシージャーからどのように戻されるのかを示しています。
// Prototype for procedure FUNCTION
DCL-PR Function INT(10); 1
TERM1 INT(5) VALUE;
TERM2 INT(5) VALUE;
TERM3 INT(5) VALUE;
END-PR;
DCL-PROC Function; 2
DCL-PI *N INT(10); 3
TERM1 INT(5) VALUE;
TERM2 INT(5) VALUE;
TERM3 INT(5) VALUE;
END-PI;
DCL-S Result INT(10); 4
Result = Term1 ** 2 * 17
+ Term2 * 7 5
+ Term3;
return Result * 45 + 23;
END-PROC; 6
* Prototype for procedure FUNCTION
D FUNCTION PR 10I 0 1
D TERM1 5I 0 VALUE
D TERM2 5I 0 VALUE
D TERM3 5I 0 VALUE
P Function B 2
D Function PI 10I 0 3
D Term1 5I 0 VALUE
D Term2 5I 0 VALUE
D Term3 5I 0 VALUE
D Result S 10I 0 4
Result = Term1 ** 2 * 17
+ Term2 * 7 5
+ Term3;
return Result * 45 + 23;
P E 6
- 1
- 名前、戻り値 (ある場合)、パラメーター (ある場合) を指定 するプロトタイプ。プロシージャーがこのモジュールからエクスポートされないため、プロトタイプの指定はオプションです。
- 2
- プロシージャー仕様の開始。
- 3
- プロシージャー・インターフェース定義。これは、 戻り値およびパラメーターがあった場合に、それらを 指定します。プロシージャー・インターフェースは、対応するプロトタイプと一致していなけ ればなりません。 サブプロシージャーから値が戻されず、また、そのサブプロシージャ ーに渡されるパラメーターがない場合には、プロシージャー・インターフェースの定義はオプションです。プロトタイプが指定されていないと、 コンパイラーがプロシージャー・インターフェース定義を使用して、プロトタイプを暗黙的に定義します。
- 4
- 他のローカル定義。
- 5
- プロシージャーのタスクを実行するためには、標準または自由形式のなんらかの演算仕様書が必要です。演算では、ローカルとグローバルの両方の定義を 参照することができます。 サブプロシージャーの中に組み込まれたサブルーチンは、 いずれもローカルです。 それらをサブプロシージャーの外で使用することはできません。 サブプロシージャーから値が戻される場合には、 そのサブプロシージャーに RETURN 命令が含まれていなければなりません。
- 6
- プロシージャー仕様の終了。
定義仕様書のどこにでも入れることができるプロシージャー・インターフェース定 義を除き、サブプロシージャーは上記の順序でコーディングしなければなりま せん。
- 実行時前およびコンパイル時配列およびテーブル
- *DTAARA 定義
- 合計演算
演算仕様書は一度だけ処理され、演算仕様書の終わりでプロシージャーに戻ります。 詳しくは、サブプロシージャー演算を参照してください。
サブプロシージャーはエクスポートすることができますが、これは、プログラム 内の他のモジュールにあるプロシージャーでそれを呼び出すことができることを 意味します。 サブプロシージャーがエクスポートされることを指示するためには、プロシージャーの始めの指定でキーワード EXPORT を指定してください。 これを指定しなかった場合には、サブプロシージャーはモジュールの中からしか 呼び出すことができません。