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 :

Suppression élément d'un tableau dynamique


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Suppression élément d'un tableau dynamique
    Salut tout le monde j'ai un petit probleme dans mon code source j’essaie de supprime une case d'un tableau dynamique de pointeur sur une class mais ca marche pas apparemment
    main.c++:
    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
    #include "vehicule.h"
    #include <vector>
    using namespace std;
    int main()
    {
       Garage a;
       vector<Vehicule*>listeVehicule;
       listeVehicule.push_back(new Voiture(15000,2000,5));
       listeVehicule.push_back(new Moto(5000,2009,150));
       listeVehicule.push_back(new Moto(10000,1980,200));
       listeVehicule.push_back(new Camion(200000,1999,700));
       listeVehicule[0]->affiche();
       listeVehicule[2]->affiche();
       a.suprimer(listeVehicule);
       listeVehicule[3]->affiche();
       for(int i=0;i<listeVehicule.size();i++)
       {
           delete listeVehicule[i];
           listeVehicule[i]=0;
       }
        return 0;
    }
    fichier.c++
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include"vehicule.h"
    #include <iostream>
    #include <vector>
    using namespace std;
    Vehicule::Vehicule()
    {
     
    }
    Vehicule::Vehicule(int prix,int annee):m_prix(prix),m_annee(annee)
    {}
    void Vehicule::affiche()const
    {
        cout << "Ceci est un vehicule coutant " << m_prix << " euros." << endl;
    }
    Vehicule::~Vehicule()
    {}
    Moto::Moto(int prix,int annee,double vitesse):Vehicule(prix,annee),m_vitesse(vitesse)
    {}
    void Moto::affiche()const
    {
          cout <<endl<<"Ceci est une moto allant a " << m_vitesse << " km/h et coutant " << m_prix << " euros." << endl;
          cout<<"Date de fabrication:"<<m_annee;
    }
    Moto::~Moto()
    {}
    Voiture::Voiture(int prix,int annee,int porte):Vehicule(prix,annee),m_porte(porte)
    {}
    void Voiture::affiche()const
    {
        cout << "Ceci est une voiture avec " << m_porte << " portes et coutant " << m_prix << " euros." << endl;
              cout<<"Date de fabrication:"<<m_annee;
    }
    Voiture::~Voiture()
    {}
    Camion::Camion(int prix,int annee,double poids):Vehicule(prix,annee),m_poids(poids)
    {}
    void Camion::affiche()const
    {
          cout <<endl<<"Ceci est une camion allant a " << m_poids << " kg et coutant " << m_prix << " euros." << endl;
               cout<<"Date de fabrication:"<<m_annee;
     
    }
    Camion::~Camion()
    {}
    Garage::Garage()
    {
     
    }
    void Garage::ajouterVoiture(int porte,int prix,int annee,std::vector<Vehicule*>&listeVehicule)
    {
    }
    void Garage::suprimer(std::vector<Vehicule*>&listeVehicule)
    {
    listeVehicule.pop_back();
    listeVehicule[3]->affiche();
    }
    Garage::~Garage()
    {
     
    }
    fichier.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
    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
    #ifndef VEHICULE_H_INCLUDED
    #define VEHICULE_H_INCLUDED
    #include<vector>
    class Vehicule
    {
     public:
     Vehicule();
     Vehicule(int prix,int annee);
     virtual void affiche()const;
     virtual ~ Vehicule();
     protected:
     int m_prix,m_annee;
    };
    class Moto:public Vehicule
    {
     public:
     Moto(int prix,int annee,double vitesse);
     virtual void affiche()const;
     virtual ~ Moto();
     private:
     double m_vitesse;
     ;
    };
    class Voiture:public Vehicule
    {
     public:
     Voiture(int prix,int annee,int porte);
     virtual void affiche()const;
     virtual ~ Voiture();
     private:
     int m_porte;
    };
    class Camion:public Vehicule
    {
     public:
     Camion(int prix,int annee,double poids);
     virtual void affiche()const;
     virtual~Camion();
     private:
     double m_poids;
    };
    class Garage
    {
     public:
     Garage();
     void ajouterVoiture(int porte,int prix,int annee,std::vector<Vehicule*>&listeVehicule);
     virtual void suprimer(std::vector<Vehicule*>&listeVehicule);
     virtual ~Garage();
     private:
    };
    #endif // VEHICULE_H_INCLUDED

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Garage::suprimer(std::vector<Vehicule*>&listeVehicule)
    {
    listeVehicule.pop_back();
    listeVehicule[3]->affiche();
    }
    Si listeVehicule a 4 éléments, pop_back n'en laisse plus que 3.
    Donc les listeVehicule[3] qui suivent font planter, c'est normal.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    desole,mais j'ai pas compris votre deuxieme phrase veuillez vous expliquez si c'est possible

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Garage::suprimer(std::vector<Vehicule*>&listeVehicule)
    {
    listeVehicule.pop_back();
    listeVehicule[3]->affiche();
    }
    Si listeVehicule a 4 éléments, pop_back n'en laisse plus que 3.
    Donc les listeVehicule[3] qui suivent font planter, c'est normal.
    Ce que veux t'expliquer cob59, c'est qu'après le pop_back tu n'as plus que trois éléments dans ta liste: listeVehicule[0], listeVehicule[1] et listeVehicule[2].

    Donc en faisant listeVehicule[3] tu veux accéder à un élément qui n'existe plus, d où le plantage.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    le probleme c'est que ca ne plante pas,je veux juste m'assurer que pop_back fait son devoir mais ca marche pas car apres affiche le message s'affiche :<

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 12
    Points
    12
    Par défaut
    Hello,

    Lorsque tu fais ton pop, tu dis à l'objet vecteur qu'il y a un élément de moins ( mais tu ne fais pas de delete, l'objet existe donc toujours).
    Ce qu'il faut savoir c'est que les éléments d'un vecteur sont alignés en mémoire.
    Donc après ton pop, quand tu utilise l'opérateur [] pour accéder à l'élément 3 celui ci existe toujours car il n'a pas été libéré.

    Pour vérifier que ton pop fait ce qu'il faut, si tu utilise Visual en mode Debug un assert "out of range" se déclenchera.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Explication courte :
    Utiliser les [] aveuglément peut conduire à ce genre de bug. La méthode std::vector::at() est équivalente mais déclenchera une erreur systématique et moins ambigue (une exception) dans ce genre de cas.

    Explication détaillée :
    Quand tu fais un appel à pop_back() sur ton vecteur, il ne "supprime" pas le dernier élément ; il se contente de réduire de 1 le compteur d'éléments du vecteur sans pour autant réduire la taille de sa "mémoire" interne. Les types qui n'ont pas de destructeur (types primitifs et pointeurs) sont même laissés tels quels : en effet, pourquoi perdrait-on du temps à les réinitialiser puisqu'ils sont inaccessibles par une utilisation régulière (donc hormis listeVehicule[3]) de std::vector ?

    Donc listeVehicule[3] accède bien au même pointeur avant et après l'appel de pop_back(). Et comme tu n'as pas appelé delete sur le contenu de listeVehicule[3] (ce qui par ailleurs constitue une fuite mémoire), l'objet Vehicule pointé existe toujours donc affiche() fonctionne sans problème.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Merci
    Merci pour vos explication ca m'a aider,merci

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

Discussions similaires

  1. Suppression élément d'un tableau
    Par pileus dans le forum C
    Réponses: 13
    Dernier message: 27/07/2022, 13h57
  2. Nombre maximal d'éléments d'un tableau dynamique
    Par Onimaru dans le forum Delphi
    Réponses: 3
    Dernier message: 24/01/2015, 12h54
  3. Réponses: 1
    Dernier message: 12/10/2014, 15h18
  4. [XL-2010] VBA - Suppression de l'élément d'un tableau dynamique à 2 dimensions
    Par thomas.r dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/05/2013, 05h55
  5. Réponses: 1
    Dernier message: 15/01/2011, 05h51

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