PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Les Incroyables de Yaka (variable structurée)
Les Incroyables de Yaka (variable structurée)
Iniciado por cnoe, 04,sep. 2007 18:49 - 3 respuestas
Publicado el 04,septiembre 2007 - 18:49
Bonjour;

Voila j'ai un deuxieme mystere a vous soumettre :

==> je definis la structure suivante :
STR_Param est une structure
Lib1, Lib2 sont des chaînes
Val1, Val2 sont des chaînes
LibCond1, LibCond2 sont des chaînes
Cond1, Cond2 sont des booléens
FIN

==> puis les variables :
TempParam, DefautParam, PersoParam sont des STR_Param

==> je lis et renseigne mes données dans chacune des variables structurées :
TANTQUE HTrouve(PARAM_REQ_Production) = Vrai

TempParam:Lib1 = PARAM_REQ_Production.Lib_Param1
TempParam:Lib2 = PARAM_REQ_Production.Lib_Param2
TempParam:Val1 = PARAM_REQ_Production.Param1
TempParam:Val2 = PARAM_REQ_Production.Param2
TempParam:LibCond1 = PARAM_REQ_Production.Lib_Condition1
TempParam:LibCond2 = PARAM_REQ_Production.Lib_Condition2
TempParam:Cond1 = PARAM_REQ_Production.Condition1
TempParam:Cond2 = PARAM_REQ_Production.Condition2

SI PARAM_REQ_Production.Type = "PERSO" ALORS
PersoParam = TempParam
SINON
DefautParam = TempParam
FIN

HLitSuivant(PARAM_REQ_Production,Requete)
FIN

et pour finir je compare les deux variables :
SI DefautParam = PersoParam ALORS
Info("idem")
TempParam = DefautParam
SINON
Info("pas idem")
TempParam = PersoParam
BTN_Param_Defaut..Etat = Grisé
FIN

MON PROBLEME : quelque soit les données memorisées dans les variables structurées, la comparaison : DefautParam = PersoParam est tjs renvoyé comme fausse.
Et ce meme si j'utilise le meme enregistrement pour renseigner les deux structures, ou meme si je renseigne les deux structures manuellement. A titre de vérification la comparaison des structures zones à zones montre pourtant que toutes les zones des deux structures sont strictement égal. Pourtant leur comparaison renvoie tjs l'etat FAUX.

Si vous avez des suggestions ... merci d'avance et bon dev.
Publicado el 04,septiembre 2007 - 19:11
Yaka a présenté l'énoncé suivant :
Bonjour;

Voila j'ai un deuxieme mystere a vous soumettre :

==> je definis la structure suivante :
STR_Param est une structure
Lib1, Lib2 sont des chaînes
Val1, Val2 sont des chaînes
LibCond1, LibCond2 sont des chaînes
Cond1, Cond2 sont des booléens
FIN

==> puis les variables :
TempParam, DefautParam, PersoParam sont des STR_Param

==> je lis et renseigne mes données dans chacune des variables structurées :
TANTQUE HTrouve(PARAM_REQ_Production) = Vrai

TempParam:Lib1 = PARAM_REQ_Production.Lib_Param1
TempParam:Lib2 = PARAM_REQ_Production.Lib_Param2
TempParam:Val1 = PARAM_REQ_Production.Param1
TempParam:Val2 = PARAM_REQ_Production.Param2
TempParam:LibCond1 = PARAM_REQ_Production.Lib_Condition1
TempParam:LibCond2 = PARAM_REQ_Production.Lib_Condition2
TempParam:Cond1 = PARAM_REQ_Production.Condition1
TempParam:Cond2 = PARAM_REQ_Production.Condition2

SI PARAM_REQ_Production.Type = "PERSO" ALORS
PersoParam = TempParam
SINON
DefautParam = TempParam
FIN

HLitSuivant(PARAM_REQ_Production,Requete)
FIN

et pour finir je compare les deux variables :
SI DefautParam = PersoParam ALORS
Info("idem")
TempParam = DefautParam
SINON
Info("pas idem")
TempParam = PersoParam
BTN_Param_Defaut..Etat = Grisé
FIN

