%PADDR
Adresse d'une procédure
Renvoie un pointeur de procédure, qui permet d'appeler une procédure choisie au moment de l'exécution.
Syntaxe
%PADDR(nom-de-procédure)
%PADDR('NOM-DE-PROCEDURE')
nom-de-procédure- Le nom d'une procédure du module, ou une constante caractère en majuscules donnant le nom d'une procédure.
- Résultat
- Une valeur de type
pointer(*proc).
À quoi ça sert
Quand le traitement à appliquer dépend des données (un taux de TVA par catégorie, un contrôle par type de fichier), on évite une longue suite de select. On range dans un pointeur la procédure voulue, puis on l'appelle avec un prototype dont extproc désigne ce pointeur.
Exemple 1 : Choisir le calcul de TVA selon la catégorie
**free
// %PADDR : adresse d'une procedure, pour choisir le calcul a appeler au moment de l'execution.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s pCalcul pointer(*proc);
// Prototype d'appel : la procedure appelee est celle que designe pCalcul.
dcl-pr appliquer packed(9:2) extproc(pCalcul);
ht packed(9:2) const;
end-pr;
dcl-s ht packed(9:2) inz(200.00);
dcl-s categorie char(1);
dcl-s i int(10);
for i = 1 to 3;
select;
when i = 1;
categorie = 'N';
pCalcul = %paddr(tvaNormale);
when i = 2;
categorie = 'R';
pCalcul = %paddr('TVAREDUITE');
other;
categorie = 'E';
pCalcul = %paddr(tvaExoneree);
endsl;
snd-msg 'Categorie ' + categorie + ' : ' + %char(ht) + ' HT donne '
+ %char(appliquer(ht)) + ' TTC';
endfor;
*inlr = *on;
dcl-proc tvaNormale;
dcl-pi *n packed(9:2);
ht packed(9:2) const;
end-pi;
return ht * 1.20;
end-proc;
dcl-proc tvaReduite;
dcl-pi *n packed(9:2);
ht packed(9:2) const;
end-pi;
return ht * 1.055;
end-proc;
dcl-proc tvaExoneree;
dcl-pi *n packed(9:2);
ht packed(9:2) const;
end-pi;
return ht;
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Categorie N : 200.00 HT donne 240.00 TTC
Categorie R : 200.00 HT donne 211.00 TTC
Categorie E : 200.00 HT donne 200.00 TTC
Le prototype appliquer est lié au pointeur pCalcul par extproc(pCalcul). À chaque tour, on charge une autre procédure dans le pointeur, et le même appel appliquer(ht) donne 240,00, 211,00 puis 200,00. Le nom peut être donné directement ou par une constante en majuscules ('TVAREDUITE').
Exemple 2 : Appeler un pointeur vide
**free
// %PADDR : appeler une procedure par un pointeur qui n'a pas ete renseigne.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s pCalcul pointer(*proc);
dcl-pr appliquer packed(9:2) extproc(pCalcul);
ht packed(9:2) const;
end-pr;
snd-msg 'Pointeur nul ? ' + %char(pCalcul = *null);
snd-msg 'Resultat : ' + %char(appliquer(200));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Pointeur nul ? 1
Erreur : MCH3601 - Pointeur non défini pour position mémoire référencée.
Le pointeur n'a jamais été renseigné. Le test pCalcul = *null le montre, puis l'appel s'arrête sur MCH3601.
Le piège
Appeler un pointeur de procédure nul plante. L'appel s'arrête avec MCH3601 (exemple 2). Testez pCalcul = *null avant l'appel quand le pointeur peut ne pas avoir été chargé.