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 :

CArray et serialization


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut CArray et serialization
    Bonjour,
    J'ai une classe CBouton associé à un CArray de CBouton dont voici la déclaration :

    Bouton.h
    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
    class CBouton : CObject
    {
    public:
    	DECLARE_SERIAL( CBouton )
    	~CBouton(){}
    	CBouton();
    	CBouton(char IdBtn, short SK, unsigned int KC);
    	CBouton(const CBouton &rItem);
    	void CopyFrom(const CBouton &Src );
    	void Clear();
    	void Serialize(CArchive& ar);
    	const CBouton& operator=(const CBouton& Src)
    	{
            CopyFrom(Src);
    		return *this;
    	}
     
    public:
    	char Id_Btn; //Id du bouton
    	short ShiftKey; //Modificateur VK_SHIFT VK_CTRL VK_ALT
    	unsigned int Key_Code; //Code de la touche Winuser.h
    };
     
    typedef CArray<CBouton,CBouton&> CBoutonArray;
    Bouton.cpp
    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
    47
    48
    49
    50
    51
    #include "stdafx.h"
    #include "Bouton.h"
     
    CBouton::CBouton(char IdBtn, short SK, unsigned int KC)
    {
    	Id_Btn=IdBtn;
    	ShiftKey=SK;
    	Key_Code=KC;
    }
    CBouton::CBouton()
    {Clear();};
    CBouton::CBouton(const CBouton &rItem)
    {
    	CopyFrom(rItem);
    }
    void CBouton::CopyFrom(const CBouton &Src )
    {
    	if(this==&Src) return;
     
    	Id_Btn=Src.Id_Btn;
    	ShiftKey=Src.ShiftKey;
    	Key_Code=Src.Key_Code;
    }
    void CBouton::Serialize(CArchive& ar)
    {    // sauvegarde
        CObject::Serialize( ar );
    	if (ar.IsStoring())
    	{
    		ar << Id_Btn << ShiftKey << Key_Code; //
    	}    
    	else
    	{
           // lecture
    		ar >> Id_Btn >> ShiftKey >> Key_Code;
    	}   
    }
     
    void CBouton::Clear()
    {
    	Id_Btn=0;
    	ShiftKey=0;
    	Key_Code=0;
    }
     
    template <> static void AFXAPI SerializeElements <CBouton> ( CArchive& ar, 
        CBouton* pItem, int nCount )
    {
    	for ( int i = 0; i < nCount; i++, pItem++ )            
            pItem->Serialize( ar );    
    }
    IMPLEMENT_SERIAL( CBouton, CObject, 0)
    Maintenant, dans une autre classe je déclare des objet CBoutonArray et je les sérialise grace à cette fontion :
    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
    void CTelUSBView::OnFileSave()
    {
    	_TCHAR Chemin[MAX_PATH];
    	CFile F_Btn;
    	CString cz_Chemin;
    	if(!SUCCEEDED(SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,SHGFP_TYPE_CURRENT,Chemin)))
    	{
    		AfxMessageBox(_T("Erreur, Pas de chemin valide pour l'application, fermeture de l'application!"),MB_OK|MB_ICONEXCLAMATION);
    		AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND,SC_CLOSE,0);
    		return;
    	}
    	cz_Chemin.Format(_T("%s\\TelUsb"),Chemin);
    	if(!F_Btn.Open(cz_Chemin+_T("\\BtnSave.tel"),CFile::modeCreate|CFile::modeWrite,NULL))
    	{
    		AfxMessageBox(_T("Erreur d'ouverture!"),MB_OK|MB_ICONEXCLAMATION);
    		return;
    	}
    	F_Btn.SeekToBegin();
    	//Sauvegarde du fichier
    	CArchive ar( &F_Btn, CArchive::store);
    	this->Serialize(ar);
    	ar.Close();
    	F_Btn.Close();
    	GetDocument()->SetModifiedFlag(FALSE);
    }
    Mon problème est que dès que j'essaie de supprimer un élément d'une CBoutonArray suite à un chargement de donnée par la fonction de sérialisation, j'obtient une erreur de violation d'accès mémoire.

    Une idée du problème ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut
    A priori, le problème viendrait que la fonction Serialize n'itialise pas le compte m_nSize du CArray.
    Pas de sauvegarde avec Serialize ??

Discussions similaires

  1. Problème avec la serialization des CArray
    Par Ange_de_coren dans le forum MFC
    Réponses: 5
    Dernier message: 23/11/2005, 13h16
  2. type serial : pb
    Par xopos dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/09/2004, 09h08
  3. [DB2 V7 & V8] equivalent du type SERIAL
    Par geoffrey_k dans le forum DB2
    Réponses: 3
    Dernier message: 05/07/2004, 14h09
  4. CArray de structure
    Par cybz dans le forum MFC
    Réponses: 4
    Dernier message: 04/04/2004, 19h05
  5. Problème de serialization
    Par bruno270579 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 30/04/2003, 18h11

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