%PARMS 組み込み関数
パラメーター数リターン組み込み関数 (%PARMS) は、%PARMS が使用されたプログラムに渡されたパラメーターの数を戻します。
%PARMS 組み込み関数は、CL が算術式をサポートする場合はどこでも使用できます。 %PARMS は、単独でも、より複雑な算術式の一部としても使用可能です。 例えば、IF コマンドまたは WHEN コマンドの COND パラメーターで CL 数値変数に対して、プログラムに渡されたパラメーターの数を比較する際に、%PARMS を使用することができます。 また、関連するコマンド・オブジェクトが EXPR(*YES) およびタイプ *DEC、*INT2、*INT4、*UINT2、または *UINT4 を指定してパラメーターを定義する場合、CL コマンド・パラメーターの値を設定する際にも %PARMS を使用することができます。
%PARMS()
バインド済み呼び出しで呼び出されたプログラム内で %PARMS が使用された場合、呼び出し側のプログラムまたはプロシージャーが最小限の操作記述子を渡さないと、%PARMS で戻される値は使用できません。 ILE CL コンパイラーまたは ILE RPG コンパイラーは常にそれを渡しますが、他の言語では渡しません。 そのため、呼び出し側が別の ILE 言語で作成されている場合は、呼び出しで操作記述子を渡す必要があります。 操作記述子が渡されない場合、%PARMS で戻された値は信頼できません。 操作記述子が渡されなかったことをシステムが判別できる場合、%PARMS で戻される値は -1 になります。 しかし、システムがこれを検出できないこともあり、その場合には、%PARMS で戻される値が、ゼロ以上の誤った値になる可能性があります。
以下に、パラメーター数リターン組み込み関数の例を示します。
- CALL によるプログラム呼び出しでプログラムが呼び出されたときに、パラメーター数を戻します。
以下のプログラムの名前は、PARMSTESTS です。
PGM PARM(&PARM1 &PARM2 &PARM3) DCL VAR(&PARM1) TYPE(*DEC) LEN(5 2) DCL VAR(&PARM2) TYPE(*CHAR) LEN(10) DCL VAR(&PARM3) TYPE(*INT) SELECT WHEN COND(%PARMS() *EQ 0) THEN(DO) SNDPGMMSG MSG('0 parm was passed in') GOTO LP0 ENDDO WHEN COND(%PARMS() *EQ 1) THEN(DO) SNDPGMMSG MSG('1 parm was passed in') GOTO LP1 ENDDO WHEN COND(%PARMS() *EQ 2) THEN(DO) SNDPGMMSG MSG('2 parms were passed in') GOTO LP2 ENDDO WHEN COND(%PARMS() *EQ 3) THEN(DO) SNDPGMMSG MSG('3 parms were passed in') GOTO LP3 ENDDO OTHERWISE CMD(GOTO CMDLBL(LPE)) ENDSELECT LP3: SNDPGMMSG MSG('parm3:' *BCAT %CHAR(&PARM3)) LP2: SNDPGMMSG MSG('parm2:' *BCAT &PARM2) LP1: SNDPGMMSG MSG('parm1:' *BCAT %CHAR(&PARM1)) RETURN LP0: SNDPGMMSG MSG('no parameter at all!') RETURN LPE: SNDPGMMSG MSG('error in %parm()') ENDPGM
上記プログラムの出力は、次のとおりです。PGM DCL VAR(&VARDEC) TYPE(*DEC) LEN(5 2) VALUE(123.45) DCL VAR(&VARCHAR) TYPE(*CHAR) LEN(10) + VALUE(OUTERPGM) DCL VAR(&VARINT) TYPE(*INT) VALUE(-123) CALL PGM(PARMSTESTS) PARM(&VARDEC &VARCHAR + &VARINT) ENDPGM
3 parms were passed in parm3: -123 parm2: OUTERPGM parm1: 123.45
- CALLPRC によるバインド済み呼び出しでプログラムが呼び出されたときに、パラメーター数を戻します。
上記の例のプログラム PARMSTESTS を引き続き使用します。
上記プログラムの出力は、次のとおりです。PGM DCL VAR(&VARDEC) TYPE(*DEC) LEN(5 2) VALUE(123.45) DCL VAR(&VARCHAR) TYPE(*CHAR) LEN(10) + VALUE(OUTERPGM) DCL VAR(&VARINT) TYPE(*INT) VALUE(-123) CALLPRC PRC(PARMSTESTS) PARM((&VARDEC)) ENDPGM
1 parm was passed in parm1: 123.45
- ILE C など、別の ILE 言語でプログラムが呼び出されたときに、パラメーター数を戻します。
上記の例のプログラム PARMSTESTS を引き続き使用します。
上記プログラムの出力は、次のとおりです。#include <stdlib.h> #include <stdio.h> #include <decimal.h> void PARMSTESTS (decimal(5,2)*, char*, int*); #pragma descriptor (void PARMSTESTS (void, "", void)) int main(void) { decimal(5,2) vardec = 123.45; char varchar[10] = "OUTERPGMC"; int varint = -123; PARMSTESTS(&vardec, varchar, &varint); return 0; }
3 parms were passed in parm3: -123 parm2: OUTERPGMC parm1: 123.45
- CALLPRC によるバインド済み呼び出しでパラメーター・リストのどれかのパラメーターに特殊値 *OMIT を指定した場合、
*OMIT の数は、%PARMS によるパラメーター数リターンでカウントされます。
PARMSTESTS の最初の実行ステートメントの前に MONMSG MCH3601 を追加します。
上記プログラムの出力は、次のとおりです。PGM DCL VAR(&VARDEC) TYPE(*DEC) LEN(5 2) VALUE(123.45) DCL VAR(&VARCHAR) TYPE(*CHAR) LEN(10) + VALUE(OUTERPGM) DCL VAR(&VARINT) TYPE(*INT) VALUE(-123) CALLPRC PRC(PARMSTESTS) PARM((&VARDEC) (*OMIT) (*OMIT)) ENDPGM
3 parms were passed in Pointer not set for location referenced. Pointer not set for location referenced. parm1: 123.45