変更の始まり

%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
変更の終わり