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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [serialisation] CList, Vector, fonctionnement
    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.

    Dans ma classe Document j'ai une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CList<Cemprunteur> listeEmprunteur
    Mon but est de serialiser cette liste.
    Seulement ma classe contient des variables membres, mais aussi un vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CGage> tabG
    Qu'est ce que j'ai fait jusque la :

    1- Appel de la méthode serialize de ma classe Emprunteur à partir de la méthode serialize de ma classe Document.
    2- Surcharge de l'operateur = pour ma classe emprunteur
    3- définition d'un constructeur par recopie pour ma classe emprunteur
    4- Définition de ma méthode serialize dans ma classe Emprunteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void CEmprunteur::Serialize(CArchive& ar)
    {
     
    	if (ar.IsStoring())
    	{
    		// TODO : ajoutez ici le code de stockage
     
    		//sauvegarde des variables membres
    		ar << this->Nom;
    		ar << this->Prenom;
    		ar << this->Adresse;
    		ar << this->Telephone;
     
    		//sauvegarde du tableau de gage (Vector)
    		/*ar << this->tabG.size();
    		for (std::vector<CGage>::iterator
    			i = this->tabG.begin();
    			i != this->tabG.end();
    			++i)
    			{
    			   ar << *i;
    			}*/
    	}
    	else
    	{
    		// TODO : ajoutez ici le code de chargement
    		ar >> this->Nom;
    		ar >> this->Prenom;
    		ar >> this->Adresse;
    		ar >> this->Telephone;
     
    		/*WORD w;
    		//reccupération du vector de gage
    		this->tabG.clear();
    		ar >> taille;
     
    		CGage g;
    		this->tabG.reserve(taille);
    		for (int i = 0; i < taille; ++i)
    		{
    			ar >> g;
    			this->tabG.push_back(g);
    		}*/
    	}
    }
    Ceci en piochant à droite a gauche des explications, seulement je me retrouve avec pas mal d'erreurs de compilation du genre :

    Error 1 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const CEmprunteur' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxtempl.h 977

    Et de plus je ne suis absolument pas sur que toute ma CList sera serialisée de cette manière.
    N'y aurait-il pas une méthode précise pour ce genre de cas ? La Faq ne m'aide pas vraiment, je ne comprend pas ce qui est expliqué.....

    Je vous remercie des réponses apportées.

  2. #2
    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
    bonsoir ,
    une CList ne se declare pas comme ça voir la doc MSDN.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<Cemprunteur, Cemprunteur &> listeEmprunteur;
    j'ai repondu il n' y a pas longtemps sur ce meme sujet sur le forum.
    afxtempl.h est a mettre dans stdafx.h si ce n'est pas le cas.

    [edit]je viens de verifier en plus c'est a toi que j'ai répondu

  3. #3
    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
    Oups, je pensais pas que cela avait une influence aussi néfaste. Merci beaucoup. Cela m'a parmit d'enlever pas mal d'erreurs.
    J'ai corrigé cela, me reste une erreur sur les bras lors de l'edition des liens :

    Error 2 error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CEmprunteur::GetRuntimeClass(void)const " (?GetRuntimeClass@CEmprunteur@@UBEPAUCRuntimeClass@@XZ) Emprunteur.obj

    Que je ne comprend absolument pas....
    Sinon est ce que ma méthode pour sérialiser est correcte ?

  4. #4
    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
    ta classe doit utiliser la macro DECLARE_SERIAL,
    voir faq:http://c.developpez.com/faq/vc/?page...HowToSerialize

  5. #5
    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
    C'est déjà fait...

    Enfin j'ai juste rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE_SERIAL (CEmprunteur)
    au début de ma classe CEmprunteur, c'est bien ca ? Rien d'autre à faire ?

    En fait je ne comprend pas ou il faut que j'écrive ces lignes de code par rapport à la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<> void AFXAPI SerializeElements<CItem> (CArchive& ar, CItem* pElements, int nCount);
     
    // la gestion d'un tableau de cette classe .
    typedef CArray<CItem,CItem&> CArrayItem;
     
    // Source.........................
    //---------------------------------------------------------------------------------------
    // definition de la methode de serialisation de l'objet CItem pour le template CArray.
    template <>  void AFXAPI SerializeElements <CItem> ( CArchive& ar, 
        CItem* pItem, int nCount )
    {
        for ( int i = 0; i < nCount; i++, pItem++ )            
            pItem->Serialize( ar );    
    }

  6. #6
    Membre expérimenté
    Avatar de Nicolas Bauland
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 119
    Par défaut
    Une question probablement bebete mais pourquoi melanger des classes MFC (CList) et STL (vector) ? Ne serait-il pas plus judicieux de tout basculer en MFC et de faire une liste également a la place du vector ?

  7. #7
    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
    et le IMPLEMENT_SERIAL tu l'as mis ?

  8. #8
    Membre expérimenté
    Avatar de Nicolas Bauland
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 119
    Par défaut
    Citation Envoyé par samtheh
    Enfin j'ai juste rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE_SERIAL (CEmprunteur)
    au début de ma classe CEmprunteur, c'est bien ca ? Rien d'autre à faire ?
    Oui, absolument.
    Citation Envoyé par samtheh
    En fait je ne comprend pas ou il faut que j'écrive ces lignes de code par rapport à la FAQ.
    Je pense que dans ton cas tu n'en as pas besoin.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par farscape
    bonsoir ,
    une CList ne se declare pas comme ça voir la doc MSDN.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<Cemprunteur, Cemprunteur &> listeEmprunteur;
    j'ai repondu il n' y a pas longtemps sur ce meme sujet sur le forum.
    afxtempl.h est a mettre dans stdafx.h si ce n'est pas le cas.

    [edit]je viens de verifier en plus c'est a toi que j'ai répondu
    Pour être précis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class TYPE, class ARG_TYPE = const TYPE&>
    class CList : public CObject
    Par défaut, la référence est const. Donc, si on ne modifie pas les éléments (et les sérialiser, c'est les modifier ), c'est pareil.
    Mais là, comme on les modifie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    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
    Et donc cela change quoi ?
    Une réponse claire s-il te plait pour un novice ?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En fait, je me préparais à dire à farscape qu'il avait tord, puisqu'il y avait un paramètre par défaut, puis je me suis rendu compte qu'il avait raison.

    donc, si tu as encore une CList< CEmprunteur >, il faut effectivement que tu changes pour que la sérialisation compile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    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
    Ce changement a déjà été fait.
    Cela me corrige de nombreuses erreurs mais cette erreur subsiste :

    Error 2 error LNK2001: unresolved external symbol "public: virtual struct CRuntimeClass * __thiscall CEmprunteur::GetRuntimeClass(void)const " (?GetRuntimeClass@CEmprunteur@@UBEPAUCRuntimeClass@@XZ) Emprunteur.obj

  13. #13
    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...

  14. #14
    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.

  15. #15
    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....


  16. #16
    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

  17. #17
    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...

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