Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Sous-programmes et appels

PARM

Décrire un paramètre

Décrit un paramètre d'un CALL (côté appelant) ou de la liste *ENTRY (côté appelé) : le nom du paramètre est dans la zone résultat, le facteur 2 donne la valeur envoyée, le facteur 1 reçoit la valeur de retour.

Syntaxe

     C                     CALL 'PROG'
     C           val.retourPARM val.envoi param lngd
     C           *ENTRY    PLIST
     C                     PARM           param lngd
Facteur 1 (18-27)
Côté appelant : zone qui reçoit la valeur du paramètre après l'appel. Elle doit avoir le même type que la zone résultat.
Facteur 2 (33-42)
Côté appelant : valeur (zone ou constante) copiée dans le paramètre avant l'appel.
Zone résultat (43-48)
Le paramètre lui-même. S'il n'est pas défini ailleurs, la longueur (49-51) et les décimales (52) le définissent ici.
Position dans la liste
Le premier PARM sous le CALL (ou sous *ENTRY PLIST) est le premier paramètre, et ainsi de suite. Un PARM sans CALL ni PLIST ni PARM juste au-dessus est refusé.
Effet
Un paramètre est passé par référence : l'appelant et l'appelé partagent la même zone en mémoire. Avant l'appel, le facteur 2 est copié dans la zone résultat ; après l'appel, la zone résultat est copiée dans le facteur 1. Ce qui compte pour l'appelé, c'est l'emplacement et la longueur qu'il déclare.

À quoi ça sert

Les PARM sont le contrat entre deux programmes : nombre, ordre, type et longueur doivent être les mêmes des deux côtés, car le système ne vérifie que leur nombre à l'appel, pas leur longueur.

Exemple 1 : Le programme appelé

     H*  PARM : programme APPELE (a compiler sous le nom Z3PARM1)
     IPSDS       SDS
     I                                     *PARMS   NBPARM
     C           *ENTRY    PLIST
     C                     PARM           HT      72
     C                     PARM           TTC     92
     C                     PARM           LIB     8
     C           NBPARM    IFLT 3
     C           'Seul'    DSPLY
     C                     ELSE
     C           HT        MULT 1.2       TTC
     C                     MOVEL'ABCDEFGH'LIB
     C                     END
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Seul

Le programme appelé reçoit un montant hors taxe, rend le montant TTC, et remplit une zone de 8 caractères. Sans paramètre (lancé seul), il se contente d'afficher Seul. Compilez-le sous le nom Z3PARM1.

Exemple 2 : Facteurs 1 et 2, et longueur trop courte

     H*  PARM : facteur 2 = valeur envoyee, facteur 1 = valeur recue
     C                     Z-ADD0         RECU    92
     C                     MOVEL'ABCDE'   ZONEA   5
     C                     MOVEL'xxxxx'   ZONEB   5
     C                     CALL 'Z3PARM1'
     C                     PARM 1000      PRIX    72
     C           RECU      PARM           RESULT  92
     C                     PARM           ZONEA
     C           PRIX      DSPLY
     C           RESULT    DSPLY
     C           RECU      DSPLY
     C           ZONEA     DSPLY
     C           ZONEB     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

 100000
   120000
   120000
ABCDE
FGHxx

Le facteur 2 1000 est copié dans PRIX avant l'appel (100000 à l'affichage : 1000,00). Le TTC revient dans RESULT et, grâce au facteur 1, aussi dans RECU. Le troisième paramètre est le piège : l'appelé écrit 8 caractères ABCDEFGH dans une zone que l'appelant a déclarée sur 5.

Le piège

Aucun contrôle de longueur à l'appel (seul le nombre de paramètres est vérifié). Dans le deuxième exemple, ZONEA fait 5 caractères et l'appelé en écrit 8 : les 3 derniers (FGH) débordent sur la zone voisine ZONEB, qui valait xxxxx et vaut maintenant FGHxx. Aucune erreur, aucun message. Copiez la liste de paramètres de l'appelé au caractère près, ou mieux, mettez-la dans un /COPY.

Un PARM isolé est refusé : sans CALL, PLIST ou PARM juste au-dessus, le compilateur donne QRG5121 (gravité 30) et ignore la ligne. Il ne faut donc rien insérer, pas même un calcul, entre deux PARM d'une même liste.

En RPG ILE full free

En RPG ILE, les paramètres se déclarent dans le prototype (dcl-pr) et dans l'interface de procédure (dcl-pi), avec leur longueur, et le compilateur vérifie la concordance. Un paramètre passé en const ou en value ne peut pas être écrasé par l'appelé.

dcl-pr calcttc extpgm('Z3PARM1');
  ht packed(7 : 2) const;
  ttc packed(9 : 2);
end-pr;

calcttc(1000 : result);