|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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 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++ |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|