サブプロシージャーの定義

サブプロシージャーとは、メイン・ソース・セクションの後に定義されるプロシージャーです。

サブプロシージャーは、サイクル・メイン・プロシージャーと異なる点がいくつかあります。 その中でも大きな違いは、サブプロシージャーでは実行中に RPG サイクルを使用しない (使用できない) という点です。

メイン・ソース・セクションの定義仕様書の中に、サブプロシージャーの対応プロトタイプを指定することができます。 このプロトタイプが指定された場合、これは、プログラムまたはプロシージャーを正しく呼び出し、呼び出 し元が確実に正しいパラメーターを渡せるように、コンパイラーによって使用されます。 指定されない場合、プロシージャーはプロシージャー・インターフェースから暗黙的に生成されます。

ヒント:

プロシージャーを定義したモジュール内では、プロトタイプの指定はオプションですが、 プロシージャーがモジュールからエクスポートされて、他の RPG モジュールから呼び出される場合には、オプションにはなりません。 この場合には、プロトタイプをコピー・ファイルに指定して、 サブプロシージャーを定義したモジュール、およびサブプロシージャーを呼び出すすべてのモジュールにコピーする必要があります。

変更の始まり以下に示すのは、各構成部分を分かりやすく表示したサブプロシージャーの例です。 最初に自由形式定義を使用する例を示し、2 番目に固定形式を使用する例を 示します。変更の終わり

変更の始まりこのプロシージャーは、値パラメーターとして渡される 3 つの数値に対して関数を 実行します。 この例は、プロシージャーに対してプロシージャー・インターフェースがどのように 指定されるのか、および、値がプロシージャーからどのように戻されるのかを示しています。変更の終わり

図 1. 自由形式サブプロシージャーの例
 // 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 
変更の始まり
図 2. 固定形式サブプロシージャーの例
 * 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 を指定してください。 これを指定しなかった場合には、サブプロシージャーはモジュールの中からしか 呼び出すことができません。