プロトタイプ呼び出し

サブプロシージャーを呼び出す場合には、プロトタイプ呼び出しを使用しなけれ ばなりません。また、この方法で任意の言語で書かれた プログラムまたはプロシージャーを 呼び出すこともできます。プロトタイプ呼び出しとは、 プロトタイプを使用して、コンパイル時に呼び出しインターフェースを検査することによって行う呼び出し です。プロトタイプは、呼び出しインターフェースの定義です。これには、次の情報が含まれます。
  • 呼び出しがバインド (プロシージャー) または動的 (プログラム) であるか どうか
  • プログラムまたはプロシージャー (外部名) の検索方法
  • パラメーターの数および特質
  • パラメーターが渡す必要があるものかどうか、任意に渡されるものかどう か
  • 操作記述子が渡されたかどうか (プロシージャーの場合)
  • 戻り値 (ある場合) のデータ・タイプ (プロシージャーの場合)

プロトタイプは、プログラムまたはプロシージャーを正しく呼び出すため、 さらに呼び出し元が正しいパラメーターを渡したことを確認するために、コンパイ ラーによって使用されます。 図 1 は、レコードの各種フィールドを読み取り可能な形式に様式設定するプロシージャー FmtCust のプロトタイプを示しています。これには 2 つの出力パラメーターがあります。

図 1. FmtCust プロシージャーのプロトタイプ
      // プロシージャー FmtCust のプロトタイプ (定義仕様書の PR に
      // 注意してください)。これには 2 つの出力パラメーターがあります。
     D FmtCust         PR
     D  Name                        100A
     D  Address                     100A

アドレスを様式設定するため、アプリケーションはプロシージャー FmtAddr を呼び出します。 FmtAddr には複数の入力パラメーターがあり、 可変文字フィールドを戻します。 図 2 は FmtAddr のプロトタイプを示しています。

図 2. FmtAddr プロシージャーのプロトタイプ
      //---------------------------------------------------------
      // FmtAddr - アドレスを様式設定するためのプロシージャー
      //---------------------------------------------------------
     D FmtAddr         PR           100A     VARYING
     D   streetNum                   10I 0   CONST
     D   streetName                  50A     CONST
     D   city                        20A     CONST
     D   state                       15A     CONST
     D   zip                          5P 0   CONST

プロシージャーが呼び出しと同じモジュールにコーディングされた場合は、プロトタイプの指定は任意です。 プロトタイプが指定されていないと、コンパイラーはプロシージャー・インターフェースからプロトタイプを生成します。 ただし、プロシージャーがエクスポートされ、かつ別の RPG モジュールまたはプログラムからも呼び出される場合は、コピー・ファイルでプロトタイプを指定し、そのコピー・ファイルを呼び出しモジュールとプロシージャーをエクスポートするモジュールとの両方にコピーするようにしてください。

プログラムまたはプロシージャーがプロトタイプの場合には、CALLP で、ある いは戻り値で使用したい場合は式で、これを呼び出します。 プロトタイプの名前に続くリストに パラメーターを渡します。例えば、名前 (パラメーター 1 : パラメーター 2 : …) です。

図 3 は FmtCust への呼び出しを示します。図 1 で示された OUTPUT パラメーター の名前は CALL ステートメントのものと一致しないことに注意してください。 プロトタイプのパラメーター名は文書化の目的だけのものです。 プロトタイプは、呼び出しインターフェースの属性を記述する のに役 立ちます。 呼び出しパラメーターの実際の定義は、プロシージャー自身の内部で実行され ます。

図 3. FmtCust プロシージャーの呼び出し
     C                   CALLP     FmtCust(RPTNAME : RPTADDR)
プロトタイプ呼び出しを使用して (同じ構文で) 次のものを呼び出すことができ ます。
  • 実行時にシステム上にあるプログラム
  • 同じプログラムまたはサービス・プログラムにバインドされた、他のモジ ュールまたはサービス・プログラム内のエクスポートされたプロシージャー
  • 同じモジュール内のサブプロシージャー

FmtCust は FmtAddr を呼び出してアドレスを様式設定します。 FmtCust は戻り値を使用する必要があるために、 FmtAddr への呼び出しは式の中で行われます。 図 4 はこの呼び出しを示しています。

図 4. FmtAddr プロシージャーの呼び出し
        //--------------------------------------------------------------
        //   FmtAddr プロシージャーを呼び出してアドレスを処理します。
        //--------------------------------------------------------------
        Address = FmtAddress (STREETNUM : STREETNAME :
                              CITY : STATE : ZIP);
上図のように、値を戻すためのプロシージャーの使用によって、 必要なユーザー定義の機能を書くことができます。 さらに、 プロトタイプ呼び出しインターフェースを使用すれば、 パラメーターを渡す方法の選択肢が広がります
  • プロトタイプ・パラメーターは、次の複数の方法で渡すことができます。 参照によって、値によって (プロシージャーの場合のみ)、または読み取り専用 の参照によって、渡すことができます。RPG のデフォルトの方法は参照によって渡すことです。 しかし、値によってまたは読み取り専用参照によって渡すことは、渡すパラメー ターに多くのオプションを与えます。
  • プロトタイプが、指定のパラメーターに使用可能であることを指示している 場合には、次の 1 つ以上を実行できる場合があります。
    • *OMIT を渡す
    • パラメーター全体をそのままにしておく
    • 指定されているよりも短いパラメーターを渡す (文字と図形パラメーター の場合、および配列パラメーターの場合)