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 :

Probleme vecteur d'objet changeant tout seul


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Probleme vecteur d'objet changeant tout seul
    Bonjour,
    C'est la première fois que j'écris sur un forum, c'est pour dire comme je suis désespérée !
    Alors, mon problème est un peu compliqué car j'ai pas mal de classes différentes. Je voudrais créer un vecteur de Pattern. Chaque Pattern étant composé de 2 pointeurs vers des Periodes. Ces periodes sont elles mêmes stockées dans un vecteur.
    En fait, je crée d'abord une periode que je mets dans le vecteur vectGeneralPeriode. Puis je crée toutes les autres periodes qui peuvent rentrer dans la 1ière.
    Chaque ensemble de 2 periodes forme un Pattern.
    Seulement voila, quand j'ajoute mon 3ieme pattern dans mon vecteur vectGeneralPattern, il me change les 2 premiers en me mettant d'importe quoi.

    Quelqu'un verrait-il mon erreur ?

    Voici mon code.
    Pattern.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
    #include "Periode.h"
     
    class Pattern {
     
    private:
    	int id_Pattern;
    	Periode* periodeExt;
    	Periode* periodeInt;
     
    public :
    	Pattern(int Zid, Periode* ZperiodeExt, Periode* ZperiodeInt);
    	Pattern(int Zid);
    	~Pattern();
     
    	Periode* getPeriodeExt()const{return periodeExt;}
    	Periode* getPeriodeInt()const{return periodeInt;}
    	int getId_Pattern()const;
    	void setId_Pattern(int id_Pattern);
    };
    Periode.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
    25
    class Periode {
     
    private:
    	int id_Periode;
    	time_t dateDebut;
    	time_t dateFin;
     
    public :
    	Periode(int Zid_Periode, time_t ZdateDebut, time_t ZdateFin);
    	~Periode();
     
                  int getId_Periode()const;
    	 void setId_Periode(int id_Periode) ;
     
     
    	 time_t getDateDebutTime_t() 
    	 {
    	        return dateDebut;
    	 }
    	 time_t getDateFinTime_t() 
    	 {
    	         return dateFin;
    	 }
     
    };

    lancement.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Lancement
    {
    private :
    	vector<Pattern> vectGeneralPattern;
    	vector<Periode> vectGeneralPeriode;
    public :
                 void generationPattern(Periode* periodeTravail);
    }
    et enfin, dans lancement.cpp, la fonction interessante :
    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
     
    void Lancement::generationPattern(Periode* periodeTravail)
    {
     
    	int id_Pattern=vectGeneralPattern.size(); //en principe,il n'y a aucun pattern pour l'instant
    	int id_Periode=vectGeneralPeriode.size(); // Il y a deja eu 1 periode de créée (periodeTravail)
    	Periode* pperiodeInt=NULL;
    	Periode* pperiodeExt=NULL;
    	int dureeMin=1;
    	int dureeMax=7;
    	int debutPeriode=0; finPeriode=10;
    	for (int dureeExt=dureeMin; dureeExt<=dureeMax;)
    	{
     
    		for (int pasTemps=debutPeriode; pasTemps<finPeriode-dureeExt; )
    		{
     
    			Periode periodeExt(id_Periode, pasTemps, pasTemps+dureeExt);
    			vectGeneralPeriode.push_back(periodeExt);
    			pperiodeExt = & vectGeneralPeriode[id_Periode];
    			id_Periode++;
    			for (int dureeInt=dureeMin; dureeInt<=dureeExt;)
    			{
    				for (int debutInt=pasTemps; debutInt<=pasTemps+dureeExt-dureeInt;)
    				{
    					Periode periodeInt(id_Periode, debutInt, dureeInt+debutInt);
    					vectGeneralPeriode.push_back(periodeInt);
    					pperiodeInt =& vectGeneralPeriode[id_Periode];
    					Pattern pattern0 (id_Pattern, pperiodeExt, pperiodeInt);
    					vectGeneralPattern.push_back(pattern0);
     
    					id_Pattern++;
    					id_Periode++;
    					debutInt+=PASDETEMPS;
    				}
    				dureeInt+=PASDETEMPS;
     
    			}
    			pasTemps+=PASDETEMPS;
    		}
    		dureeExt+=PASDETEMPS;
    	}
    Quand j'affiche mon vecteur de pattern après, les valeurs des periodes des 2 premiers patterns sont modifiées, et je ne comprends pas pourquoi...

    Toute aide sera la bienvenue (même les remarques sur l'utilisation des pointeurs qui n'est peut-être pas la meilleure...)
    Merci d'avance

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue sur developpez.com

    je ne comprend pas trop ce que tu veux faire, et ton code me parait compliqué pour pas grand-chose. Mais déjà, quelques remarques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Lancement::generationPattern(Periode* periodeTravail)
    {
        //...
        int debutPeriode=0; finPeriode=10;
    Ceci n'est pas correK en c++. Voici la bonne façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int debutPeriode=0;
    int finPeriode=10;
    // ou :
    int debutPeriode, finPeriode;
    debutPeriode=0;
    finPeriode=10;
    ------
    Ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Lancement::generationPattern(Periode* periodeTravail)
    {
    //...
        Periode periodeExt(id_Periode, pasTemps, pasTemps+dureeExt);
    Ici la variable 'id_Periode' n'est pas initialisée. Ton problème vient peut-être de là.

    ------
    Enfin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int dureeInt=dureeMin; dureeInt<=dureeExt;)
    {
        //...
        dureeInt+=PASDETEMPS;
    }
    Il est fortement déconseillé de procéder ainsi. La façon de faire correcte est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int dureeInt=dureeMin; dureeInt<=dureeExt; dureeInt+=PASDETEMPS)
    {
        //...
    }
    Hope it helps.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Le fait d'ajouter un élément dans vectGeneralPeriode a pour effet de rendre invalides pperiodeInt et pperiodeExt.
    Il faut que tu stockes des Periode* dans vectGeneralPeriode et que donc tu crées les Periode avec des new (et qui tu les détruises à la fin avec des delete) pour pouvoir les partager entre plusieurs conteneurs.

    MAT.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, merci pour vos réponses...

    En effet, ce que je veux faire n'est peut être pas très explicite. Je veux créer tout un tas de pattern ayant des periodes "intérieure" et "exterieure" différentes.
    Exemple si je veux créer des patterns entre 0 et 10 ayant une durée min de 3, je vais avoir
    Pattern1 : periodeExt: 0-3 periode int 0-3
    Pattern2 : periodeExt: 0-4 periode int 0-3
    Pattern3 : periodeExt: 0-4 periode int 0-4
    Pattern4 : periodeExt: 0-4 periode int 1-4
    ect...

    L'initialisation de débutPeriode et FinPeriode est en fait bien fait dans mon code, c'est juste que quand je l'ai "nettoyé" pour le mettre sur le forum, j'ai enlevé un peu trop de truc ! id_periode et id_pattern sont également initialisé avant mes boucles.
    Pour le for, en effet, c'est mieux comme ça !

    Je peux en effet mettre des pointeurs dans vectPeriode, c'est peut-être ce qu'il y a de plus simple...Mais les pointeurs, moins j'en ai, mieux je me porte ! Alors s'il existe une autre solution...

  5. #5
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    je n'ai pas regardé ton code en détail, mais si j'en crois Mat007, le problème viendrait des push_back(). Il faut savoir que lorsque tu fais un push_back() dans un vecteur, ce dernier peut être déplacé en mémoire. En effet, admettons que ton vecteur puisse contenir 10 éléments, et que tu essayes d'en ajouter un onzième ; ce qu'il se passe alors, c'est que la méthode push_back() va allouer plus de mémoire ailleurs, et recopier le contenu du vecteur au nouvel emplacement avant d'ajouter le nouvel élément. Résultat, toutes les variables qui pointaient vers des éléments du vecteur pointent maintenant vers un emplacement mémoire où il peut y avoir n'importe quoi !

    Deux solutions sont possibles pour éviter cela :
    - la méthode proposée par Mat007 (allocation dynamique), en faisant bien attention de libérer la mémoire quand tu n'en as plus besoin.
    - ou bien t'arranger pour que ton vecteur n'ait jamais besoin d'être redimensionné. Apparemment, tu connais à l'avance le nombre de périodes que ton vecteur va contenir. Tu peux donc créer un vecteur qui ait immédiatement la bonne taille, soit grâce au constructeur, soit grâce à la méthode resize. J'attire cependant ton attention sur le fait que ton vecteur sera alors rempli de Periodes "vides" : il faudra donc fournir un constructeur par défaut (sans paramètres) pour la classe Periode.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bon bah j'ai utilisé la méthode des pointeurs pour le vecteur vectGeneralPeriode. Pour l'instant, ça marche donc tant mieux. Il ne me reste plus qu'à faire attention à la désallocation.

    En tout cas, merci à tous.

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Une chose primordiale quand tu manipule des pointeurs, c'est de toujours de te poser la question: "qui possède cet objet?" dit autrement: "Qui doit se charger de créer l'objet? Qui doit se charger de détruire cet objet?"
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

Discussions similaires

  1. [XL-2010] Probleme de date qui se convertit toute seule
    Par sebing dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2013, 10h10
  2. Probleme pc : ma tour reboot toute seule !
    Par blob51100 dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 03/12/2012, 20h01
  3. Probleme de joins, il ne fait pas la liaison tout seul
    Par speed034 dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 02/03/2011, 01h23
  4. Probleme à l'ouverture le fichier excel se ferme tout seul
    Par geraldferri dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/04/2009, 14h28
  5. opengl : probleme vecteur local a un objet
    Par lanael dans le forum OpenGL
    Réponses: 3
    Dernier message: 02/01/2007, 18h36

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