|
FOROS PROFESIONALES WINDEV, WEBDEV y WINDEV Mobile |
| | | | | |
| 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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|