MON PROBLEME : quelque soit les données memorisées dans les variables
structurées, la comparaison : DefautParam = PersoParam est tjs renvoyé comme
fausse. Et ce meme si j'utilise le meme enregistrement pour renseigner les
deux structures, ou meme si je renseigne les deux structures manuellement. A
titre de vérification la comparaison des structures zones à zones montre
pourtant que toutes les zones des deux structures sont strictement égal.
Pourtant leur comparaison renvoie tjs l'etat FAUX.

Si vous avez des suggestions ... merci d'avance et bon dev.


il faut faire une égalité membre à membre

--
Cordialement JeAn-PhI
Publicado el 04,septiembre 2007 - 19:12
Bonjour...

A mon avis (ie sans tester), le problème vient du fait que les membres
de la structure sont des chaînes...

Or une chaîne, en WinDev a une longueur variable 'à la volée'... Ce qui
signifie que la seule chose 'stockable' dans la structure est l'adresse
de la chaîne pour chaque membre...

A partir de la, la comparaison des membres donne égalité (on compare des
chaînes), mais la comparaison des structures donne toujours une
différence, car on compare en fait une suite d'adresses de chaînes
clairement différentes les unes des autres.

Bien sur, je n'ai pas écrit le compilo (ou plutôt l'interpréteur)
WinDev, mais en termes de structures sous-jacente à la fonctionnalité,
ça me paraît logique...

Cordialement

--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com/index_FR.html


Yaka wrote:
Bonjour;

Voila j'ai un deuxieme mystere a vous soumettre :

==> je definis la structure suivante :
STR_Param est une structure
Lib1, Lib2 sont des chaînes
Val1, Val2 sont des chaînes
LibCond1, LibCond2 sont des chaînes
Cond1, Cond2 sont des booléens
FIN

==> puis les variables :
TempParam, DefautParam, PersoParam sont des STR_Param

==> je lis et renseigne mes données dans chacune des variables structurées :
TANTQUE HTrouve(PARAM_REQ_Production) = Vrai

TempParam:Lib1 = PARAM_REQ_Production.Lib_Param1
TempParam:Lib2 = PARAM_REQ_Production.Lib_Param2
TempParam:Val1 = PARAM_REQ_Production.Param1
TempParam:Val2 = PARAM_REQ_Production.Param2
TempParam:LibCond1 = PARAM_REQ_Production.Lib_Condition1
TempParam:LibCond2 = PARAM_REQ_Production.Lib_Condition2
TempParam:Cond1 = PARAM_REQ_Production.Condition1
TempParam:Cond2 = PARAM_REQ_Production.Condition2

SI PARAM_REQ_Production.Type = "PERSO" ALORS
PersoParam = TempParam
SINON
DefautParam = TempParam
FIN

HLitSuivant(PARAM_REQ_Production,Requete)
FIN

et pour finir je compare les deux variables :
SI DefautParam = PersoParam ALORS
Info("idem")
TempParam = DefautParam
SINON
Info("pas idem")
TempParam = PersoParam
BTN_Param_Defaut..Etat = Grisé
FIN

MON PROBLEME : quelque soit les données memorisées dans les variables structurées, la comparaison : DefautParam = PersoParam est tjs renvoyé comme fausse.
Et ce meme si j'utilise le meme enregistrement pour renseigner les deux structures, ou meme si je renseigne les deux structures manuellement. A titre de vérification la comparaison des structures zones à zones montre pourtant que toutes les zones des deux structures sont strictement égal. Pourtant leur comparaison renvoie tjs l'etat FAUX.

Si vous avez des suggestions ... merci d'avance et bon dev.

