ecrit plutot ça:
:DCode:
1
2
3
4
5
6
7
8
9 #include "stdafx.h" #include <vector> #include "Chez_CSamuel_ECNajoua.h" #include "Emprunteur.h" #include ".\emprunteur.h" IMPLEMENT_SERIAL (CEmprunteur, CObject, 1)
Version imprimable
ecrit plutot ça:
:DCode:
1
2
3
4
5
6
7
8
9 #include "stdafx.h" #include <vector> #include "Chez_CSamuel_ECNajoua.h" #include "Emprunteur.h" #include ".\emprunteur.h" IMPLEMENT_SERIAL (CEmprunteur, CObject, 1)
Ca compile !! :D
Par contre j'ai un access violation : (extrait de la pile)
> Chez_CSamuel_ECNajoua.exe!memcpy_s(void * dst=0x01b60050, unsigned int sizeInBytes=7502636, const void * src=0x00c575c0, unsigned int count=7502636) Line 67 + 0x11 bytes C
Lors de l'ouverture d'un fichier (après enregistrement et fermeture de l'application). :?
C'est pas forcément une bonne idée; c'est moins souple pour faire des mises-à-jour et puis pour faire des tris...Citation:
Envoyé par samtheh
Je n'ai plus beaucoup de temps maintenant, et c'est pour une petite application.
Si je pouvais finir rapidement la persistance ca serait génial. :D
Je ne sais si je l'ai bcp dit jusque la mais merci en tout cas de vous être penchés sur mon pb. Et merci à ceux qui continuent de ce pencher dessus.;)
en ce qui concerne ton bug ,en debug il faut remonter la pile des erreurs pour voir la portion de code provoquant l'erreur.
néanmoins quelques remarques sur ton code pour la classe CEmprunteur:
-Il est préférable de declarer l'argument de l'operateur d'affection et du constructeur de copie const
-tu ne testes pas dans l'operateur d'affection que la source et la destination soit identique et tu ne vide pas ton vector<CGage> avant copie....
:D
Modifications faites.
mais lors de l'ouverture d'un fichier enregistré au préalable voici le message obtenu :
Unhandled exception at 0x00656f3a in Chez_CSamuel_ECNajoua.exe: 0xC0000005: Access violation reading location 0x00c5c000.
Il me ressort un fichier memcpy.asm avec dans la pile :
> Chez_CSamuel_ECNajoua.exe!memcpy(unsigned char * dst=0x01b60050, unsigned char * src=0x00c579a8, unsigned long count=1574703) Line 188 Asm
Ligne 188 du fichier ASM :
Code:rep movsd ;N - move all of our dwords
tu n'est pas remonter assez haut.
apparemment tu utilises un memcpy avec une longueur explosée...
:D
Je n'utilise pas de memcpy directement, donc dans quel type de commande je peux faire appel à cette fonction ?
L'élément donné est le premier de la pile (le plus récent donc), en voici quelques autres :
2 Chez_CSamuel_ECNajoua.exe!memcpy_s(void * dst=0x01b60050, unsigned int sizeInBytes=1574798, const void * src=0x00c579a8, unsigned int count=1574798) Line 67 + 0x11 bytes C
3 Chez_CSamuel_ECNajoua.exe!ATL::CSimpleStringT<char,0>::CopyChars(char * pchDest=0x01b60050, unsigned int nDestLen=1574798, const char * pchSrc=0x00c579a8, int nChars=1574798) Line 712 + 0x15 bytes C++
4 Chez_CSamuel_ECNajoua.exe!ATL::CSimpleStringT<char,0>::SetString(const char * pszSrc=0x00c579a8, int nLength=1574798) Line 656 + 0x15 bytes C++
5
Chez_CSamuel_ECNajoua.exe!ATL::CSimpleStringT<char,0>::operator=(const ATL::CSimpleStringT<char,0> & strSrc="") Line 304 C++
apparemment c'est sur l'utilisation d'un CString .
tu dois affecter une chaine à une CString en utilisant l'operateur d'affectation.
mais ta chaine d'origine ne doit pas se terminer par un \0.
d'ou la longueur trop grande du memcpy ...
:D
J'utilise que des copies de CString, je n'ai pas de copie de char * vers des strings.
Par contre en remontant un peu plus dans la pile je trouve ca :
Chez_CSamuel_ECNajoua.exe!CEmprunteur::operator=(const CEmprunteur & em={...}) Line 48 C++
A la ligne 48 de ma méthode de surcharge de l'opérateur = je fais :
Prenom est un CString.... :(Code:Prenom = em.Prenom;
met un point d'arret sur cette ligne et inspecte le contenu de la variable.
comment cette variable est affectée à l'origine ?
Cette variable est affectée à l'origine par une boite de dialogue, remplie par l'utilisateur, entre temps la valeur est réaffichée dans plusieurs boites de dialogues, dans des CListCtrl sans aucun pb, avec la bonne valeur.
Il me met des valeurs bizarres dans les variables .... :
+ Nom "ÍÍÍÍ´yÅ"
ATL::CStringT<char,StrTraitMFC<char,ATL::ChTraitsCRT<char> > >
Et voici la valeur de prenom :
- Prenom ""
ATL::CStringT<char,StrTraitMFC<char,ATL::ChTraitsCRT<char> > >
- ATL::CSimpleStringT<char,0> "" ATL::CSimpleStringT<char,0>
- m_pszData 0x007b0484 "" char *
0 char
ben de toute façon tu dois exploser la CString quelque part...
par exemple en accedant a son pointeur directeur par l'entremise de l'operateur const char *.(c'est un exemple).
comme ça pas facile de repondre sans avoir le code.
:D
Ma question est donc, vois ton les données enregistrées dans le fichier en claire ? C'est a dire que si mon champ nom contient samuel est ce que dans le fichier je vais voir samuel ou des signes bizares ?
Car mon fichier enregistré contient que des signes bizares, si cela ne doit pas etre des signes bizarres c ke mon enregistrement est bidon, donc il faut que je cherche de ce coté la.
la serialisation ne fournit pas un texte ascii pure,elle enregistre aussi la signature des classes utilisées
de plus si ton projet est en unicode le fichier resultant ne sera vraiment pas lisible...
:D
Donc comment faire pour retrouver, ou j'explose ma CString ?
En sachant que avant enregistrement il n'y aucune problème et que toutes les opérations que je fais sur mes données membres ne posent aucun problèmes.
Ensuite l'enregistrement ne produit aucune erreure. Et enfin lorsque j'essaye d'ouvrir un fichier enregistré il me fait cette erreure.
Comment vérifier qu'il m'enregistre bien les bonnes données dans le fichier ?
Pour l'erreure est produite du fait qu'il lit quelque chose d'abérant dans le fichier avec ces lignes :
Code:
1
2
3
4
5 ar >> this->Nom; ar >> this->Prenom; ar >> this->Adresse; ar >> this->Telephone;