PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Structure et inférence de type
Structure et inférence de type
Iniciado por JLV, 09,abr. 2020 10:33 - 6 respuestas
Miembro registrado
4 mensajes
Publicado el 09,abril 2020 - 10:33
Bonjour,

Lorsque j'utilise l'inférence de type avec une variable structure le type de la nouvelle variable (stNewPersonne) est bien déduit du paramètre servant de référence stPersonne (et la valeur de stPersonne est copiée dans la nouvelle variable) mais et c'est la que se situe mon problème la valeur de la nouvelle variable (stNewPersonne) est copiée dans le paramètre servant de référence (stPersonne). La procédure ne pourra jamais renvoyer VRAI. Ce comportement ne semble pas correspondre à la description de l'aide sur l'inférence de type (https://doc.pcsoft.fr/fr-FR/?3087003&3087003)

"Lors d'une affectation par référence, la valeur de la variable de référence n'est pas copiée dans la nouvelle variable mais la nouvelle variable pointe sur la variable de référence.
Dans ce cas, si la variable qui sert de référence est modifiée, la nouvelle variable est aussi modifiée."

Avez-vous déjà rencontré ce problème et comment l'avez-vous résolu ?

Merci d'avance

code appelant :

//structure
STPersonne est une Structure
sNom est une chaîne
FIN

//variable et initialisation
stClient est une STPersonne
stClient.sNom = "DUPOND"

//appel procedure
RENVOYER NewPersonne(stClient)

procedure :

PROCÉDURE NewPersonne(stPersonne)

soit stNewPersonne <- stPersonne
stNewPersonne.sNom = "DURAND"

SI stNewPersonne.sNom <> stPersonne.sNom ALORS
RENVOYER Vrai
SINON
RENVOYER Faux
FIN
Miembro registrado
386 mensajes
Popularité : +13 (13 votes)
Publicado el 09,abril 2020 - 14:23
Bonjour,

> (et la valeur de stPersonne est copiée dans la nouvelle variable)

Je pense qu'il y a confusion. Vous utilisez l'opérateur "<-", vous faites donc une affectation par référence. Comme l'indique la documentation, Il n'y a pas de copie des valeurs de stPersonne dans stNewPersonne : les deux font référence à la même plage mémoire. Par conséquent, si vous modifiez une valeur dans cette plage mémoire, les deux variables sont affectées.

Si vous souhaitez que stNewPersonne ait le même type que stPersonne, mais sa propre plage de mémoire, faites une affectation par copie, avec l'opérateur "<=".

Vous pouvez vous référer également à cette page pour la différence entre les différents opérateurs d'affectation : https://doc.pcsoft.fr/fr-FR/?1515003
Miembro registrado
4 mensajes
Publicado el 09,abril 2020 - 15:59
Merci Benjamin
Je comprend un peu mieux mon problème ...
mais l'affectation par copie n'y répond pas en effet (après test) pour que je puisse faire une affectation par copie de stNewPersonne il faut que je déclare DANS la procédure que stNewPersonne est une STPersonne avant de faire stNewPersonne <= stPersonne. Windev n'accepte pas
" soit stNewPersonne <= stPersonne ".
Miembro registrado
505 mensajes
Popularité : +18 (18 votes)
Publicado el 09,abril 2020 - 18:44
Bonjour,
Dans le cas de l'inférence de type, l'affectation par copie est l'opérateur " = " .
J'ai réalisé un test avec un type structure et, à l'exécution, le type de structure est bien "inféré" pour la nouvelle variable.
:-)
Publicado el 09,abril 2020 - 22:19
J'ai déjà eu quelques soucis avec inférence de type ... Alors je code à l'ancienne :-D


Fonction NewPersonne(p_stPersonne est une STPersonne) : boolean
Local
stPersonne est une STPersonne = p_stPersonne
stNewPersonne est une STPersonne
bResult est un boolean = faux

stNewPersonne.sNom = "DURAND"

SI stNewPersonne.sNom <> stPersonne.sNom ALORS bResult = Vrai

Renvoyer(bResult)
Publicado el 09,abril 2020 - 22:20
J'ai déjà eu quelques soucis avec inférence de type ... Alors je code à l'ancienne :-D


Fonction NewPersonne(p_stPersonne est une STPersonne) : boolean
Local
stPersonne est une STPersonne = p_stPersonne
stNewPersonne est une STPersonne
bResult est un boolean = faux

stNewPersonne.sNom = "DURAND"

SI stNewPersonne.sNom <> stPersonne.sNom ALORS bResult = Vrai

Renvoyer(bResult)
Miembro registrado
4 mensajes
Publicado el 10,abril 2020 - 08:19
=JBO= a écrit :
Bonjour,
Dans le cas de l'inférence de type, l'affectation par copie est l'opérateur " = " .
J'ai réalisé un test avec un type structure et, à l'exécution, le type de structure est bien "inféré" pour la nouvelle variable.


Merci JBO, c'est effectivement ça :o
Et merci aussi autres contributeurs