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

C++ Discussion :

perte de donnée


Sujet :

C++

  1. #1
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut perte de donnée
    Bonjour à tous

    Voila ma situation je possède une classe outilDessin classe abstraite et une classe dérivé classe Point(d'autre à venir), je possede également une liste chainé permettant de gérer les pointeurs sur outilDessin.
    Enfin je possede une classe composite, elle contient une liste d'objet, et permet de gérer tous ces objets (sauvegarde,restauration,ajout d'objet....)
    Maintenant mon probleme vient de la restauration d'une scene à partir d'un fichier texte
    voila un bout du code de la restauration :

    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
    int taille;
    entree>>taille;
     
    //je recupere les objets :
     
    int type;
    for (int i=1 ; i<=taille ; i++)
    {
    	entree>>type; //je recupere le type de mon objet (0 pour le point)
    	switch(type)
    	{
    		case 0 :
    		{
    			Point * P = new Point;
    			P->ecritureEntree(entree); //fonction retournant dans P le
                                                                //point récupéré du fichier
    		 	addObject(*P);
    			delete P;
    		}
     
                    ......
    	}
    }
    Voila j'ai déjà tenter beaucoup de variantes mais le problème récurrent vient du fait que la mémoire de l'objet P est désallouée donc je ne plus accéder aux valeur du point dans ma liste chainée par la suite !!!

    je vous remercie d'avance ; )
    @bientot
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faut que tu stockes des pointeurs dans ta liste ; par valeur comme tu le fais actuellement cela ne va garder que la partie outilDessin de chaque instance, et virer toute donnée spécifique à la classe dérivée.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Pourquoi fais tu un delete sur P? A partir du moment où tu l'as transféré dans ta classe conteneur, son cycle de vie est supposé être correctement géré, alors pourquoi le détruire? Surtout qu'à moins que ton objet ne soit clonable, ta classe conteneur n'a aucun moyen de le dupliquer.

    Edit: ha oui, j'avais pas vu la copie par valeur

  4. #4
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    merci a vous, cependant ma liste chainée contient des pointeurs de la classe outilDessin et je possède également une focntion qui permet de cloner mon objet point mais j'ai déja tenter de le cloner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Point  P;
    P.ecritureEntree(entree);
    addObject(P.getCopy());
    mais toujours aucun résultat, la copie est perdu et je n'ai plus d'acces aux élements de ma liste : (
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    ma liste chainée contient des pointeurs
    Ton code semble affirmer le contraire.

  6. #6
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    En effet je passe l'objet lui meme en paramètre mais je recupere son adresse de toute facon la classe outilDessin étant abstraite je ne peux que travailler avec des pointeurs sur ma liste chainée.
    Le probleme vient du fait que la mémoire attribuée à l'objet instancié (d'une classe fille) et désalloué lorsque je sors de ma fonction et donc le programme plante si j'essai d'accéder à ses données qui ont était perdu.
    J'ai pensé à créer une classe chargement qui permetrait de sauvegarder ces objets en mémoire mais j'esperais trouver un moyen plus "propre" ou efficace si possible.
    Merci pour vos réponses si quelqu'un trouve une solution je suis tout ouïe ; )
    @bientot
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    On peut voir la fonction addObject ?

  8. #8
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Bien sur en revanche je vous montre l'état dans lequel elle est actuellement mais je pense avoir un souci dans cette fonction justement
    voila le code :
    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
    void Liste::addObject(outilDessin &objet)
    {
    	//premier ajout :
    	if(!tete)
    	{
    		tete = new cellule;
    //		tete->objet = &(objet.getCopy());
    		tete->objet = &objet;
    		tete->cellule_suivante = NULL;
    		ptrCourant = tete;
    	}
    	//à partir du deuxieme objet :
    	else
    	{
    		ptrCourant->cellule_suivante = new cellule;
    		ptrCourant = ptrCourant->cellule_suivante;
    //		ptrCourant->objet = &(objet.getCopy());
    		ptrCourant->objet = &objet;
    		ptrCourant->cellule_suivante = NULL;
    	}
     
    	taille++;
    }
    voila mon probleme, ce code fonctionne mais utilise directement les objets du main donc si il sont modifié dans le main l'objet de la liste est modifié...c'est embetant =)

    si je remplace &objet par &(objet.getCopy()); (lignes en commentaire)
    j'obtient bien une copie de l'objet
    code de getCopy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Point P(*this);//j'ai implementé le constructeur par recopie
    return P;
    le souci et la je ne vois pas pourquoi c'est lorsque j'appelle cette ligne de code dans la fonction permettant de récuperer une copie d'un objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outilDessin * objTemp = &(ptr->objet->getCopy());
    ici la fonction getCopy n'est meme pas appelé alors que les adresses me semble correct après vérification au débugueur????

    P.S : S.O.S je coule sous tous ces pointeurs =)
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    code de getCopy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Point P(*this);//j'ai implementé le constructeur par recopie
    return P;
    On peut voir tout le code de getCopy ? Notamment son type de retour.

  10. #10
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    edit : désolé laurent je n'avais pas vu ta réponse la déclaration de la fonction getCopy() se trouve ici.
    Je pense que mon problème ne vient pas directement d'une erreur au niveau du code mais simplement au niveau de la conception j'ai étudié (très) vaguement les design patterns et je suppose que la solution doit s'y trouver mais j'ai encore du mal à l'utiliser j'ai par exemple essayer d'utiliser la classe composite dans le cas présent voila le schèma de mon prog :
    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
    class outilDessin //classe abstraite
    {
            ...
    	virtual outilDessin & getCopy()=0;
            ...
    };
     
    class Point : public outilDessin
    {
     
    public :
            ....
    	virtual outilDessin & getCopy(); //voir le code dans les messages précédent
           ...
    };
    Maintenant j'ai créé une liste chainée permettant de gérer des pointeurs sur les objets outilDessin :
    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
    class Liste
    {
    	cellule *ptrCourant;
    	cellule *tete;
    	int taille;
     
    	//constructeur et destructeur :
    	Liste();
    	~Liste();
     
    	//fonctions :
    	void addObject(outilDessin &); //fonction définie dans les messages précédents
    	void setKObject(outilDessin &, int);
    	void deleteFirstObject();
    	void deleteLastObject();
    	void deleteKObject(int);
    	void deleteListe();
     
     
    	friend class composite;
    };
    Et voila ma classe composite :
    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
     
    class composite
    {
    	Liste Scene;
    public :
     
    	//constructeur et destructeur :
    	composite();
    	virtual ~composite();
     
    	//fonctions :
     
    	//accesseur
    	outilDessin * getKObject(int);
    	outilDessin * getLastobject();
     
    	//modificateur de liste :
    	void addObject(outilDessin&);
    	void setKObject(outilDessin&, int);
    	void deleteLastObject();
    	void deleteKObject(int);
    	void deleteListe();
     
    	//sauvegarde/restauration
    	void SaveScene(char *);
    	void RestoreScene(char *);
    };

    Maintenant voila une des fonctions de la classe composite posant problème :
    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
    outilDessin * composite::getKObject(int k)
    {
    	int compteur=1;
    	if(k>=1 && k <= Scene.taille)
    	{
    		cellule *ptr = Scene.tete;
    		while(compteur!=k)
    		{
    			ptr = ptr->cellule_suivante;
    			compteur++;
    		}
     
    		//on obtient une copie de l'objet
    		outilDessin * objTemp = &(ptr->objet->getCopy()); //le débugueur s'arete avant d'entrer dans la fonction getCopy() !
    		return (objTemp);
    	}
    }
     
    void composite::RestoreScene(char * nomFichier)
    {
    	//supression d'une eventuelle liste :
    	Scene.deleteListe();
     
    	//ouverture du fichier :
    	fstream entree(fichier,ios::in);
     
            //on recupere la taille de la liste :
    	int taille;
    	entree>>taille;
     
    	//on recupere les objets :
    	int type;
    	for (int i=1 ; i<=taille ; i++)
    	{
    		entree>>type;
    		switch(type)
    		{
                            //ici se situe également une autre erreur puisque les
    //données sont perdues lorsqu'on sort de la fonction
    			case 0 :
    			{
    				Point  P;
    				P.ecritureEntree(entree);
    			        addObject(P.getCopy());
    			}
    		}
    	}
    }
    J'espere avoir mieux ciblé le problème... merci d'avance
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ta fonction getCopy renvoie une référence vers un objet déclaré localement, qui sera donc détruit dès la fin de la fonction.

    Mon conseil : plutôt que de t'emmêler avec des références, des pointeurs, des déréférencements et des indirections, utilise uniquement des pointeurs. Tu verras que ton code sera plus simple.

  12. #12
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    mon code sera plus simple oui mais les objets provenant du main (pour l'instant en tout cas) pourront être modifié ce qui va affecter également ma liste c'est l'inconvénient des pointeurs et donc j'espère trouver une autre solution
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce que je voulais dire, c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    outilDessin* getCopy()
    {
        return new Point(*this);
    }
     
    void Liste::addObject(outilDessin* objet)
    {
        // ...
        ptrCourant->objet = objet->getCopy();
    }
    Même si dans l'absolu il y aurait encore à redire au niveau de ta conception, au moins ça fonctionnera.

  14. #14
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    J'étais en train de creer une classe de stockage d'objet ce qui m'aurait permis d'utiliser uniquement des pointeurs ailleurs mais je ne sais pas si c'est une bonne solution... est-ce une bonne idée...? ou mieux vaut utiliser ta méthode?

    Si je puis encore abuser de ta gentillesse aurais-tu quelques conseils pour améliorer ma conception??? Je débute dans la programmation et je me casse les dents à ce niveau la
    ^^ encore merci
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Mon conseil : simplifie tout ça. La classe de base outilDessin et ses dérivées c'est bien, par contre pour les stocker une simple std::list ou autre conteneur standard suffira (puisque c'est justement sur le stockage que tu butes). Conteneur que tu pourras englober dans une classe si tu as des manipulations particulières à faire dessus.

  16. #16
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    D'acord merci beaucoup pour tes conseils je pense cependant conserver ma propre liste chainée mais plutot dans une classe template. J'ai bien pensé au liste standard mais c'est simplement pour le plaisir de la programmer moi-même, quite à faire des erreurs je pense que ca peut etre un bon exercice surtout que je débute completement pour ce qui est template. En tout cas, tout marche correctement depuis que j'ai entré : "return new Point(*this);" dans ma fonction getCopy() encore merci ^^
    bonne journée...
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC] CSocket | perte de données
    Par Grey dans le forum MFC
    Réponses: 2
    Dernier message: 24/11/2005, 10h14
  2. Perte de donnée
    Par spikto dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2005, 16h03
  3. Perte de données Firebird
    Par jeanafond dans le forum Débuter
    Réponses: 8
    Dernier message: 19/05/2005, 10h21
  4. Crash InnoDB,perte de données définitives... Info ou Intox ?
    Par Alexandre T dans le forum Administration
    Réponses: 3
    Dernier message: 17/01/2005, 10h44
  5. [JTable] Perte des données
    Par david71 dans le forum Composants
    Réponses: 8
    Dernier message: 09/01/2005, 00h37

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