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
PARMsous leCALL(ou sous*ENTRY PLIST) est le premier paramètre, et ainsi de suite. UnPARMsansCALLniPLISTniPARMjuste 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);