Integrierte Funktion %PARMS

Die zurückgegebene Anzahl der Parameter der integrierten Funktion (%PARMS) gibt die Anzahl der Parameter zurück, die an das Programm übergeben wurden, in dem %PARMS verwendet wird.

Die integrierte Funktion %PARMS kann überall dort verwendet werden, wo CL einen arithmetischen Ausdruck unterstützt. %PARMS kann alleine oder als Teil eines komplexeren arithmetischen Ausdrucks verwendet werden. Beispiel: %PARMS kann verwendet werden, um die Anzahl der Parameter, die an das Programm übergeben wurden, mit einer numerischen CL-Variablen im Parameter COND eines Befehls IF oder WHEN zu vergleichen. %PARMS kann auch verwendet werden, um den Wert eines CL-Befehlsparameters festzulegen, wenn das zugehörige Befehlsobjekt den Parameter mit EXPR (*YES) und TYPE von *DEC, *INT2, *INT4, *UINT2oder *UINT4definiert.

Das Format der Anzahl der zurückgegebenen Parameter der integrierten Funktion lautet wie folgt:
%PARMS()

Wenn %PARMS in einem Programm verwendet wird, das von einem gebundenen Aufruf aufgerufen wurde, ist der von %PARMS zurückgegebene Wert nicht verfügbar, wenn das aufrufende Programm oder die aufrufende Prozedur keinen minimalen Operationsdeskriptor übergibt. Das ILE CL-oder ILE RPG-Umwandlungsprogramm übergibt immer eine, andere Sprachen jedoch nicht. Wenn der Aufrufende also in einer anderen ILE-Sprache geschrieben ist, muss er einen Operationsdeskriptor an den Aufruf übergeben. Wenn der Operationsdeskriptor nicht übergeben wird, kann der von %PARMS zurückgegebene Wert nicht anerkannt werden. Der von %PARMS zurückgegebene Wert ist -1, wenn das System feststellen kann, dass der Betriebsdeskriptor nicht übergeben wurde, aber in einigen Fällen, in denen das System dies nicht feststellen kann, kann der von %PARMS zurückgegebene Wert ein falscher Wert sein, der Null oder größer ist.

Die folgenden Beispiele beziehen sich auf die Rückgabe der integrierten Parameterfunktion:

  • Gibt die Anzahl der Parameter zurück, wenn das Programm von einem Programmaufruf von CALLaufgerufen wurde. Der Name des folgenden Programms lautet 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
    Die Ausgabe des obigen Programms lautet:
    3 parms were passed in
    parm3: -123
    parm2: OUTERPGM
    parm1: 123.45
  • Gibt die Anzahl der Parameter zurück, wenn das Programm von einem gebundenen Aufruf von CALLPRCaufgerufen wurde. Verwenden Sie weiterhin das Programm PARMSTESTS im obigen Beispiel.
                 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
    Die Ausgabe des obigen Programms lautet:
    1 parm was passed in
    parm1: 123.45
  • Gibt die Anzahl der Parameter zurück, wenn das Programm von einer anderen ILE-Sprache, z. B. ILE C, aufgerufen wurde. Verwenden Sie im obigen Beispiel immer noch das Programm 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;
    }
    Die Ausgabe des obigen Programms lautet:
    3 parms were passed in
    parm3: -123
    parm2: OUTERPGMC
    parm1: 123.45
  • Wird der Sonderwert *OMIT für einen Parameter in der Parameterliste in einem gebundenen Aufruf von CALLPRCangegeben, wird die Anzahl von *OMIT in der zurückgegebenen Anzahl von Parametern von %PARMS gezählt. Fügen Sie MONMSG MCH3601 vor der ersten Ausführungsanweisung in PARMSTESTS hinzu.
                 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
    Die Ausgabe des obigen Programms lautet:
    3 parms were passed in
    Pointer not set for location referenced.
    Pointer not set for location referenced.
    parm1: 123.45