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

SL & STL C++ Discussion :

iterator de vector


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut iterator de vector
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vector<Ball*>::iterator it;
    for(it=b.begin();it!=b.end();it++){
       Ball *sf=(*it);
       cout << "ball : " << sf->getName() <<endl; // fonctionne pas
    }
    Ball *sf1=b[0];
    cout << "ball : " << sf1->getName() <<endl; // fonctionne
    Je pense ne pas avoir bien compris le fonctionnement des iterator(s) de vector(s).
    Quelqu'un peut-il me dire où est la différence, dumoins pourquoi le 1ier exemple ne marche pas.

    Merci et bon weekend à tous

  2. #2
    Membre Expert

    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
    Par défaut
    Salut,

    Qu'entends-tu par ça ne fonctionne pas ?
    Parce que ça l'air correct là comme ça en 3 lignes, même si en général on écrirait sans doute plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(vector<Ball*>::const_iterator it=b.begin();it!=b.end();++it)
      ...
    Mais c'est un détail à la limite...

    MAT.

  3. #3
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    J'ai une erreur de segmentation sur l'un, et sur l'autre le nom est affiché comme souhaité.
    je posterai l'erreur demain, car je n'ai pas envie de redémarrer mon ordi(Win/linux) et ai déjà modifié le code.
    Demain, je mets l'erreur.
    Bonne soirée à tous

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Tes bout de code sont correctes.
    ton problème, ça sent l'erreur mémoire à plein nez..
    Faudra le reste de ton code pour t'aider.
    Aprés pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ball *sf1=b[0];
    cout << "ball : " << sf1->getName() <<endl;
    fonctionne et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(it=b.begin();it!=b.end();it++){
       Ball *sf=(*it);
       cout << "ball : " << sf->getName() <<endl; // fonctionne pas
    }
    Parce que t'as de la chance (ou pas, a toi de voir).Mais l'autre plantera un jour ou l'autre.
    Les erreurs mémoire génère des bug aléatoire. L'apparition du bug(qui est bien là) va dépendre si tu est en debug ou en release, de l'état de ta machine,...

  5. #5
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Parce que t'as de la chance (ou pas, a toi de voir).Mais l'autre plantera un jour ou l'autre.
    Les erreurs mémoire génère des bug aléatoire. L'apparition du bug(qui est bien là) va dépendre si tu est en debug ou en release, de l'état de ta machine,...
    J'avais pensé à un problème mémoire.
    Il vient bien du contenu du vector, pas du vector lui-même ?


    Voici ce que me dit gdb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Program received signal SIGSEGV, Segmentation fault.
    0x04ba40fa in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string ()
       from /usr/lib/libstdc++.so.6
    (gdb) up
    #1  0x0804e727 in File::getName (this=0x0) at File.C:30
    30              return this->name;
    Current language:  auto; currently c++
    (gdb) cont
    Continuing.
     
    Program terminated with signal SIGSEGV, Segmentation fault.
    The program no longer exists.
    (gdb) quit

  6. #6
    Membre Expert

    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
    Par défaut
    Citation Envoyé par je®ome Voir le message
    #1 0x0804e727 in File::getName (this=0x0) at File.C:30
    30 return this->name;
    Tu accèdes manifestement à un pointeur nul (this=0x0)...

    MAT.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Tu accèdes manifestement à un pointeur nul (this=0x0)...

    MAT.
    Je rajouterai que tu accède (surement) a une adresse memoire d'un element detruit.
    Ca marche dans un cas car la memoire n'as pas encore été réutilisé(coup de chance)
    Ilfaudrait plus de code pour t'aider

  8. #8
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Re,

    je suis en train de chercher avec valgrind, mais ce n'est pas du gateau.
    Mon code est trop long et je ne peux (ne veux) pas le mettre.

    dans Hes.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Hes
    {
       private:
       ...
       vector<Ball*> b;
       ...
    }
    après dans une méthode de la même classe hes.C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Ball *c=new Ball(name);
       b.push_pack(c);
    après dans une autre méthode, je fais ce que je vous ai montré en début de post.

    Il n'y a pas de constructeur à appeler pour un vector, ou si ?

    Merci de votre aide

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    tu fait quoi entre la fonction ou il y as :
    Ball *c=new Ball(name);
    b.push_pack(c);

    et le moment ou tu affiche?

  10. #10
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Je lis d'un pipe.
    Je crée un objet à partir de la chaine reçue du pipe.
    Ce dernier recrée deux autres objets(en appelant leur constructeur) arrivés en sérialisé par le même pipe.

  11. #11
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    A présent je ne fais plus rien d'autre entre.
    Par contre il y a d'autres processus crée avec des fork qui tourne en même temps.
    Mais leur mémoire n'est pas partagée ......
    Hmmm, ce n'est pas gagné

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par je®ome Voir le message
    Je lis d'un pipe.
    Je crée un objet à partir de la chaine reçue du pipe.
    Ce dernier recrée deux autres objets(en appelant leur constructeur) arrivés en sérialisé par le même pipe.
    Es qut u ne ferait un truc comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<AA*> vect1;
    std::vector<AA*> vect2;
    InitVect(vect1);
     
     
    vect2 =vect1
    deleteElement(vect1);
    Ici vect2 a recopie les pointeur de vect1. Qui sont invalide, car on detruit les élément pointér par vect1 et donc par vect2

  13. #13
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Non du tout, j'utilise un seul vecteur.
    Un contenu lui est inséré dans une méthode appartenant à sa classe.
    le traitement après est fait en appelant une méthode renvoyant ce vecteur, mais cela ne devrait pas jouer.

    Il n'y a pas de constructeur à appeler pour un vector, ou si ?

  14. #14
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Après d'autres essais, j'ai constaté qu'en ramenant tout dans la classe ou l'insertion se fait, ça fonctionne correctement. Ai-je quand même un problème mémoire ou pas ?
    Comment savoir ?
    valgrind ne me dit rien et gdb non plus.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par je®ome Voir le message
    Non du tout, j'utilise un seul vecteur.
    Un contenu lui est inséré dans une méthode appartenant à sa classe.
    le traitement après est fait en appelant une méthode renvoyant ce vecteur, mais cela ne devrait pas jouer.

    Il n'y a pas de constructeur à appeler pour un vector, ou si ?
    normalement non

    Citation Envoyé par je®ome Voir le message
    Après d'autres essais, j'ai constaté qu'en ramenant tout dans la classe ou l'insertion se fait, ça fonctionne correctement. Ai-je quand même un problème mémoire ou pas ?
    Comment savoir ?
    valgrind ne me dit rien et gdb non plus.
    je pense que t'as déplacer le problème (plus le même code généré)
    Ca n'as peut etre rien avoir avec cette class ton erreur mémoire. Regarde ce que tu fait entre...
    Par exemple, le nom est une string ou un tableau de char?

  16. #16
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    le nom en question est assigné à un string dans un constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Req
    {
       private:
         string name;
       public:
         Req(string n);
         string getName();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Req::Req(string n)
    {
       name=n;
    }
     
    string Req::getName()
    {
       return name;
    }
    L'appel est fait comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Req* req=new Req("nom");
    ensuite c'est passé en paramètre à une méthode d'une autre classe.
    c'est là que Ball est construit et inséré dans le vector.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ball* b=new Ball(req->getName());
    Un parcours du vector dans la même méthode affiche bien son contenu, le nom de req.
    J'ai essayé avant de ne rien faire du tout entre, mais le résultat reste le même.
    Je vais continuer à essayer de trouver avec valgrind.

    Merci

Discussions similaires

  1. [VC6 to VS2008] Pb d'Iterator de Vector
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 29/08/2008, 09h35
  2. Explication de iterator et vector
    Par Airlink dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2008, 19h51
  3. Réponses: 1
    Dernier message: 27/09/2006, 16h21
  4. [struts][iterate] problème logic:iterate avec un Vector
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 9
    Dernier message: 31/03/2004, 18h05
  5. [Struts] logic:iterate avec un Vector
    Par laurentb dans le forum Struts 1
    Réponses: 18
    Dernier message: 03/03/2004, 14h42

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