プログラムまたはプロシージャーの呼び出し時に、パラメーターを指定しないですませたい場合もあります。 これは、パラメーターが呼び出されたプロシージャーと関連がないという場合 です。 例えば、この状況は ILE バインド可能 API を呼び出す時に起こることがあります。別の理由として、この特殊なパラメーターを処理しない旧プロシージャーを呼び 出す場合があります。呼び出しでパラメーターを省略する必要がある場合には、次の 2 つの方法があります。
2 つの方法の主な違いは、パラメーターが省略されたかどうかを検査する 方法と関係しています。 どちらの場合も、省略されたパラメーターは呼び出されたプロシージャーにより参照することはできません。 参照した場合には、結果は予測できません。そのため、呼び出されたプロシージャーが異なる数のパラメーターを処理するよ うに設計されている場合には、渡されたパラメーターの数を検査する必 要があります。*OMIT が渡された場合には、これはパラメーターとして「カウント」されます。
呼び出されたプロシージャーが、*OMIT が渡されるかもしれないことを知ってい る場合には、プロトタイプ・パラメーターに *OMIT を渡すことができます。 言い換えると、プロトタイプの対応するパラメーター定義に、 キーワード OPTIONS(*OMIT) を指定すると、*OMIT を渡すことができます。 *OMIT を指定すると、コンパイラーが必要なコードを生成し、呼び出された プロシージャーに対し、パラメーターが省略されたことを指示します。
*OMIT が ILE RPG プロシージャーに渡されたかどうかを判別するには、%ADDR 組み込み関数を 使って問題のパラメーターのアドレスを検査します。 アドレスが *NULL の場合には、*OMIT が 渡されています。また CEETSTA (省略された引数の検査) バインド可能 API も 使用することができます (簡略な例については、図 66 を参照してください)。
次は *OMIT の簡単な使用法の例です。 この例では、 操作記述子を分解するために、プロシージャーが ILE バインド可能 API CEEDOD を呼び出します。CEEDOD API は 7 つのパラメーターを受け取ることを期待していますが、呼び出し元の 発呼側プロシージャーには 6 つのパラメーターしか定義されていません。 CEEDOD (およびほとんどの バインド可能 API) の最後のパラメーターは API がどのように終了したかを判別するのに使用できる フィードバック・コードです。 しかし、呼び出しプロシージャーは、このフィードバック・コードではなく、 例外を介して、エラー・メッセージを受け取るように設計されています。したがって、 プロシージャーは CEEDOD への呼び出し時に、フィードバック・コード のパラメーターが省略されたことを指示しなければなりません。
*OMIT の使用例については、サンプル・サービス・プログラムを参照してください。
パラメーターを省略するもう 1 つの方法は、単に呼び出しでこれを省略するという やり方です。呼び出されたプロシージャーはこれを予定している必要があり、このことは、 そのプロシージャーがプロトタイプで指示されなければならないことを意味します。 プロトタイプのパラメーターを呼び出しで渡す必要がないことを指示するために 、対応するパラメーター定義にキーワード OPTIONS(*NOPASS) を指定してくだ さい。 最初の *NOPASS 以降のすべてのパラメーターにも OPTIONS(*NOPASS) を指定しな ければならないことに注意してください。
*NOPASS と *OMIT の両方を同じパラメーターに任意の順序で、すなわち OPTIONS(*NOPASS:*OMIT) または OPTIONS(*OMIT:*NOPASS) のどちらでも 指定することができます。
OPTIONS(*NOPASS) の例として、任意指定の 3 番目のパラメーターをもつ システム API QCMDEXC (コマンドの実行) を考えてください。 このパラメーターが使えるようにするには、図 68 に示すように QCMDEXC のプロトタイプを書くことができます。
*------------------------------------------------------------- * QCMDEXC のこのプロトタイプは次の 3 つのパラメーターを定義します。 * 1- 必要な長さよりも短い * 文字フィールド * 2- 数値フィールド * 3- 任意指定の文字フィールド *------------------------------------------------------------- D qcmdexc PR EXTPGM('QCMDEXC') D cmd 3000A OPTIONS(*VARSIZE) CONST D cmdlen 15P 5 CONST D 3A CONST OPTIONS(*NOPASS)
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.