システム API 呼び出しを含むプログラム呼び出しでは、パラメーターを参照によっ て渡すことが必要です。 しかし、プロシージャー呼び出しにはそのような必要性 はありません。 ILE RPG では、次の 3 つの方法でプロトタイプ・パラメーターの受け渡しをできるようにします。
プロトタイプでないパラメーターは、参照によってのみ渡すことができます。
ILE RPG のデフォルトのパラメーター受け渡しスタイルは、参照によるものです。 したがって、参照によってパラメーターを渡す場合には、パラメーター定義に キーワードをコーディングする必要はありません。 呼び出される側が渡されたフィールドを変更する時には、参照 によってパラメーターをプロシージャーに渡す必要があります。 また、 例えば大きな文字フィールドを渡す時などには実行時のパフォーマンスを向上させるため、 参照によって渡すことが必要となることもあります。 外部プログラム呼び出しで渡されるパラメーターは、 参照によってしか渡すことができないことにも注意してください。
プロトタイプ・プロシージャーでは参照の代わりに、値によってパラメーターを渡すことができます。 パラメーターが値によって渡されると、コンパイラーは実際の値を呼び出され たプロシージャーに渡します。
パラメーターを値によって渡した時には、呼び出されるプログラムまたはプ ロシージャーはパラメーターの値を変更できますが、呼び出し側 は変更された値を見ることはできません。
値によってパラメーターを渡すためには、 下の図のようにプロトタイプのパラメーター定義にキーワード VALUE を 指定してください。
パラメーターをプロトタイプ・プロシージャーまたはプログラムに渡すもう 1 つの方法は、読み取り専用の参照によって渡すことです。参照によってパラメーターを渡す必要があり、 そのパラメーター値が呼び出し中に変更されないことが分っている場合には、読み取り専用参照による受け渡しが 便利です。 例えば、多くのシステム API は、形式または長さを指定する読み取り専用の パラメーターをもっています。
読み取り専用参照によるパラメーターの受け渡しには値による受け渡しと同じ利点が あります。 特に、この方法によってリテラルおよび式を渡すことができます。しかし、パラメーターが呼び出し中に変更されないことを承知しておくことが重 要です。
パラメーターを読み取り専用参照により渡した時には、 コンパイラーはパラメーターを一時フィールドにコピーして その一時フィールドのアドレスを渡します。これを引き起こす条件の一部は、渡されたパラメーターが式 であることか、渡されたパラメーターの形式が異なっている場合です。
読み取り専用参照でパラメーターを渡すためには、プロトタイプの パラメーター定義の定義仕様書でキーワード CONST を指定してください。 図 66 は、ILE CEE API CEETSTA プロトタイプ定義 (省略引数のテスト) 例です。
値または読み取り専用の参照の受け渡しでは、次のことが可能になります。
値または読み取り専用参照による受け渡しを使用する主要な目的の 1 つは 、渡されるパラメーターの属性の一致があまり厳格でなくてもよいことです。 例えば、定義がパック 10 進数の数字フィールドのタイプで、小数点以下 2 桁の長さ 5 である場合には、数値を渡さなければなりませんが、これを次の ようにすることができます。
2 * (Min(Length(First) + Length(Last) + 1): %size(Name))
プロトタイプに 4 要素の配列が必要な場合には、渡されるパラメーターは 次のようにすることができます。
既存のプログラムまたはプロシージャーを呼び出す場合は、参照による 方法または値による方法のいずれかの、プロシージャーが予期する方法でパラメ ーターを渡す必要があります。 パラメーターを参照により渡す必要があり、呼び出されたプロシージャー・プログラムまたはプロシージャーによって パラメーターが変更されない場合は、読み取り専用の参照によって渡します (CONST キーワードを使用)。 値による受け渡しまたは読み取り専用参照による受け渡しを自由に選択できる場合、 大量のパラメーターがある場合は読み取り専用の参照によって渡します。 次の一般的なガイドラインに従ってください。
*------------------------------------------------------------- * プロシージャーは 10 桁の整数値を戻します。 * 3 つのパラメーターはすべて、VALUE で渡された 5 桁の整数です。 *------------------------------------------------------------- D MyFunc PR 10I 0 EXTPROC('DO_CALC') D 5I 0 VALUE D 5I 0 VALUE D 5I 0 VALUE ....
P DO_CALC B EXPORT *------------------------------------------------------------- * このプロシージャーは、VALUE パラメーターとして渡された * 3 つの数値で機能を実行し、また値を戻します。 *------------------------------------------------------------- D DO_CALC PI 10I 0 D Term1 5I 0 VALUE D Term2 5I 0 VALUE D Term3 5I 0 VALUE D Result S 10I 0 C EVAL Result = Term1 ** 2 * 17 C + Term2 * 7 C + Term3 C RETURN Result * 45 + 23 P E
*------------------------------------------------------------------ * CEETSTA (省略引数のテスト) -- ILE CEE API * 1. 存在フラグ 出力 2 進 (4) * 2. 引数番号 入力 2 進 (4) *------------------------------------------------------------------ D CEETSTA PR EXTPROC('CEETSTA') D Present 10I 0 D ArgNum 10I 0 CONST D Feedback 12A OPTIONS(*OMIT) ... D HaveParm S 10I 0 ... C CALLP CEETSTA(HaveParm : 3 : *OMIT) C IF HaveParm = 1 * 3 番目のパラメーターで何かを行なう C ENDIF
CEETSTA に渡される 2 番目のパラメーターは数字フィールド、 リテラル、組み込み関数、または式とすることができます。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.