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 :

Retourner un tableau ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 44
    Par défaut Retourner un tableau ?
    Salut,

    J'aimerai retourner quelques valeurs d'une fonction mais j'ai un problème avec le fait que ma fonction retourne un tableau.

    Le tableau doit etre declaré en variable de classe ? Je vois pas bien comment faire ?

    Quelqu'un aurait un exemple de la forme qu'on doit avoir dans le .H et ds .cpp ?

    Merci

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans l'ordre, de la moins bonne solution à la meilleure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Truc* Fonction()
    {
        Truc* Tab = new Truc[Nb];
     
        return Tab;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Stocké n'importe où en dehors de la fonction (variable membre, statique, globale, ...)
    std::vector<Truc> Tab;
     
    const std::vector<Truc>& Fonction()
    {
        return Tab;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<Truc> Fonction()
    {
        std::vector<Truc> Tab(Nb);
     
        return Tab;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Fonction(std::vector<Truc>& Tab);
    {
        Tab.resize(Nb);
    }

  3. #3
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 44
    Par défaut
    merci bien

    par contre je comprend pas bien la mieilleure solution ?!

    resize ca fait quoi ?

    Edit : j'ai trouvé.

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'était juste une exemple d'utilisation. Ton tableau va en fait être passé par référence, ensuite dans la fonction tu en fais ce que tu veux.

  5. #5
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Je souhaiterais utiliser ta 1ère solution (car ça m'arrange d'utiliser un tableau dynamique plutôt qu'un vecteur), mais j'imagine qu'elle pose problème car il y a une fuite de mémoire car on ne delete pas le tableau créé avec un new dans la fonction ?

  6. #6
    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 : 45
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    c'est à toi de faire le delete dans le code appelant la fonction. faire le delete dans la fonction ne rime à rien puisqu'on cherche à retourner un pointeur sur des éléments. si on fait delete avant le retour, gros bug...

  7. #7
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Salut,
    je ne suis pas sûr qu'on puisse classer comme meilleure la solution 3 ou 4 (les deux utilisant le vector), à mon humble avis, elles sont aussi bonnes mais ne valent pas dire la même chose.

    La méthode 4 : void foo( vector<int>& temp, ... )
    veut dire, j'ai un objet temp, et je veux appliquer dessus une méthode.
    (ici non constante)

    La méthode 3 : vector<int> foo( ... )
    est plutôt une fabrique qui dit : crée moi un nouvelle objet (ici un tableau d'entier) grâce à la méthode foo.

  8. #8
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui, mais le fait est que pour la 3 on va tout de même payer une recopie supplémentaire.

  9. #9
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Un compilateur raisonnable devrait pouvoir retourner directement l'objet à créer par la fonction sans passer par une variable temporaire
    (return value optimization).

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

Discussions similaires

  1. Retourner un tableau depuis une fonction
    Par obalais dans le forum C++
    Réponses: 2
    Dernier message: 20/10/2005, 16h49
  2. Réponses: 9
    Dernier message: 14/10/2005, 18h32
  3. retourné un tableau
    Par elekis dans le forum C++
    Réponses: 5
    Dernier message: 17/03/2005, 15h03
  4. [plpgsql] comment retourner un tableau
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 21h09
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

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