Miembro registrado
11 mensajes
Publicado el 30,abril 2019 - 15:48
En fait il s'agit d'un bug Windev toujours non corrigé à ce jour INCIDENT N°108682/664949
PATIENCE... ou vive la fonction Sérialise en attendant
Marc
;(

Voici mon protocole de test complet soumis au st pour vous aider à contourner le problème :

Type de projet :Application Windows

Détail de la demande :
Bonjour,

suite à mon appel au ST de ce jour, je reformule le problème : je veux comparer 2 variables de type Enregistrement ou Structure

par exemple :

Enreg1,Enreg2 sont des Enregistrements
SI Enreg1 = Enreg2 ALORS ...

Strct1,Struct2 sont des STRUCTUREPerso
SI Struct1 = Struct2 ALORS ...

Nota : la structure peut éventuellement avoir un membre de type enregistrement !

Cette comparaison ne fonctionne pas ou même fait planter le programme, il faut passer par une Sérialisation QUI NE MARCHE PAS DANS TOUS LES CAS !

Afin de vous illustrer le problème, j'ai réalisé quelques ligne de code à reprendre dans le protocole de reproduction que vous pourrez facilement tester par copie coller dans un projet test (juste besoin d'avoir une analyse et de changer le nom du fichier utilisé dans l'exemple).

Les commentaires du code sont suffisamment parlant

Le screenshot joint est le Trace de mon exécution de test.

CE PROBLEME EST IL EGALEMENT DANS LA VERSION 24 ? SI OUI CORRECTIF ???

Merci de votre réponse,

Cordialement,

Marc NIGRIS

Protocole de reproduction :
// *********************************************************************************
// ***** TEST n°1 : comparaison d'enregistrements
// *********************************************************************************

Enreg1,Enreg2 sont des Enregistrements de Dossiers

Enreg1.IDDossier = 1
Enreg2.IDDossier = 2

//TraceConstruit(test n°1 : Enreg1 = Enreg2 ? => %1",(Enreg1 = Enreg2))
Trace("test n° 1 : provoque un plantage du programme !")

// *********************************************************************************
// ***** TEST n°2 : comparaison directe de structure
// *********************************************************************************

STRUCTURETest est une Structure
nNum est un entier
sTxt est une chaîne
taSelect est un tableau <agrandissement=N> de booléens
FIN
stStruct1,stStruct2 sont des STRUCTURETest

AVEC stStruct1
.nNum = 1
.sTxt = "Marc"
.taSelect[1] = Vrai
FIN

AVEC stStruct2
.nNum = 1
.sTxt = "Marc"
.taSelect[1] = Vrai
FIN

TraceConstruit("test n°2 : Struct1 = Struct2 ? => %1",(stStruct1 = stStruct2))
Trace(" >> le résultat est toujours faux !")

// *********************************************************************************
// ***** TEST n°3 : comparaison d'enregistrements via sérialisation
// *********************************************************************************

B1,B2 sont des Buffers

Sérialise(Enreg1,B1,psdBinaire)
Sérialise(Enreg2,B2,psdBinaire)
TraceConstruit("test n°3 : Enreg1 = Enreg2 via Sérialisation ? => %1",(B1 = B2))
Trace(" >> le résultat est correct")


// *********************************************************************************
// ***** TEST n°4 : comparaison de structures via sérialisation
// *********************************************************************************

Sérialise(stStruct1,B1,psdBinaire)
Sérialise(stStruct2,B2,psdBinaire)
TraceConstruit("test n°4 : Struct1 = Struct2 via Sérialisation ? => %1",(B1 = B2))
Trace(" >> le résultat est correct")

// *********************************************************************************
// ***** TEST n°5 : comparaison directe de structure avec 1 membre enregistrement
// *********************************************************************************

STRUCTUREMixte est une Structure
nNum est un entier
sTxt est une chaîne
LeDossier est un Enregistrement de Dossiers
FIN
stMixte1,stMixte2 sont des STRUCTUREMixte

AVEC stMixte1
.nNum = 2
.sTxt = "Nigris"
FIN
stMixte1.LeDossier.IDDossier = 33

AVEC stMixte2
.nNum = 2
.sTxt = "Nigris"
FIN
stMixte2.LeDossier.IDDossier = 33

TraceConstruit("test n°5 : stMixte1 = stMixte2 ? => %1",(stMixte1 = stMixte2))
Trace(" >> pas de plantage mais le résultat est toujours faux !")

// *********************************************************************************
// ***** TEST n°6 : comparaison avec sérialisation et 1 membre enregistrement
// *********************************************************************************

stMixte2.LeDossier.IDDossier = 30
Sérialise(stMixte1,B1,psdBinaire)
Sérialise(stMixte2,B2,psdBinaire)

TraceConstruit("test n°6 : stMixte1 = stMixte2 via Sérialisation ? => %1",(B1 = B2))
Trace(" >> le résultat NE TIENT PAS COMPTE DU CONTENU DU MEMBRE ENREGISTREMENT comme si celui-ci n'était pas sérialisé !")

--
Marc N.
Programmeur Expert
Spécialiste des technologies PC Soft ®
Mensaje modificado, 30,abril 2019 - 15:49