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 :

faire plusieurs return avec des vectors


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut faire plusieurs return avec des vectors
    Bonjour.

    J'essaye de renvoyer plusieurs objets différents depuis une même fonction, mais cela ne semble pas fonctionner correctement. Ma facon de faire n'est probablement pas bonne. Avez vous une idée de comment il faut procéder dans ce cas là?
    Merci si vous pouvez m'aider

    Voici mon code:

    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
     
     
     
    EntiteImage Menu::renvoiEntiteImage()
    {
        m_nombreImageTotal = m_nombreImageFond + m_nombreImageBouton;
     
        m_compteurImage++;
        if(m_compteurImage > m_nombreImageTotal)
        {
        m_contientImage = false;
        m_compteurImage = 0;
        }
     
     
        if(m_compteurImage <=m_nombreImageFond)
        {
        vector<Image>::iterator it= m_fond.begin();
        return it->renvoiEntiteImage();
        }
     
        if(m_compteurImage >m_nombreImageFond)
        {
        vector<Bouton>::iterator it= m_bouton.begin();
        return it->renvoiEntiteImage();
        }
     
    }


    -

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Pourquoi ne pas renvoyer un std::vector<EntiteImage> ???

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Merci Mr Bacelar, pour votre réponse.

    En fait mon but est de convertir les objets en EntiteImage, qui ne contient que les informations nécessaire à l'affichage. Voila pourquoi je n'envoi pas des vectors, qui peuvent aussi bien être des vector<Image> que vector <Perssonage1> etc...mais simplement une EntiteImage, qui est la même pour tous. C'est pour cela que j'ai besoin de faire plusieurs return différents.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    reprenons les bases du C++
    1 fonction = 1 return
    le return se fait toujours par copie, sauf s'il s'agit d'une référence
    partant de là, vouloir "faire plusieurs return" ne veut rien dire et est strictement impossible.
    le return est typé, donc une fonction qui "retourne Image, mais aussi Personnage", "parfois l'un, parfois l'autre" est impossible (sauf à partir dans du hack à base de Any etc... bref faut pas)
    on peut éventuellement envisager du template selon le cas

    Si tu veux retourner plusieurs valeurs du même type : vector
    Si tu veux retourner plusieurs valeurs de type différent : aggrégation en struct ?

    Dans tous les cas, ton idée semble mauvaise et cache certainement une conception bancale.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Si tu veux retourner plusieurs valeurs de type différent : aggrégation en struct ?
    std::stuple, à utiliser en combo avec std::tie (et std::ignore si besoin).
    Find me on github

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Bousk, merci pour votre réponse, bien qu'un peut agressive

    Oui, bien entendu, une fonction ne renvoi qu'une seule chose. Si vous aviez lu mon code, vous auriez certainement vu que vous avez mal compris ma question qui, je le reconnais, n'est pas des mieux formulé

    Je parle ici de condition. dans mon cas, il s'agit d'un compteur d'image:

    ex: si le compteur est < x, alors renvoi Objet1->truck, s'il est supérieur à x, renvoi Objet2->truck...

    Cela marche sans aucun problème s'il s'agit de simple variables ou même objets...Mais mon problème arrive dès qu'il s'agit de renvoyer un objet contenu dans un vector<Objet>...

    Voila...

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, ton code ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int f(int arg) {
        if (arg == 0) return 0;
        if (arg > 0) return 1;
    }
    Quelle est la valeur de retour si l'argument est -1?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Quelle est la valeur de retour si l'argument est -1?
    Disons qu'elle n'est pas censé l'être, puisqu'il s'agit d'un compteur, qu'il est initialisé à zéro, et qu'il ne fait que monter...

    Je me suis dit que la meilleur solution dans mon cas, est(un peut comme dit Bousk), de créer un pointeur EntiteImage *entiteImageRelai qui prendrait la valeur de l'image concerné. Cela permet, de plus, d'avoir la sécurité, si l'argument est de -1, par ex. (cependant, dans mes test, il ne semble pas le prendre en compte) Pensez vous qu'il s'agisse d'une bonne solution ?

    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
     
     
     
    EntiteImage Afficheur::renvoiEntiteImage()
    {
        m_contienImage = false; //un bool pour dire s'il a des images à envoyer...
        *m_entiteRelai = m_image->renvoiEntiteImage(); //ici, donc la sécurité pour renvoyer quoiqu'il arrive quelque chose(mais ne marche pas?)
     
        switch (m_jeu)
        {
        case 0:
            m_contienImage = m_menu->contientImage();
            *m_entiteRelai = m_menu->renvoiEntiteImage()+m_compteurImage;
            break;
        case 1:
            m_contienImage = m_niveau1->contientImage();
            *m_entiteRelai = m_niveau1->renvoiEntiteImage()+m_compteurImage;
            break;
        }
     
        return *m_entiteRelai;
    }

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool Afficheur::renvoiEntiteImage(EntiteImage* _img)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    EntiteImage Afficheur::renvoiEntiteImage()
    {
        switch (m_jeu)
        {
        case 0:
            return m_menu->renvoiEntiteImage()+m_compteurImage;
            break;
        case 1:
            return m_niveau1->renvoiEntiteImage()+m_compteurImage;
            break;
        }
        throw Exception("Bad call");
    }
    edit:
    en plus c'est quoi cette syntaxe m_niveau1->renvoiEntiteImage()+m_compteurImage; ?
    C'est sensé retourner un EntiteImage sur un operator+ ? Par copie ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Oui.
    Comme je l'ai dit plus haut, mon but est de n'envoyer que l'objet "EntiteImage" contenu dans chaque Objet mère ("Image", "Bouton", "Personage1" etc...par ex...) a un afficheur, qui se contentera de les afficher quelque soit leur provenance...Peut être n'est-ce pas la meilleur solution du monde, mais ca marche. Je me questionne encore d'ailleurs sur le fait d'envoyer un pointeur "EntiteImage" ou un objet "EntiteImage", sachant que l'objet "EntiteImage" contient un pointeur sur une texture et un VertexArray quad (avec la SFML)...

    Pour votre code...c'est Juste...mais je cherche a faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        case 2:
            vector<Image>::iterator it = m_monImage.begin()+compteurImage;
            return it->renvoiEntiteImage();
            break;
    Ce qui, sauf erreur, ne marche pas...

    J'ai donc finalement pris, n'ayant pas de solution concrètes, le partie de faire:

    dans ma class:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        ...
    protected:
        ...
        EntiteImage *m_entiteRelai;
        ...
        vector<Bouton> m_bouton;
        vector<Bouton>::iterator m_itBouton = m_bouton.begin();
        ...
    et dans ma 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
    18
    19
    20
    21
    22
    23
    24
     
        //ici l'envoi de l'image de fond.
        // Un "compteurPrive" de bouton est calculé en fonction des images qu'il y a eu avant.
        ...
        if(m_compteurImage > m_nombreImageFond)
        {
        m_itBouton = m_bouton.begin()+m_ccompteurBoutonPrive;
        m_ccompteurBoutonPrive++;
        m_controleur = 2;
        }
        ...
        ...
        switch (m_controleur)
        {
        case 1:
            *m_entiteRelai = fond->renvoiEntiteImage();
           // return fond->renvoiEntiteImage();
            break;
        case 2:
            *m_entiteRelai = m_itBouton->renvoiEntiteImage();
     
             //return *it->renvoiEntiteImage();
            break;
        }
    Qu'en pensez vous?

    j'ai une autre question a poser: est-il dangereux de mettre un ittérator en attribut privé??

    Merci

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Que penses-tu de passer par l'accès direct?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case 2: return m_monImage.at(compteurImage).renvoiEntiteImage();
    ou si tu peux garantir le compteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case 2: return m_monImage[compteurImage].renvoiEntiteImage();
    regarde donc la documentation de la fonction

    Au passage, return quittant la fonction, il quitte aussi ton switch, rendant le break inutile.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. faire plusieur declaration avec boucle for ?
    Par debutant-1 dans le forum C
    Réponses: 4
    Dernier message: 18/05/2006, 20h19
  2. Réponses: 2
    Dernier message: 12/05/2006, 23h59
  3. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33
  4. [SELECT] Faire un select avec des champs vides
    Par MinsK dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/08/2005, 00h05
  5. Changer plusieur style avec des IDs différents?
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2005, 14h33

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