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 :

Problème avec vector par référence


Sujet :

SL & STL C++

  1. #1
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut Problème avec vector par référence
    Alors j'ai une classe MyFrame dans laquelle j'aimerais faire.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         std::vector<MG_NOEUD*> coord;
         for (unsigned int j = 0 ; j < mai->get_nb_mg_noeud() ; j++) {
              MG_NOEUD* no = new MG_NOEUD(*mai->get_mg_noeud(j));
              coord.push_back(no);
         }
            m_glCanvas->PushNoeuds(coord); // m_glCanvas == Objet GL_MAILLAGE
           coord.clear();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> &noeuds) 
    { 
      coord_noeuds.push_back(noeuds); 
    }

    Cependant le programme plante à l'exécution donc je crois que je fais quelque chose de pas correcte avec les références

    Pourtant: je le passe par référence et le push_back fait une copie donc ca devrait être correct non!?

    Ca marchait avant car ma classe était friend et je faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_glCanvas->coord_noeuds.push_back(coord);
    Mais j'aimerais me débarasser de ce friend.

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    hello,

    on ne peut pas faire de tableaux de références.
    tu peux utiliser les pointeurs ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> * noeuds) 
    { 
      coord_noeuds.push_back(*noeuds); 
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> noeuds) 
    { 
      coord_noeuds.push_back(noeuds); 
    }

  3. #3
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Donc si je comprend bien:


    Ici PushNoeuds reçoit un pointeur (qui pointe sur le vecteur coord passé en paramètre)


    Mais quand on fait &noeuds on se trouve à insérer la référence non? Pourquoi ne fait-on pas push_back(*noeuds) (Ce sur quoi le pointeur pointe) ???



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void PushNoeuds(const std::vector<MG_NOEUD*> *);
     
     
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> * noeuds) 
    { 
    coord_noeuds.push_back(&noeuds); 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_glCanvas->PushNoeuds(coord);
    Il me dit no matching function for call to `GL_MAILLAGE:ushNoeuds(std::vector<MG_NOEUD*, std::allocator<MG_NOEUD*> >&)'


    Y'a que la fonction PushNoeuds s'attend a avoir un pointeur alors que moi j'lui donne a bouffer un vecteur normal...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par bigboomshakala
    on ne peut pas faire de tableaux de références.
    Je ne vois pas de tableau de référence dans le code donné.

    Quel est le type de coord_noeuds ?

  5. #5
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    std::vector<std::vector<MG_NOEUD*> > coord_noeuds

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est un tableau de pointeurs, pas de références, ça.

  7. #7
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Ok la ca marche après avoir essayer quelques trucs.
    Mais j'ai de la légère difficulté à comprendre le mécanisme.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    m_glCanvas->PushNoeuds(&coord);
     
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> * noeuds) { 
       coord_noeuds.push_back(*noeuds); 
    }

    En envoyant &coord en paramètre, on se trouve à passer sa référence.
    Donc la fonction PushNoeuds, recoit un pointeur. Donc le pointeur noeud pointe à l'adresse mémoire de coord (&coord).

    Lorsque je push_back ensuite je fais *noeuds pour aller chercher la valeur pointée? Donc je push_back une copie de l'élément pointé?

    J'ai bien comprit ou j'y suis pas du tout?

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par VoidSeer
    Je ne vois pas de tableau de référence dans le code donné.

    Quel est le type de coord_noeuds ?
    et ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> &noeuds) 
    { 
      coord_noeuds.push_back(noeuds); // noeud est une référence
    }

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par vdumont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    m_glCanvas->PushNoeuds(&coord);
     
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> * noeuds) { 
       coord_noeuds.push_back(*noeuds); 
    }
    En envoyant &coord en paramètre, on se trouve à passer sa référence.
    En fait, ce que tu mets dans le conteneur coord_noeuds, c'est une copie du vecteur pointé par noeud. Autan passer à la fonction une référence constante plutôt qu'un pointeur !

  10. #10
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    C'est ce que je voulais faire initialement en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> &noeuds) 
    { 
      coord_noeuds.push_back(noeuds); 
    }
    Mais ca plante à l'exécution

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    bigboomshakala -> ce n'est pas parce qu'on passe le paramètre par référence, que c'est une référence qui sera stockée dans le tableau.

    Mais ca plante à l'exécution
    Vive les debuggers...

    Ceci-dit le problème vient certainement d'ailleurs, car il est clair qu'entre le passage par adresse et le passage par référence, il y n'y a aucune différence.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Pour moi la fonction PushNoeuds est parfaitement correcte, si ça plante c'est que l'erreur est ailleurs.

    @bigboomshakala
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void GL_MAILLAGE::PushNoeuds(const std::vector<MG_NOEUD*> &noeuds) 
    { 
      coord_noeuds.push_back(noeuds);
    }
    Tous les passage de paramètres dans la STL se font par valeur. La conséquence de ce code est qu'une copie du vecteur passé par référence sera inséré dans coord_noeuds.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2008, 11h56
  2. Réponses: 2
    Dernier message: 07/12/2007, 02h19
  3. Problème avec vector<char>
    Par Fahmi06 dans le forum C++
    Réponses: 6
    Dernier message: 13/08/2007, 17h10
  4. Problème avec Vector et Iterator
    Par boudincweole10 dans le forum Langage
    Réponses: 1
    Dernier message: 08/04/2007, 07h26
  5. [EasyPHP] Fonction avec parametre par référence et EasyPHP 1.8
    Par niaxon dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 01/02/2007, 10h59

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