プロトタイプ
- 呼び出しが結合 (プロシージャー) と動的 (プログラム) のいずれであるか
- プログラムまたはプロシージャー (外部名) の検索方法
- パラメーターの数および特質
- 渡す必要があるパラメーター、およびオプションで渡されるパラメーター
- 操作記述子を渡す必要があるかどうか
- 戻り値があった場合のそのデータ・タイプ (プロシージャーの場合)
プロトタイプは明示的に定義することも、暗黙的に定義することもできます。 異なる RPG モジュールからプロシージャーが呼び出される場合には、 呼び出し元モジュールと、プロシージャーを定義するモジュールの両方にプロトタイプが明示的に指定されていなければなりません。 プロシージャーが同じモジュール内でのみ呼び出される場合には、 明示的にプロトタイプを定義することも、それを省略することもできます。 プロトタイプが省略されると、コンパイラーは、プロシージャー・インターフェースからそれを暗黙的に定義します。
別のモジュールで定義されたプロシージャーを呼び出すモジュールでは、呼び出しを行うプログラムまたはプロシージャーの定義仕様書 にプロトタイプが含まれていなければなりません。このプロトタイプは、プログラムまたはプロシージャーを正しく呼び出し、呼び出 し元が確実に正しいパラメーターを渡せるように、コンパイラーによって使用さ れます。
プロトタイプには名前が付いている必要があります。キーワード EXTPGM または EXTPROC をプロトタイプ定義に指定した場合には、プ
ログラムまたはプロシージャーに対するすべての呼び出しで、そのキーワードにつ
いて指定された外部名が使用されます。 どちらのキーワードも指定されていない場合、
外部名が大文字でプロトタイプ名になります。
自由形式では、DCL-PR 命令コードを指定し、その後にプロトタイプ名とキーワードを
続けます。固定形式では、定義タイプ記入項目 (24 から 25 桁目) に PR を指定
します。その他のパラメーター定義は、この PR の指定の直後に続けなければなりません。 自由形式では、プロトタイプ定義
は END-PR ステートメントで終わります。固定形式では、プロトタイプ定義は、24 から 25 桁目
がブランク以外の最初の定義仕様か、非定義仕様によって終わります。
- 呼び出しインターフェースと関係した次の任意のキーワードを指定してください。
- EXTPROC(名前)
- 呼び出しは、キーワードによって指定された外部名を使用する結合プロシージ ャー呼び出しとなります。
- EXTPGM(名前)
- 呼び出しは、キーワードによって指定された外部名を使用する外部プログラム 呼び出しとなります。
- OPDESC
- プロトタイプに記述されたパラメーターによって操作記述子が渡されます。
- RTNPARM
- 戻り値がパラメーターとして処理されます。 特に戻り値が大きい場合に、プロシージャー呼び出し時のパフォーマンスが向上する可能性があります。
- 戻り値 (それがあった場合) は PR 定義に指定されます。 戻り値の長さおよびデータ・タイプを指定してください。 さらに、戻り値について次のキーワードを指定することができます。
- DATFMT(形式)
- 戻り値は、キーワードによって指定された日付の形式を持ちます。
- DIM(N)
- 戻り値は、要素が N の配列またはデータ構造です。
- LIKEDS(データ構造名)
- 戻り値はデータ構造です。(プロシージャーを呼び出す場合、戻り値のサブフィールドを参照することはできません。)
- LIKEREC(名前 {,タイプ })
- 戻り値は、指定されたレコード様式名と同様に定義されているデータ構造です。注: プロシージャーを呼び出す場合、戻り値の サブフィールドを参照することはできません。
- LIKE(名前)
- 戻り値は、キーワードによって指定された項目と同じに定義されます。
- PROCPTR
- 戻り値は、プロシージャー・ポインターです。
- TIMFMT(形式)
- 戻り値は、キーワードによって指定された時刻の形式を持ちます。
- VARYING{(2|4) }
- 文字、図形、または UCS-2 戻り値は可変長形式です。
これらのキーワードについては、定義仕様書のキーワードを参照してください。図 1 は、数値入力パラメーターを受け入れて、文字ストリン グを戻すサブプロシージャー CVTCHR のプロトタイプを示しています。 戻り値と関連した名前はないことに注意してください。この理由から、プログラムのデバッグ時にその内容を表示することはできません。
* The returned value is the character representation of
* the input parameter NUM, left-justified and padded on
* the right with blanks.
D CVTCHR PR 31A
D NUM 31P 0 VALUE
* The following expression shows a call to CVTCHR. IF/THEN
* variable rrn has the value 431, then after this EVAL,
* variable msg would have the value
* 'Record 431 was not found.'
C EVAL msg = 'Record '
C + %TRIMR(CVTCHR(RRN))
C + ' was not found '
エクスポートされるサブプロシージャー用またはメイン・プロシージャー用のプロトタイプを書いている場合は、プロトタイプを /COPY ファイルに入れ、そのプロトタイプを、呼び出し側とそのプロシージャーを定義するモジュールの両方のソース・ファイルにコピーします。 このコーディング技法では、呼び出し元もプロシージャー自身もすべてが同一のプロトタイプを使用するため、両者にとってパラメーター・チェックの利点を最大に生かすことができます。