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

Langage C++ Discussion :

Récupérer valeurs d'un vector


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut Récupérer valeurs d'un vector
    Bonsoir à tous,

    J'ai actuellement un soucis avec les std::vector<>.

    Je m'explique, j'ai un vector de 5 pointeurs sur une de mes classes, j'arrive à utiliser les méthodes etc.. sans problèmes tant que je reste dans la fonction.

    Seul hic, j'aimerai récupérer le vector pour le passer en paramètre à une autre fonction pour un traitement différent.

    Sauriez-vous comment je peux faire pour récupérer les valeurs que je rentre dans mon vector<MaClass*> Truc dans la fonction pour rebalancer le vector rempli dans une autre fonction ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Un peu de code pour illustrer ton problème ne serait pas de trop.
    La solution triviale est de passer le vecteur par référence.
    Mais en générale, je préfère passer des itérateurs : soit des itérateurs début/fin pour un parcours, soit un itérateur d'insertion (back_insert_iterator&co).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Bonjour,

    Oui bien sûr voilà :

    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
    61
    62
    63
    64
    65
     
     
    void count_espece(/* Comment récupérer le vecteur Race ? */)
    {
        int cat = 0, dog = 0, rabbit = 0;
        string e;
        int i;
        for(i = 0; i < 5; i++)
        {
            e = Race[i]->getEspece();
            if(e == "chien")
            {
                dog++;
            }
            else if(e == "chat")
            {
                cat++;
            }
            else if(e == "lapin")
            {
                rabbit++;
            }
        }
     
        cout << "Il y a " << dog << " chiens, " << cat << " chats et " << rabbit << " lapins." << endl;
    }
     
    void aff_carac(/* Comment récupérer le vecteur Race ? */)
    {
        int i;
        for(i = 0; i < 5; i++)
        {
            Race[i]->affichage();
        }
    }
     
    void delete_ccm(/* Comment récupérer le vecteur Race ? */)
    {
        int i;
        string e;
        string s;
     
        for(i = 0; i < 5; i++)
        {
            e = Race[i]->getEspece();
            s = Race[i]->getSexe();
     
            if(e == "chien" || e == "chat")
            {
                if(s == "M")
                {
                    Race[i]->saisie(" ", 0, " ", " ");
                }
            }
        }
    }
     
    int main()
    {
        /*
        vector<Animal*> Race(5);
        insert_animal(......);        // Comment envoyer le vecteur Race ?
        Race[2]->affichage();       // Vérification si Race est bien récupéré chargé
        age_moyen(....);*/          // Comment envoyer le vecteur Race ?
    }

    Merci !

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    3DArchi t'as donné les différentes possibilités.

    Si tu débutes, le plus simple est que tu utilises des références :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void foo(const vector<Animal*>& Race) //Si tu as juste besoin du vecteur en lecture
    void goo(vector<Animal*>& Race) //Si tu as aussi besoin du vecteur en ecriture
    Ensuite tu pourras améliorer en prenant un range en entrée à la place d'une référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class Iterator>
    void foo(Iterator begin, Iterator end)
    Et si tu veux inserer des éléments dans le conteneur (et pas juste les lire et les modifier), tu peus utiliser un insert_iterator.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Merci beaucoup pour l'aide.

    Toutefois pour l'envoyer à la fonction, j'envoie le vecteur normalement ?

    A savoir par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    goo(Race); // Envoi du vecteur à la fonction goo */
     
    /*pour le récupérer en : */
     
    void goo(vector<Animal*> &Race);
    Toutefois quand j'envoie le paramètre de cette façon pas de soucis pour le récupérer par la fonction goo.

    Mais comme préciser dans mon premier post, ce que j'aimerai c'est que je puisse appeler une méthode ensuite, et que cela fonctionne, de ce genre :
    C'est bien ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    void goo(vector<Animal*> &Race) 
    {
      // Remplissage des 5 cases du vecteur
    }
    
    
    main()
    {
      goo(Race); // Envoi du vecteur à la fonction goo */
      Race[2]->methode;  /* Là je me retrouve avec un Segmentation fault
                                       alors que j'aimerai qu'il exécute la méthode methode de l'objet de la case 3 */
    }
    Merci !

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Fait voir comment tu remplis ton vecteur, tu es bien certain que les objets sur lesquels pointes les éléments du vecteur existent toujours ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Je te colle le code complet de ce que j'ai actuellement fait :


    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
     
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
     
    class Animal
    {
        private:
                string nom;
                int age;
                string sexe;
                string espece;
     
        public:
                Animal(string n = " ", int a = 0, string s = " ", string e = " ")
                {
                    nom = n;
                    age = a;
                    sexe = s;
                    espece = e;
                }
     
                void saisie()
                {
                    cout << "Quel est le nom de l'animal ? ";
                    cin >> nom;
                    cout << endl;
                    cout << "Quel est l'âge de l'animal ? ";
                    cin >> age;
                    cout << endl;
                    cout << "Quel est son sexe ? [M/F] ";
                    cin >> sexe;
                }
     
                void saisie(string n, int a, string s)
                {
                    nom = n;
                    age = a;
                    sexe = s;
                }
     
                virtual void affichage()
                {
                    cout << "L'animal s'appelle " << nom << ", il a " << age << " ans et c'est un " << sexe << endl;
                }
     
                string getNom()
                {
                  return nom;
                }
     
                int getAge()
                {
                    return age;
                }
     
                string getSexe()
                {
                    return sexe;
                }
     
                virtual string getEspece()
                {
                    return espece;
                }
    };
     
    class Chien : public Animal
    {
        private:
     
        public:
                Chien(string n = " ", int a = 0, string s = " ", string e = "chien") : Animal(n, a, s, e)
                {
     
                }
     
                void saisie()
                {
                    string n, s;
                    int a;
     
                    cout << " Quel est le nom du chien : ";
                    cin >> n;
                    cout << endl;
                    cout << " Quel est l'âge du chien : ";
                    cin >> a;
                    cout << endl;
                    cout << " Quel est le sexe du chien : ";
                    cin >> s;
                }
     
                void affichage()
                {
                    Animal::affichage();
                    cout << "L'animal est un chien" << endl;
                }
     
                string getType()
                {
                    Animal::getEspece();
                }
    };
     
    class Chat : public Animal
    {
        private:
     
        public:
                Chat(string n = " ", int a = 0, string s = " ", string e = "chat") : Animal(n, a, s, e)
                {
     
                }
     
                void saisie()
                {
     
                    string n, s;
                    int a;
     
                    cout << " Quel est le nom du chat : ";
                    cin >> n;
                    cout << endl;
                    cout << " Quel est l'âge du chat : ";
                    cin >> a;
                    cout << endl;
                    cout << " Quel est le sexe du chat : ";
                    cin >> s;
                }
     
                void affichage()
                {
                    Animal::affichage();
                    cout << "L'animal est un chat" << endl;
                }
     
                string getEspece()
                {
                    Animal::getEspece();
                }
    };
     
    class Lapin : public Animal
    {
        private:
     
        public:
                Lapin(string n = " ", int a = 0, string s = " ", string e = "lapin") : Animal(n, a, s, e)
                {
     
                }
     
                void saisie()
                {
     
                    string n, s;
                    int a;
     
                        cout << " Quel est le nom du lapin : ";
                        cin >> n;
                        cout << endl;
                        cout << " Quel est l'âge du lapin : ";
                        cin >> a;
                        cout << endl;
                        cout << " Quel est le sexe du lapin : ";
                        cin >> s;
                }
     
                void affichage()
                {
                    Animal::affichage();
                    cout << "L'animal est un lapin" << endl;
                }
     
                string getEspece()
                {
                    Animal::getEspece();
                }
    };
     
     
    void insert_animal(/* Récupération du vecteur Race */vector<Animal*> &Race)
    {
        int choix;
        int taille;
     
        //vector<Animal*> Race(5);
     
        for(int i = 0; i < 5; i++)
        {
            cout << "Entrez le type d'animal :" << endl;
            cout << "Tapez 1 pour un chien, 2 pour un chat, 3 pour un lapin" << endl;
            cin >> choix;
     
            switch(choix)
            {
                case 1:
                        {
                            Chien chien;
                            Race.push_back(&chien);
                            taille = Race.size();
                            Race[taille - 1]->saisie();
                            Race[taille - 1]->affichage();
                            break;
                        }
     
                case 2:
                        {
                            Chat chat;
                            Race.push_back(&chat);
                            taille = Race.size();
                            Race[taille - 1]->saisie();
                            Race[taille - 1]->affichage();
                            break;
                        }
     
                case 3:
                        {
                            Lapin lapin;
                            Race.push_back(&lapin);
                            taille = Race.size();
                            Race[taille - 1]->saisie();
                            Race[taille - 1]->affichage();
                            break;
                        }
            }
        }
    }
     
    void age_moyen(vector<Animal*> &Race)
    {
        int age_moy = 0, age;
     
        for(int i = 0; i < 5; i++)
        {
            age = Race[i]->getAge();
            age_moy = age_moy + age;
        }
     
        cout << "L'âge moyen de tous les animaux est : " << age_moy << " ans" << endl;
    }
     
    void count_espece(vector<Animal*> &Race/* Récupération du vecteur Race */)
    {
        int cat = 0, dog = 0, rabbit = 0;
        string e;
        int i;
        for(i = 0; i < 5; i++)
        {
            e = Race[i]->getEspece();
            if(e == "chien")
            {
                dog++;
            }
            else if(e == "chat")
            {
                cat++;
            }
            else if(e == "lapin")
            {
                rabbit++;
            }
        }
     
        cout << "Il y a " << dog << " chiens, " << cat << " chats et " << rabbit << " lapins." << endl;
    }
     
    void aff_carac(vector<Animal*> &Race/* Récupération du vecteur Race */)
    {
        int i;
        for(i = 0; i < 5; i++)
        {
            Race[i]->affichage();
        }
    }
     
    void delete_ccm(vector<Animal*> &Race/* Récupération du vecteur Race */)
    {
        int i;
        string e;
        string s;
     
        for(i = 0; i < 5; i++)
        {
            e = Race[i]->getEspece();
            s = Race[i]->getSexe();
     
            if(e == "chien" || e == "chat")
            {
                if(s == "M")
                {
                    //Race[i]->saisie(" ", 0, " ", " ");
                }
            }
        }
    }
     
    int main()
    {
        /**/
        vector<Animal*> Race(5);
        insert_animal(Race);        // Envoi en paramètre du vecteur Race
        Race[2]->affichage();       // Vérification si Race est bien récupéré chargé
        age_moyen(Race);/**/          // Envoi en paramètre du vecteur Race
    }

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Deux petit commentaires sur le début du code :
    - Oublie du destructeur virtuel (pour le code actuelle il est pas indispensable, mais étant donné les noms des classes et leur lien, il risque de le devenir, cf polymorphisme)
    - Non respect du SRP, je pense que la rôle de tes classes c'est de représenter un Animal, je ne suis pas convaincu de la pertinance de fonctions membres destinés à l'affichage.

    Pour ton problème, dans ta fonction d'insertion, tu créés des objets temporaires (Chien chien; par exemple), et tu mets leurs addresses dans ton conteneur, mais ces objets temporaires sont détruits à la sortie de la portée courrante (pour faire simple, à la sortie du bloc {} ), donc dans ton main tout les pointeurs de ton conteneur sont invalides, d'où un gros risque d'erreur à l'execution.

    Pour le corriger, je te laisse te renseigner sur l'allocation dynamique (new/delete), et en même temps sur le RAII (tu pourras utiliser des pointeurs ou conteneurs intelligents par exemple).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    Merci beaucoup pour tes précieux conseils.

    Je vais en effet me pencher sur les sujets indiqués.

    Merci, je reviendrai pour le feedback de ma réussite

  10. #10
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Ton programme plante parce que tu crées un vecteur de 5 éléments auquels tu ajoute les éléments créés (avec push_back(), qui pousse le nouvel élément à la fin du vecteur).

    Du coup, les 5 premiers éléments ne sont jamais initialisé autrement que par leur valeur par défaut. Et comme ce sont des pointeurs, cette valeur, c'est NULL.

    D'où le segfault

    Pour corriger le programme, il te suffit de créer un vecteur vide avant d'appeler tes fonctions + appliquer les corrections mentionnées par mon prédécesseur
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Par défaut
    oui c'est exactement ce que je venais de régler avec vos différents conseils.

    Et j'ai enfin réussi à réaliser ce que je désirais et je vous en remercie !

    A bientôt et bonne soirée !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/05/2007, 00h20
  2. Récupérer valeur contrôle en dynamique via requête
    Par nicburger dans le forum Access
    Réponses: 10
    Dernier message: 15/09/2005, 15h41
  3. [ActionScript] Récupérer valeur balise <param />
    Par JohnBlatt dans le forum Flash
    Réponses: 1
    Dernier message: 18/07/2005, 14h50
  4. CR9 - Récupérer valeurs multiples d'un champ paramètre
    Par CR9-Deb dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/07/2005, 16h08
  5. récupérer valeur d'un ID après insertion
    Par rikidi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/08/2003, 22h21

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