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 :

Passer un vector en argument d'un fonction


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Par défaut Passer un vector en argument d'un fonction
    Bonjour,

    Je cherche à passer un vector en argument d'une fonction, je n'ai pas vu dans la section de la FAQ STL quelque chose pouvant m'aidier aussi je me tourne vers vous voilà le code que j'utilise dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      vector<TH1D*> SA_pTl_MCtru_histos ;
      for(int i=0 ; i<=nb_of_sa ; i++)
        {
      (...)
          SA_pTl_MCtru_histos.push_back( current_SA_histo ) ;
        }
    Et voilà à quoi ressemble la fonction dans sa déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TCanvas * Make_lla        (TH1D * data, vector<TH1D*> samples, 
    			   string * options)
    aprèes avoir fait pas mal de recherche il s'avère que le passage du voector est al source de mes problèmes, pouvaez vosu me dire comment vous feriez pour la déclaration de l afonction et le passage en argument ? Merci

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Bonjour,

    Si tu pouvais te relire avant de poster un message, ce serait bien.

    Sinon, il faut passer le std::vector par référence, et surtout pas directement :

    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
     
    void mafonction(std::vector<int> & test) {
     std::cout<<test.size();
    }
     
     
    //ou (si le vecteur n'est pas modifié)
    void mafonction2(const std::vector<int> & test) {
     std::cout<<test.size();
    }
     
     
    void appelant(void) {
      std::vector<int> vecteur;
      mafonction(vecteur);
    }

  3. #3
    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
    Citation Envoyé par millie Voir le message
    Bonjour,

    Si tu pouvais te relire avant de poster un message, ce serait bien.

    Sinon, il faut passer le std::vector par référence, et surtout pas directement :
    La raison étant qu'un passage par valeur crée une copie du vecteur, copie qui sera par la suite modifiée dans ta fonction et détruite lorsque tu sortiras de ta fonction. Un passage par référence fait référence au vecteur originel, qui n'est pas copié, et qui est donc modifié.

    A noter qu'un std::vector ne se passe jamais par valeur. Si la fonction ne le modifie pas, on lui passera une référence constant (const std::vector<>&).
    [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.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    La raison étant qu'un passage par valeur crée une copie du vecteur, copie qui sera par la suite modifiée dans ta fonction et détruite lorsque tu sortiras de ta fonction. Un passage par référence fait référence au vecteur originel, qui n'est pas copié, et qui est donc modifié.
    Merci d'avoir compléter ma réponse, j'ajouterai aussi que pour un passage par valeur, il y a appel implicite au destructeur à la fin de la fonction :

    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
     
    class A {
      public:
        virtual ~A() {
           std::cout<<"Destruction de A";
       }
    };
     
    void mafonction(A a) {
     
    }
     
    int main(void) {
     A a;
     mafonction(a);
     return 0;
    }
    On voit tout de suite deux appels au destructeur, ce qui peut de très sérieux problème.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    A noter qu'un std::vector ne se passe jamais par valeur.
    Il m'est arrivé de le faire. Mais il est vrai que c'est suffisamment rare pour que j'ajoute un commentaire précisant que c'est volontaire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Par défaut Problème fonction et vecteur référent
    Bonjour,

    Citation Envoyé par millie Voir le message

    Sinon, il faut passer le std::vector par référence, et surtout pas directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void mafonction(std::vector<int> & test) {
     std::cout<<test.size();
    }
     
    void appelant(void) {
      std::vector<int> vecteur;
      mafonction(vecteur);
    }


    Je ne suis pas sûre de vraiment comprendre.
    Dans ton code, quand tu appelles ta seconde fonction "appelant" il n'y a pas d'argument, donc pas de possibilité de "sortir" un vecteur (même par référent) Nan?

    Je suis interloqué car j'ai des problèmes avec les fonctions et les vecteurs (en référent). Voici le code pour comparer deux chaines de caractères:

    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 <vector>
     
    // comparer le mot proposé avec la solution : précise les lettres bien placées
     
    void comparateur (string mot_initial, string mot_propose, vector<int> & compare_lettre())
    {
        int taille_mot(mot_initial.size());
    //    vector<int> compare_lettre (taille_mot);
     
        for (int i(0); i<taille_mot; i++)
        {
            if (mot_initial[i]=mot_propose[i])
            {
                compare_lettre.push_back(1) ;
            }
            else
            {
                compare_lettre[i](0);
            }
        }
     
    }
    Quoi que j'écrive le compilateur m'affiche un message d'erreur.

    1er IF
    error: request for member 'push_back' in 'compare_lettre', which is of non-class type 'std::vector<int, std::allocator<int> >& (*)()'|

    2em IF
    error: too many arguments to function|

    Et si je force la taille du vecteur (ligne avec une déclaration de vecteur en commentaire)
    error: declaration of 'std::vector<int, std::allocator<int> > compare_lettre' shadows a parameter|


    J'espère que j'ai été assez claire .

  7. #7
    Invité
    Invité(e)
    Par défaut
    1er IF
    largument c'est vector<int> &toto
    et non vector<int> &toto()

    Et si je force la taille du vecteur
    shadow parameter ca veut dire que tu masques l'argument. en effet
    vector<int> compare_lettre (taille_mot); construit une nouvelle instance qui sappele comme ton vecteur.
    tu peux ecrire vector<int> compare_BOB(taille_mot); qui te crees une instance qui sappelle compare_BOB et plus de message d'erreur mais c'est un autre probleme qui n'est pas relie au premier...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Par défaut
    arggg

    C'était si simple que ça, (juste un problème de "()" )
    Ce n'est pas la même chose que si le vecteur était une fonction
    Merci à vous de m'avoir éclairé.

Discussions similaires

  1. Passer variable PHP en argument d'une fonction JS
    Par Vespiras dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 31/01/2013, 09h44
  2. Passer un vector en argument d'un fonction
    Par zeine77 dans le forum C++
    Réponses: 3
    Dernier message: 22/08/2011, 17h52
  3. passer un iterator en argument d'une fonction
    Par manitor dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/09/2009, 14h42
  4. passer un tableau en argument dans une fonction
    Par rogerio dans le forum Débuter
    Réponses: 6
    Dernier message: 30/10/2008, 12h15
  5. Passer une connexion en argument d'une fonction
    Par Zorgloub dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/02/2008, 11h52

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