Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec vector::erase()

Sujet résolu
    3 août 2007 à 11:45:00

    Salut à tous.
    Alors voila mon problème :
    J'ai une classe qui possède un vector :

    class CGestion_Information_Fiches
    {
        private :
            int Nb_Fiches;
            std::vector<CInformation_Fiche>* Information_Fiche;
        /*...*/
    }
     


    Quand je supprime le dernier élément de mon vecteur, tout va bien. Mais lorsque je supprime un élément du milieu (ou même le premier d'ailleur), ca plante.

    void CGestion_Information_Fiches::Supprimer_Fiche(int index)
    {
        this->Nb_Fiches--;
        this->Information_Fiche->erase(this->Information_Fiche->begin() + index);
    }
    /*Plante ssi index != de l'index du dernier élément du vecteur*/
     

    J'ai pensé que ca vennait peut-être d'un problême dans le constructeur de copie de ma classe CInformation_Fiche, mais comme l'ajout d'élément dans le vecteur marche bien je ne sais pas trop.
    Si vous avez des idées et qu'il vous faut plus de code...
    Merci d'avance pour votre aide !

    edit :
    J'ai aussi pensé à faire un std::swap entre mon ieme élément et le dernier et ensuite supprimer le dernier élément mais ca marche pas non plus. (Peut-être que c'est déjà ce que fait vector::erase...)

    edit :
    En fait je pense que c'est l'implémentation de l'opérateur "=" qui merdoie.
    Alors je vous les passe. "les" car en fait ma classe CInformation_Fiche contient un vecteur de type CInformation_Table, qui elle même contient un vecteur de type CInformation_Colonne. Voila du code :

    headers :

    class CInformation_Colonne
    {
        private :
            char* Alias_Colonne;
            char* Nom_Table_BDD;
            char* Nom_Colonne_BDD;
            int Type;
        /*...*/
    }

    class CInformation_Table
    {
        private :
            char* Nom_Table;
            char* Requete;
            int Nb_Colonnes;
            bool Visuelle;
            std::vector<CInformation_Colonne>* Information_Colonne;
        /*...*/
    }

    class CInformation_Fiche
    {
        private :
            char* Nom_Fiche;
            char* Nom_BDD;
            int Nb_Tables;
            std::vector<CInformation_Table>* Information_Table;
        /*...*/
    }

    /*...*/
     


    source :

    CInformation_Colonne CInformation_Colonne::operator=(const CInformation_Colonne& copie)
    {
        this->setAlias_Colonne(copie.getAlias_Colonne());
        this->setNom_Table_BDD(copie.getNom_Table_BDD());
        this->setNom_Colonne_BDD(copie.getNom_Colonne_BDD());
        this->setType(copie.getType());
    }
    /*...*/
    CInformation_Table CInformation_Table::operator=(const CInformation_Table& copie)
    {
        *(this->Information_Colonne) = *(copie.getInfo_Colonne());

        this->setNom_Table(copie.getNom_Table());
        this->setRequete(copie.getRequete());
        this->Nb_Colonnes = copie.Nb_Colonnes;
        this->setVisuelle(copie.isVisuelle());
    }
    /*...*/
    CInformation_Fiche CInformation_Fiche::operator=(const CInformation_Fiche& copie)
    {
        *(this->Information_Table) = *(copie.getInfo_Table());

        this->setNom_Fiche(copie.getNom_Fiche());
        this->setNom_BDD(copie.getNom_BDD());
        this->Nb_Tables = copie.Nb_Tables;
        printf("\nAppel : CInformation_Fiche::operator=\n");
    }
     

    Voila je pense que quelque chose ne va pas la dedans. Alors si quelqu'un à une idée :D
    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      3 août 2007 à 16:26:28

      tu es sûr de l'endroit de l'étoile :
      std::vector<CInformation_Fiche>* Information_Fiche;
      ___________________________^

      cà devrait pas plutôt être :
      std::vector<CInformation_Fiche*> Information_Fiche;
      ou
      std::vector<CInformation_Fiche> Information_Fiche;
      • Partager sur Facebook
      • Partager sur Twitter
        3 août 2007 à 16:31:18

        salut.
        Non non c'est bien un pointeur vers un vecteur que je veux
        merci quand même
        • Partager sur Facebook
        • Partager sur Twitter
          3 août 2007 à 17:01:59

          Et sa sert à quoi d'avoir un pointeur sur un vecteur?

          On peut voir ce que fait getInfo_Colonne() et getInfo_Table()? Parce que je ne pense que tu ne copie pas les données de ton vecteur
          • Partager sur Facebook
          • Partager sur Twitter
            3 août 2007 à 17:10:07

            salut.
            Ba getInfo_Colonne et getInfo_Table me retourne le pointeur vers mon vecteur :
            header :

            std::vector<CInformation_Colonne>* getInfo_Colonne() const;
            /*...*/
            std::vector<CInformation_Table>* getInfo_Table() const;
             

            source :

            std::vector<CInformation_Colonne>* CInformation_Table::getInfo_Colonne() const
            {
                return this->Information_Colonne;
            }
            /*...*/
            std::vector<CInformation_Table>* CInformation_Fiche::getInfo_Table() const
            {
                return this->Information_Table;
            }
             

            Citation : MatteX


            On peut voir ce que fait getInfo_Colonne() et getInfo_Table()? Parce que je ne pense que tu ne copie pas les données de ton vecteur


            Je pensais qu'en faisant *(ptr_vers_vecteurA) = *(ptr_vres_vecteurB) les données du vecteur B serait copié dans le vecteur A grâce à la surcharge de l'opérateur vector::operator=. Mais je me trompe peut-être...
            Merci de votre aide
            • Partager sur Facebook
            • Partager sur Twitter
              3 août 2007 à 17:29:08

              Effectivement tu dois transférer tes données une à une...

              Une bonne technique : la méthode assign

              vector<int> v1;
              vector<int> v2;

              // ... met quelques données dans v1

              // copie des données dans le vector v2
              v2.assign( v1.begin(), v1.end() );


              Pour de la doc sur la STL regarde le lien GotAPI.com dans ma signature

              [EDIT]
              En fait je n'ai jamais vu d'opérateur = dans la classe vector...
              • Partager sur Facebook
              • Partager sur Twitter
                3 août 2007 à 18:08:35

                Je vais essayer la méthodes assign même si je pense que l'opérateur = est ici bien utilisé.
                Je regarderais aussi ta doc mais lundi car la c'est le week-end et j'y vais :D
                Merci de votre aide et à lundi alors ;)
                bon week-end
                • Partager sur Facebook
                • Partager sur Twitter
                  4 août 2007 à 1:35:10

                  Manipuler un vecteur par pointeur est complètement contre-productif.

                  Je note également quantité de pointeurs manipulés à la main. Une bonne source de problèmes. Surtout pour des char*. Utilises plutôt des std::string qui étant copiables rendront, implicitement, ta classe copiable sans que tu n'aies rien à écrire.

                  PS: tes Nb_xxx sont des infos redondantes car égales à xxx.size().
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    4 août 2007 à 6:43:31

                    et par souci d'optimisation tu peux toujours envoyer un pointeur (constant) de tes vecteurs dans tes fonctions getInfo_Table() et getInfo_Colonne() en retournant l'adresse de ton vecteur (référence)

                    const std::vector<CInformation_Table>* CInformation_Fiche::getInfo_Table() const
                    {
                        return &Information_Table;
                    }


                    De plus j'ai retiré le pointeur this puisqu'il est inutile... tu devrais prendre l'habitude de nommer tes attributs (variables membres) avec "m_" les préfixants... ainsi tu pourrais mieux discerner les membres des non-membres (et nous aussi par la même occasion ; les "this->unevar" c'est lourd : "m_unevar" c'est mieux! )
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 août 2007 à 8:46:55

                      Si la donnée ne sera jamais nulle, autant renvyer une référence constante.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                        6 août 2007 à 10:31:06

                        Bonjour à tous.
                        Alors je suis passé au string et aux références et ca marche mieux ! Donc merci pour vos conseil !
                        Par contre les string ca m'ennui un peu de devoir les utiliser, je pense que je vais fouillé encore un peu pour trouver ce qui n'allait pas avec mes char*.
                        Merci à tous pour votre aide !
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Probleme avec vector::erase()

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown