パラメーターの受け渡しスタイル

システム API 呼び出しを含むプログラム呼び出しでは、パラメーターを参照によっ て渡すことが必要です。 しかし、プロシージャー呼び出しにはそのような必要性 はありません。 ILE RPG では、次の 3 つの方法でプロトタイプ・パラメーターの受け渡しをできるようにします。

プロトタイプでないパラメーターは、参照によってのみ渡すことができます。

参照による受け渡し

ILE RPG のデフォルトのパラメーター受け渡しスタイルは、参照によるものです。 したがって、参照によってパラメーターを渡す場合には、パラメーター定義に キーワードをコーディングする必要はありません。 呼び出される側が渡されたフィールドを変更する時には、参照 によってパラメーターをプロシージャーに渡す必要があります。 また、 例えば大きな文字フィールドを渡す時などには実行時のパフォーマンスを向上させるため、 参照によって渡すことが必要となることもあります。 外部プログラム呼び出しで渡されるパラメーターは、 参照によってしか渡すことができないことにも注意してください。

値による受け渡し

プロトタイプ・プロシージャーでは参照の代わりに、値によってパラメーターを渡すことができます。 パラメーターが値によって渡されると、コンパイラーは実際の値を呼び出され たプロシージャーに渡します。

パラメーターを値によって渡した時には、呼び出されるプログラムまたはプ ロシージャーはパラメーターの値を変更できますが、呼び出し側 は変更された値を見ることはできません。

値によってパラメーターを渡すためには、 下の図のようにプロトタイプのパラメーター定義にキーワード VALUE を 指定してください。

注:
i5/OS プログラム呼び出しでは、そのパラメーターが参照によって渡されることが必要です。したがって、値によってパラメーターをプログラムに渡すことはできません。

読み取り専用参照による受け渡し

パラメーターをプロトタイプ・プロシージャーまたはプログラムに渡すもう 1 つの方法は、読み取り専用の参照によって渡すことです。参照によってパラメーターを渡す必要があり、 そのパラメーター値が呼び出し中に変更されないことが分っている場合には、読み取り専用参照による受け渡しが 便利です。 例えば、多くのシステム API は、形式または長さを指定する読み取り専用の パラメーターをもっています。

読み取り専用参照によるパラメーターの受け渡しには値による受け渡しと同じ利点が あります。 特に、この方法によってリテラルおよび式を渡すことができます。しかし、パラメーターが呼び出し中に変更されないことを承知しておくことが重 要です。

パラメーターを読み取り専用参照により渡した時には、 コンパイラーはパラメーターを一時フィールドにコピーして その一時フィールドのアドレスを渡します。これを引き起こす条件の一部は、渡されたパラメーターが式 であることか、渡されたパラメーターの形式が異なっている場合です。

注:
呼び出されるプログラムまたはプロシージャーが、読み取り専用の参照方式を使用 する言語 (プロトタイプを使用する ILE RPG、または C のどちらか) の プロトタイプを使用してコンパイルされる場合には、パラメーターは 変更されません。 呼び出されるプログラムまたはプロシージャーがプロトタイプを使用しない場合には、 コンパイラーはパラメーターが変更されないことを 保証できません。 この場合には、プロトタイプを定義する人がこのパラメーター受け渡し方法の指 定時に注意しなければなりません。

読み取り専用参照でパラメーターを渡すためには、プロトタイプの パラメーター定義の定義仕様書でキーワード CONST を指定してください。 図 66 は、ILE CEE API CEETSTA プロトタイプ定義 (省略引数のテスト) 例です。

値または読み取り専用参照による受け渡しの利点

値または読み取り専用の参照の受け渡しでは、次のことが可能になります。

値または読み取り専用参照による受け渡しを使用する主要な目的の 1 つは 、渡されるパラメーターの属性の一致があまり厳格でなくてもよいことです。 例えば、定義がパック 10 進数の数字フィールドのタイプで、小数点以下 2 桁の長さ 5 である場合には、数値を渡さなければなりませんが、これを次の ようにすることができます。

プロトタイプに 4 要素の配列が必要な場合には、渡されるパラメーターは 次のようにすることができます。

パラメーターの受け渡しスタイルの選択

既存のプログラムまたはプロシージャーを呼び出す場合は、参照による 方法または値による方法のいずれかの、プロシージャーが予期する方法でパラメ ーターを渡す必要があります。 パラメーターを参照により渡す必要があり、呼び出されたプロシージャー・プログラムまたはプロシージャーによって パラメーターが変更されない場合は、読み取り専用の参照によって渡します (CONST キーワードを使用)。 値による受け渡しまたは読み取り専用参照による受け渡しを自由に選択できる場合、 大量のパラメーターがある場合は読み取り専用の参照によって渡します。 次の一般的なガイドラインに従ってください。

図 64. VALUE パラメーターのプロシージャー DO_CALC のプロトタイプ
      *-------------------------------------------------------------
      *  プロシージャーは 10 桁の整数値を戻します。
      *  3 つのパラメーターはすべて、VALUE で渡された 5 桁の整数です。
      *-------------------------------------------------------------
     D MyFunc          PR            10I 0 EXTPROC('DO_CALC')
     D                                5I 0 VALUE
     D                                5I 0 VALUE
     D                                5I 0 VALUE
     ....
図 65. DO_CALC プロシージャーのプロシージャー・インターフェース定義
     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
図 66. CONST パラメーターの ILE CEE API CEETSTA のプロトタイプ
      *------------------------------------------------------------------
      * 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 番目のパラメーターは数字フィールド、 リテラル、組み込み関数、または式とすることができます。