PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Type variable entier dans une procédure
Type variable entier dans une procédure
Débuté par Dabdab, 16 oct. 2019 17:49 - 3 réponses
Posté le 16 octobre 2019 - 17:49
Bonjour,

Pouvez-vous m'éclairer sur un point svp?

Si je défini une procédure comme ci-dessous
maProc(nEntier est un entier):entier
RENVOYER nEntier++

et que je l'appelle ailleurs dans mon code en lui passant une chaîne de caractère, je n'ai pas d'erreur ni à la compilation ni à l'exécution et la chaîne est remplacée par l'entier 0 du coup ma procédure renvoie 1

C'est un bug ou une "fonctionnalité" ?
Membre enregistré
511 messages
Popularité : +18 (18 votes)
Posté le 17 octobre 2019 - 13:47
Bonjour Dabdab,

Quelques commentaires sur la syntaxe du WLangage et sa validation par le compilateur.

Ici, dans la procédure maProc(), le paramètre formel nEntier est passé par référence.
Si lors de l'appel de cette procédure le paramètre effectif est ...
• une variable de type chaîne, alors il y a une erreur de compilation.
• une variable d'un autre type numérique (par exemple un entier sur 8 octets), le compilateur valide la syntaxe, mais il y aura une erreur de type à l'exécution.
• une chaîne littérale, alors le compilateur décide d'un passage de paramètre par valeur et applique une conversion implicite de type de données.

Pour la conversion (implicite ou explicite) d'une chaîne de caractères vers un type numérique (ici un entier)...
si la chaîne commence par des caractères numériques, ils sont utilisés pour déterminer la valeur de nEntier. A défaut de caractères numériques, le paramètre nEntier prend la valeur initiale d'un type entier, à savoir 0

En WLangage, l'opérateur unaire d'incrémentation n'et pas un "vrai" opérateur, car il ne retourne pas de valeur.
Donc le code ne devrait pas compiler, à cause de la ligne
RENVOYER nEntier++


Par ailleurs, dans le cas d'un passage de paramètre par référence, il est très "dangereux" de modifier la valeur du paramètre si ce n'est pas clairement l'objectif de la procédure. Autrement, on obtient un genre "d'effet de bord" non désiré sur la valeur du paramètre effectif.

Donc le mieux serait un passage de paramètre explicitement par valeur, grâce au mot-clé LOCAL. Ainsi, le fait de modifier la valeur du paramètre dans le corps de la procédure est sans conséquence sur une variable passée en paramètre effectif de cette procédure, car c'est sa valeur qui est transmise.

Procedure maProc(LOCAL nEntier est un entier) : entier
nEntier++
RENVOYER nEntier

:)
Message modifié, 17 octobre 2019 - 14:05
Membre enregistré
3 889 messages
Popularité : +227 (347 votes)
Posté le 17 octobre 2019 - 16:52
Bonjour,
C'est le comportement normal d'une chaîne quand on l'affecte à un numérique.
Il est possible de modifier ce comportement en utilisant la fonction Val.
nAffectationDirecte est entier
nAfffectationParVal est entier
sChaineTest est chaîne

sChaineTest = "45"
nAffectationDirecte=sChaineTest //Affecte 0
nAffectationParVal=Val(sChaineTest" //Affecte 45


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 17 octobre 2019 - 18:21
Je n'ai jamais testé mais dans d'autres languages il existe 2 syntaxes ++
On peut faire :

nEntier++
++nEntier

Donc soit l'incrémentation se fait apres soit avant

La différence se fera dans ce genre de cas :

RENVOYER nEntier++ // renvoi nEntier PUIS incremente nEntier
RENVOYER ++nEntier //Incremente nEntier PUIS renvoi nEntier

Ici, a tester mais je me demande si RENVOYER nEntier++ revient au meme que de faire RENVOYER vrai


D'ailleurs je ne sais pas si c'est une nouveauté 24 mais en 23 on ne peut pas faire RENVOYER n++