Instruction RPG full free · IBM i (AS/400) · Mots-clés de déclaration
CONST
Constantes et paramètres en lecture seule
DCL-C déclare une constante nommée ; sur un paramètre, CONST le reçoit en lecture seule, VALUE le reçoit par valeur.
Syntaxe
dcl-c NOM valeur;
dcl-c NOM const(valeur);
param type const;
param type value;
dcl-c NOM valeur- Constante nommée, de type déduit de la valeur : littéral numérique ou caractère. Elle n'occupe pas de mémoire et ne se modifie pas.
CONST (paramètre)- Le paramètre est reçu en lecture seule. L'appelant peut passer une variable, un littéral ou une expression.
VALUE (paramètre)- Le paramètre est reçu par valeur : la procédure travaille sur sa propre copie, qu'elle peut modifier sans effet sur l'appelant.
- Effet
- Aucun indicateur. Une constante nommée n'est pas modifiable. Un paramètre CONST ne peut pas être modifié par la procédure (erreur de compilation RNF5346). Un paramètre ordinaire (par référence) refuse un littéral (RNF7542).
À quoi ça sert
Les constantes nommées remplacent les nombres et textes magiques éparpillés dans le code : TAUX_TVA plutôt que 20 partout. On change la valeur à un seul endroit.
Sur les paramètres, CONST et VALUE rendent les appels souples et sûrs : avec CONST, l'appelant peut passer ttc(100) ou ttc(prix * 2 + 10) ; avec VALUE, la procédure peut se servir du paramètre comme d'une variable locale.
Exemple 1 : DCL-C et paramètres CONST
**free
// CONST : constantes nommees (DCL-C) et parametres recus en lecture seule.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-c TAUX_TVA 20;
dcl-c SOCIETE 'Armonie';
dcl-c SEUIL const(1000.50);
dcl-c MAX_LIGNES const(50);
dcl-pr ttc packed(9:2);
ht packed(9:2) const;
end-pr;
dcl-s prix packed(7:2) inz(250);
snd-msg SOCIETE + ' : TVA a ' + %char(TAUX_TVA) + ' %';
snd-msg 'Seuil : ' + %char(SEUIL) + ' / maximum : ' + %char(MAX_LIGNES);
snd-msg 'TTC d une variable : ' + %char(ttc(prix));
snd-msg 'TTC d un litteral : ' + %char(ttc(100));
snd-msg 'TTC d une expression : ' + %char(ttc(prix * 2 + 10));
*inlr = *on;
dcl-proc ttc;
dcl-pi *n packed(9:2);
ht packed(9:2) const;
end-pi;
return ht * (100 + TAUX_TVA) / 100;
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Armonie : TVA a 20 %
Seuil : 1000.50 / maximum : 50
TTC d une variable : 300.00
TTC d un litteral : 120.00
TTC d une expression : 612.00
Les constantes se lisent comme des variables. La fonction ttc accepte une variable, un littéral et une expression, car son paramètre est const.
Exemple 2 : Référence, VALUE et CONST
**free
// Parametre par reference, par VALUE et en CONST : ce que l'appelant retrouve.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr modif_ref;
n int(10);
end-pr;
dcl-pr modif_val;
n int(10) value;
end-pr;
dcl-pr lire_const;
n int(10) const;
end-pr;
dcl-s compteur int(10) inz(1);
dcl-s global int(10) inz(1);
modif_ref(compteur);
snd-msg 'Apres reference : ' + %char(compteur);
compteur = 1;
modif_val(compteur);
snd-msg 'Apres VALUE : ' + %char(compteur);
lire_const(global);
*inlr = *on;
dcl-proc modif_ref;
dcl-pi *n;
n int(10);
end-pi;
n = n + 100;
end-proc;
dcl-proc modif_val;
dcl-pi *n;
n int(10) value;
end-pi;
n = n + 100;
end-proc;
dcl-proc lire_const;
dcl-pi *n;
n int(10) const;
end-pi;
snd-msg 'Const avant : ' + %char(n);
global = 999;
snd-msg 'Const apres modification de la globale : ' + %char(n);
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Apres reference : 101
Apres VALUE : 1
Const avant : 1
Const apres modification de la globale : 999
Par référence (sans mot-clé), la procédure modifie la variable de l'appelant : 1 devient 101. Avec value, la copie est modifiée et l'original reste à 1. Pour const, voir le piège.
Le piège
Un paramètre CONST peut changer pendant l'appel. Quand l'argument a le même type que le paramètre, le compilateur peut passer l'adresse de la variable de l'appelant au lieu d'une copie. Si la procédure modifie cette variable par un autre chemin (ici une variable globale), la valeur lue dans le paramètre change aussi : le deuxième exemple affiche 1 puis 999. Pour une valeur figée, utilisez VALUE.
Deux refus de compilation constatés : modifier un paramètre CONST (RNF5346) et passer un littéral à un paramètre par référence (RNF7542).