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 :

renvoyer un tableau


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut renvoyer un tableau
    Bonjour à tous,
    Je voulais juste savoir si il était possible de renvoyer un tableau de valeurs à la fin d'une fonction avec l'instruction "return".
    Si oui, comment?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 117
    Points : 76
    Points
    76
    Par défaut
    eh bien je ne sais pas si c'est la meilleure solution, mais tu peux faire un pointeur vers ta variable si elle n'est pas déclarée localement à la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char coucou[10] = "coucou";
    char *test()
    {
         return coucou;
    }

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Myth_Titans
    eh bien je ne sais pas si c'est la meilleure solution, mais tu peux faire un pointeur vers ta variable si elle n'est pas déclarée localement à la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char coucou[10] = "coucou";
    char *test()
    {
         return coucou;
    }
    Les variables globales sont déconseillées.
    Soit passer un pointeur sur le tableau en paramètre.
    Soit créer dynamiquement le tableau dans la fonction.
    Ou plus simple utiliser la classe "vector".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Je vais essayer de creer un pointeur.
    Je reposterais pour vous dire si j'y arrive ou pas.

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Je viens juste d'essayer rapide avant de me coucher et voici mes premiers résultats pas tres concluant mais mieux que rien.
    crétaion du pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float * liste_val = new float[somme_effect()];
    crétion de la fonction qui rassemble 2 tableau en un seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        float liste(){
              int m=0;
              for(int i=0; i<nbvaleurs; i++){
                      for(int n=0; n<peffect[i]; n++){
                              liste_val[m]= pval[i];
                              m++;
                              }
                      }
             }
    Dans main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case 2: liste();
                              for (int i=0; i<somme_effect(); i++){
                              cout<<liste_val[i];
                              }
    La boucle for affiche le résultat voulu à l'écran mais fait tout planter part la suit et affichent une énorme série de nombre (avec plein de puissance de 10 je croit)
    Il n'y a aucun code apres la fin de la boucle for et la fin de la fonction main normale (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    system("PAUSE");
        return EXIT_SUCCESS;
    )

    Que se passe-t-il?

    PS:c'est peut etre un truc tout con mais ce soir je n'ai plus l'esprit clair....

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n=somme_effect();
    for(int i=0;i<n;i++)
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup !!!
    Mais pourquoi ne peut-on pas écrire

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Si tu fais cela, somme_effect() sera évalué à chaque tour ce boucle, ce qui est inutile. On calcule donc une fois pour toutes avant la boucle

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par seriousme
    Les variables globales sont déconseillées.
    Soit passer un pointeur sur le tableau en paramètre.
    Soit créer dynamiquement le tableau dans la fonction.
    Ou plus simple utiliser la classe "vector".
    Entre une variable globale et une allocation locale avec new on a vite choisi, car la mémoire allouée avec le new ne sera sans doute jamais libérée (en tous cas on risque de l'oublier).
    Le plus courant, c'est de passer un tableau en paramètre
    Si tu es un kamikaze, tu peux aussi retourner un tableau local, a condition de l'utiliser tout de suis après (ne pas faire d'appel de fonction ou déclaration de variable locales par exemple, car ca effacerait le tableau retourné)

  10. #10
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Dite j'au encors un problème mais cette fois fois c'est dans le code complet je pense ....
    En fait il ne fonctionne que des fois pour la médiane suivant les valeurs que je rentre aux debuts (mais lequels précisement je sais pas), les autre il se ferme directement sans rien affiché comme s'il efféctuer une fonction "quitter".
    En même il y a quelque chose que je ne comprend pas, je l'ai mi en commentaire rouge.
    Voici le code (il est peut être pas super mais bon je debute je l'ai fais comme je pouvais mais la je cale..):
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <cstdlib>
    #include <iostream>
    using namespace std;
        float somme_val();
        int somme_effect();
        float somme_totale();
        float liste();
        int nbvaleurs, choix, med;
        float moy; 
     
        float * pval = new float[nbvaleurs];
        int * peffect = new int[nbvaleurs];
        float * liste_val = new float[somme_effect()];
     
     
    int main(int argc, char *argv[])
    {
        cout<<"rentrez le nombre de valeurs differentes."<<endl;
        cin>>nbvaleurs;
     
        for(int i=0; i<nbvaleurs; i++){
                cout<<"rentrez une valeur";
                cin>>pval[i];
                cout<<"rentrez son effectif";
                cin>>peffect[i];
                }
     
        for(int i=0; i<nbvaleurs; i++){
                cout<<pval[i]<<"\t";
                }
        cout<<endl;
        for(int i=0; i<nbvaleurs; i++){
                cout<<peffect[i]<<"\t";
                }
     
        cout<<endl<<"pour calculer la moyenne tapez1, la mediane tapez2."<<endl;
        cin>>choix;
        switch(choix){
                      case 1: moy = somme_totale()/somme_effect();
                              cout<<"la moyenne est de:"<<moy<<endl;
                              break;
                      case 2: liste();//pour somme_effect impaire
                              int j = somme_effect();
                              med = ((j+1)/2)-1;//le -1 sert a cerner la bonne case du tableau.
                              cout<<"la mediane est:\t"<<liste_val[med];
     
     
                      }
        delete pval, peffect, liste_val;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
     
        float somme_val(){
                    float x;
                    for(int i=0; i<nbvaleurs; i++){
                             x += pval[i];
                             }
                     return x;
                     }
     
        int somme_effect (){
                     float x; //ici  si je met int pour correspondre au type de la fonction, la moyenne est fausse.
                     for(int i=0; i<nbvaleurs; i++){
                             x += peffect[i];
                             }
                     return x;
                     }
     
        float somme_totale(){
                       float x;
                       for(int i=0; i<nbvaleurs; i++){
                              x += pval[i] * peffect[i];
                              }
                       return x;
                       }
     
        float liste(){
     
              int m= 0;
              for(int i=0; i<nbvaleurs; i++){
                      for(int n=0; n<peffect[i]; n++){
                              liste_val[m]= pval[i];
                              m++;
                              }
                      }
              }

    PS: Je sais pas si le forum est fait pour vérifier des codes entiers mais bon, je ne sais pas a qui m'adresser..
    Aidez-moi s'il vous plait.

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Si tu es un kamikaze, tu peux aussi retourner un tableau local, a condition de l'utiliser tout de suis après
    Pas toujours, comportement indéfini.
    Si tu fais cela, somme_effect() sera évalué à chaque tour ce boucle, ce qui est inutile. On calcule donc une fois pour toutes avant la boucle
    Normalement non, c'était juste pour clarifier le code.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je corrige sa phrase:
    Si tu es un kamikaze, tu peux aussi retourner un tableau local déclaré static, a condition de l'utiliser tout de suite après
    ... Et de ne pas travailler en multithread.

    En fait, le tableau static correspond à une variable globale, mais en un peu plus propre puisque seule la fonction peut y accéder.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par seriousme
    Normalement non, c'était juste pour clarifier le code.
    Ben si, pourquoi l'évaluation ne serait-elle pas faite a chaque fois?

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Je corrige sa phrase:
    A partir de quand ce tableau devient il invalide?
    Plus précisément quand sa mémoire est elle libérée?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    En ayant réfléchi un peu je pense que le bug du logiciel vient de ce que je n'ai pas compris, là ou j'ai mis le commentaire en rouge, non?
    Comment puis-je faire?

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par socrate
    Entre une variable globale et une allocation locale avec new on a vite choisi, car la mémoire allouée avec le new ne sera sans doute jamais libérée (en tous cas on risque de l'oublier).
    Ouais. Je fais une alloc dynamique et renvoie un auto_ptr<> ou un auto_array<> selon s'il s'agit d'un élément isolé ou d'un tableau.

    Ca, c'est si j'ai peur pour les perf / qu'il m'a été prouvé que j'ai un problème de perf là. Sinon, c'est toujours et systématiquement le vecteur renvoyé par copie, ou pris par référence (afin de faire des resize à chaque passage dans la boucle du traitement -- ce qui sera encore plus performant que l'allocation à chaque itération).

    Une variable globale ? Certainement pas!!!
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par seriousme
    (en parlant de ce que je disais sur les tableaux static)
    A partir de quand ce tableau devient il invalide?
    Plus précisément quand sa mémoire est elle libérée?
    Comme pour les variables globales: "Jamais".

    En pratique, c'est lorsque le processus se termine, quoi. Une variable locale static, c'est juste une variable globale à accès restreint (Pour les objets, il me semble avoir lu ici (ou sur MSDN) que le C++ garantit que l'objet sera construit au plus tard juste avant le premier appel à la fonction).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est un peu plus précis que ça : L'objet ne sera pas appelé avant le premier appel de la fonction. C'est ce point qui permet au pattern singleton de résoudre les problèmes d'ordre d'initialisation entre variables "globales".
    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.

  19. #19
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Excusez-moi mais je me pose une question: est-ce que vous parlez entre vous ou vous repondez a ma question? Je prefererais que ce soit la première solution car je ne comprend rien....

    PS: de temp en temp il plante aussi, je suis obliger d'aller dans le gestionnaire des taches.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je te rassure tout de suite:
    On s'est mis à parler entre nous quand socrate t'a proposé de retourner l'adresse d'un tableau local, pour l'utiliser immédiatement après.

    Moi, j'ai ensuite précisé "retourner un tableau local static" et précisé les inconvénients (les mêmes que pour des variables globales, mais si tu fais "un petit programme tout simple", il y a des chances que tu n'aies pas de problèmes en faisant cela).

    Le reste n'est que discussions entre nous.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. renvoyer un tableau à partir d'un recordset
    Par kamalkam dans le forum ASP
    Réponses: 16
    Dernier message: 31/05/2006, 09h53
  2. [Ant]Lire un XML - renvoyer un tableau de valeurs
    Par gael.poffet dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 06/03/2006, 15h32
  3. Réponses: 6
    Dernier message: 18/05/2005, 14h04
  4. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33
  5. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20

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