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

Langage C++ Discussion :

renvoi de tableau dynamique par une fonction


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut renvoi de tableau dynamique par une fonction
    Bonjour,
    je débute à peine sur C++, et j'essaie de renvoyer un tableau dynamique via ma fonction que j'ai sortie de mon main
    voici sa déclaration :
    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
    #include "AppTableau.h"
     
    #include <vector>
    #include <string>
    std::vector<int> GestTabStatic(int Val, bool App, int Tab[], int Tail){
        int cpt;
        std::vector<int> tab2();
     
        if (App){
            for (int i=0;i<Tail;++i){
                if(Tab[i] > 10){
                    ++cpt;
                    tab2.push_back() = Tab[i];
                }
            }
        }else if{
            Tab[Tail]=Val;
     
        }
        return tab2;
    }
    et voici son prototype dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef APPTABLEAU_H_INCLUDED
    #define APPTABLEAU_H_INCLUDED
     
    #include <vector>
    std::vector<int> GestTabStatic(int Val, bool App, int Tab[], int Tail);
     
    #endif // APPTABLEAU_H_INCLUDED
    simplement en compilanat j'ai les messages d'erreurs suivants :
    13|error: request for member 'push_back' in 'tab2', which is of non-class type 'std::vector<int>()'|
    16|error: expected '(' before '{' token|
    20|error: could not convert 'tab2' from 'std::vector<int> (*)()' to 'std::vector<int>'|
    merci a tous

  2. #2
    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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Saut,

    std::vector<int> tab2(); déclare une fonction nommée tab2 ne prenant pas de paramètre et retournant un std::vector<int>. Pour initialiser une variable de ce type, enlève les parenthèses.
    Il serait aussi bien mieux d'utiliser vector en paramètre au lieu de ces immondes tableaux C.
    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.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    Ligne 7 : std::vector<int> tab2(); déclare une fonction tab2 retournant un vector, faire plutôt std::vector<int> tab2; ou std::vector<int> tab2{}; ou std::vector<int> tab2(0); pour définir un vecteur initialement vide.
    Ligne 13: tab2.push_back() = Tab[i]; utilise mal la fonction push_back, écrire plutôt tab2.push_back( Tab[i] );.
    Ligne 16: }else if{ ne veut rien dire par contre un simple 'sinon' s'écrit } else {.
    Ligne 20: OK (voir ligne 7)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    merci,
    la compilation est bien passée,
    mais je n'ai pas compris ce que tu veux dire par
    Il serait aussi bien mieux d'utiliser vector en paramètre au lieu de ces immondes tableaux C.
    pourrais tu me donner un exemple simple si tu peux

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,
    Citation Envoyé par cdsoft Voir le message
    merci,
    la compilation est bien passée,
    mais je n'ai pas compris ce que tu veux dire par

    pourrais tu me donner un exemple simple si tu peux
    C'est simple, crées une fonction du genre de
    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
    /* nous prenons un std::vector en paramètre d'entrée, nous renvoyons un std:vector en retour de fonction,
     * les autres paramètres ne changent pas vraiment ;)
     *
     * Mais, veux tu vraiment modifier le tableau d'origine????
     */
    std::vector<int> truc(std::vector<int> & in,bool app, int value, size_t tail){
        std::vector<int> out;
        /* on détermine ce qui est le plus petit : la taille du tableau d'entrée, ou la valeur de tail? */
        size_t max = (in.size()< tail? in.size() : tail);
        if(app){
            // on prend ce qui peut entrer dans le tableau
            for(auto i = 0;i<max;++i){
                if(in[i] < 10){
                    out.push_back(in[i]);
                }
            }
       }else{
           /* attention : tail ne peut dépasser la taille du tableau d'entrée...
            * si c'est le cas, c'est une erreur de programmation qui doit être 
            * corrigée au plus vite
            *
            * Veux tu vraiment modifier le tableau d'origine ???
            */
           assert(tail < in.size() && "index out of bound");
           in[taill] = value;
       }
        return out;
    }
    De manière générale, on veillera en effet à éviter le plus possible le recours au tableaux "C style", qu'il s'agisse de tableau dont la taille est définie à la compilation (ex int tab[15];) que nous remplacerons par l'utilisation de la classe std::array, ou pour les tableau de taille dynamique (ex int * tab = new int[15];) que nous remplacerons par la classe std::vector.

    Il n'y a, au final, que lorsqu'il faudra s'interfacer avec une bibliothèque C que nous utiliserons les tableaux C style "juste le temps nécessaire" à l'interfaçage, en les convertissant le plus vite possible "beaux tableaux C++" (std::array ou std::vector, selon le cas), et en ne faisant la conversion inverse que... pour les réinjecter dans la bibliothèque C
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    merci à tous

    je vais essayé de comprendre le code de koala01, car comme je vous l'ai dit je débute en C++
    et cela m'est encore un peut inconnu comme syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    size_t max = (in.size()< tail? in.size() : tail);
    mais bon je vois la logique, je vais aller fouiner ces commandes

    Merci

  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
    ? : est l'opérateur conditionnel ou opérateur ternaire (ternary).
    cond ? a : b est une expression, qui vaut a si cond est vrai, et b sinon.
    L'avantage, c'est que c'est une expression, que tu peux utiliser comme argument d'une fonction.

    Par exemple, au lieu d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int status;
    if ( show_debug_messages ) {
      status = interpreteur.execute_commande(commande, contexte, Interpreteur::trace_debug);
    } else {
      status = interpreteur.execute_commande(commande, contexte, Interpreteur::trace_info);
    }
    Tu peux écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int status = interpreteur.execute_commande(commande, contexte, (show_debug_messages ? Interpreteur::trace_debug : Interpreteur::trace_info);
    Nul besoin de recopier du code (et risquer une faute de copie, maintenant, ou en corrigeant un bug, plus tard), et la variable peut être déclarée constante, puisqu'elle est initialisée immédiatement.

    Dans les détails, les deux parties "résultats" doivent être de type similaire, et une seule de ces deux parties est évaluée.
    Ainsi, il n'y a pas d'erreur avec int valeur = (pointeur ? pointeur->valeur : 0);. Si pointeur est nul, il est équivalent à false, et pointeur->valeur n'est même pas appelée.
    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 régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 206
    Points : 110
    Points
    110
    Par défaut
    merci
    c 'est très intéressant
    loin d’être simple au départ mais ça me plait

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/06/2009, 18h04
  2. Réponses: 2
    Dernier message: 30/04/2009, 08h44
  3. Réponses: 6
    Dernier message: 10/01/2007, 13h16
  4. Return d'un tableau par une fonction
    Par MegaNono dans le forum C
    Réponses: 4
    Dernier message: 30/04/2006, 18h26
  5. tableau javascript ecrit par une fonction asp
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 03/11/2003, 08h38

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