IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[serialisation] CList, Vector, fonctionnement


Sujet :

MFC

  1. #21
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ecrit plutot ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  2. #22
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    Ca compile !!

    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).

  3. #23
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par samtheh
    Bonjour à tous,

    Ayant abandonné l'option de liens avec une base de données, je me rabat sur la serialisation, normalement plus simple mais je me retrouve avec de nouveaux problèmes.
    C'est pas forcément une bonne idée; c'est moins souple pour faire des mises-à-jour et puis pour faire des tris...

  4. #24
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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.

    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.

  5. #25
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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....


  6. #26
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    rep     movsd           ;N - move all of our dwords

  7. #27
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu n'est pas remonter assez haut.
    apparemment tu utilises un memcpy avec une longueur explosée...

  8. #28
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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++

  9. #29
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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 ...

  10. #30
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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....

  11. #31
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    met un point d'arret sur cette ligne et inspecte le contenu de la variable.
    comment cette variable est affectée à l'origine ?

  12. #32
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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

  13. #33
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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.


  14. #34
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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.

  15. #35
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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...

  16. #36
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 473
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    ar >> this->Nom;
    		ar >> this->Prenom;
    		ar >> this->Adresse;
    		ar >> this->Telephone;

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/07/2010, 09h24
  2. fonctionnement de std::vector
    Par gbdivers dans le forum SL & STL
    Réponses: 14
    Dernier message: 07/09/2009, 07h37
  3. Réponses: 8
    Dernier message: 12/12/2007, 19h11
  4. serialiser une CListe
    Par samgees dans le forum C++
    Réponses: 2
    Dernier message: 22/03/2006, 22h24
  5. [Collections] Fonctionnement des Vector
    Par Ubum dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 16/03/2006, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo