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++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 44
    Points : 31
    Points
    31
    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
    Points : 15 920
    Points
    15 920
    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
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 44
    Points : 31
    Points
    31
    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
    Points : 15 920
    Points
    15 920
    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 régulier 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
    Points : 99
    Points
    99
    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 : 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
    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 averti
    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
    Points : 307
    Points
    307
    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
    Points : 15 920
    Points
    15 920
    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 averti
    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
    Points : 307
    Points
    307
    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, 17h49
  2. Réponses: 9
    Dernier message: 14/10/2005, 19h32
  3. retourné un tableau
    Par elekis dans le forum C++
    Réponses: 5
    Dernier message: 17/03/2005, 16h03
  4. [plpgsql] comment retourner un tableau
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 22h09
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 16h06

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