Aller au contenu

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).