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 :

fonction qui renvoie un tableau


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut fonction qui renvoie un tableau
    bonjour
    J'ai une question qui peut paraitre simple, mais je n'arrive pas a trouver la solution.
    J'aimerais créer une fonction qui renvoie un tableau (de taille donnée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char fndkk(void)
    {
    	char c;
    	for(int i=0;i<4;i++){
    		char c[i]=i;
    	}
    	return c;
    	}
    Forcément c'est faux, mais quel serait la bonne déclaration de fndkk?
    (on pourrait utiliser autre chose que les char)
    merci

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char* fndkk(unsigned int taille)
    {
      char* tab = new char[taille];
      for (unsigned int i = 0; i < taille; ++i)
      {
        tab[i] = i;
      }
      return tab;
    }
    n'oublie pas de faire delete [] tab apres avoir appellé ta fonction

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    merci
    corrige moi si je me trompe, mais s'agit il d'un pointeur sur fonction?

    pourquoi mettre le signe & devant la fonction?

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 116
    Points : 95
    Points
    95
    Par défaut
    DKK_API char fndkk(void)
    {
    char c;
    for(int i=0;i<4;i++){
    char c[i]=i;
    }
    return c;
    }

    déjà ton c est un simple caractère pas un tableau,

    alors pour commencer simple :

    DKK_API c'est quoi? des objets?


    pour renvoyer un tableau de caracteres:


    char* fndkk(void)
    {
    char c[4];
    for(int i=0;i<4;i++){
    char c[i]=i;
    }
    return *c;
    }

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 116
    Points : 95
    Points
    95
    Par défaut
    oups pris de vitesse

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    pour le signe & c'est une erreur il n'est pas bon, je l'ai enlevé.

    Ce n'est pas un pointeur vers une fonction mais c'est une fonction qui renvoie un pointeur.

    Et les pointeurs 'sont' des tableaux.

    pour l'utiliser tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned int taille = 4;
    char* tab = fndk(taille);
     
    delete [] tab;
    sleigh, tu alloues le tableau statiquement, il est detruit a la fin de la fonction et tu renvoies donc un pointeur non valide ! D'ailleurs tu ne renvoie pas le tableau mais la p^remiere valeur du tableau.
    Tu dois faire un new dans ta fonction ou alors tu alloue ton tableau statique avant l'appel et tu passe ton tableau en argument de la fonction et dans ce cas elle ne renvoie rien.

  7. #7
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    est t on obligé de faire un new char?
    j'y avais pensé, mais je me suis dit que ce n'etait pas la peine.
    car la déclaration le créerait automatiquement.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Si tu veux créer ton tableau à l'intérieur de ta fonction, il faut l'allouer dynamiquement (avec new ou malloc) pour pouvoir l'utiliser une fois sorti de ta fonction.

    Renseigne toi sur les allocations dynamique vs statiques.

    Tu peux ne pas utiliser de new si ton tableau a été déclaré en amont de la fonction, mais dans ce cas il faut le passer en argument. C'est également une pratique courante :

    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
    void remplir(char* tab, unsigned int taille)
    {
      for (unsigned int i = 0; i < taille; ++i)
      {
        tab[i] = i;
      }
    }
     
    int main()
    {
      unsigned int taille = 4;
      char tab[taille];
     
      remplir(tab, taille);
    }

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu ne peux pas retourner un tableau.
    C'est bizarre mais c'est comme ça.

    Si tu veux faire une telle chose, il faut mettre ton tableau dans une structure.
    std::tr1::array permet d'automatiser cela.

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Bien sur que si on peut.
    Pourquoi ne peut-on pas?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 73
    Points : 21
    Points
    21
    Par défaut
    NiamorH j'ai regarder ton programme ave le tableau en parametre car j'en avait également besoin et sa ne marche pas le compilateur me sort une erreur:
    1>e:\Partie.cpp(22) : error C2664: 'Partie:lacementBateaux'*: impossible de convertir le paramètre 1 de 'int [25][25]' en 'int **'
    pour info voila mon code :
    void PlacementBateaux(int **);
    ==> Dans ma classe
    Partie1.PlacementBateaux(TabBateauxJ1);
    ==> appel de fonction
    void Partie:lacementBateaux(int ** Tab){}
    ==> Declaration fonction

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bien sur que si on peut.
    Pourquoi ne peut-on pas?
    Parce que le standard dit que c'est interdit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int foo()[10]
    {
        int tmp[10] = {0};
        return tmp;
    }
    Ce code ne compilera pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.cpp:1: erreur: ‘foo’ declared as function returning an array
    Il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct tableau
    {
        int value[10];
    };
     
    tableau foo()
    {
        tableau tmp = {0};
        return tmp;
    }

  13. #13
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    tigger_riric, il faut eviter au maximum les tableaux 2D, fait plutot un tableau 1D de dimension [largeur * longueur] et accede aux elements comme ça : [y*largeur + x]. La ca marchera.

    loufoque, un char* est un tableau et rien n'interdit de renvoyer un char*, alors ce que tu dis me semble bizare ?

    Evidement que le code que tu as donné ne compile pas, mais celui que j'ai donné compile lui et le resultat est qu'il renvoie un tableau.

  14. #14
    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
    un char* est un tableau
    un char* est un pointeur sur char. Après, que ce pointeur pointe sur plusieurs éléments (un tableau) ou non, c'est déjà une autre histoire.

    Ne jouons pas sur les mots, ce que loufoque veut dire c'est que le C++ n'autorise pas de renvoyer directement un tableau, mais on peut évidemment le faire via des moyens détournés comme renvoyer un pointeur vers celui-ci.

  15. #15
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    un char* est un pointeur sur char. Après, que ce pointeur pointe sur plusieurs éléments (un tableau) ou non, c'est déjà une autre histoire.
    Alors, sur quoi peut il pointer s'il peut pointer sur autre chose qu'un tableau?

  16. #16
    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
    Citation Envoyé par deubelte
    Alors, sur quoi peut il pointer s'il peut pointer sur autre chose qu'un tableau?
    Sur un seul caractère, ou encore sur rien (pointeur nul).

  17. #17
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Sur un simple char. Mais même dans ce cas on peut considérer que c'est un tableau de 1 élément.

    EDIT : ou 0 bien sur !!!

    La seule différence c'est la façon dont on doit le détruire. S'il s'agit d'un vrai tableau il faut appeller delete [] sinon delete seulement.

    Mais il ne faut pas présenter les choses à quelqu'un qui commence en c++ en lui disant qu'on ne peux pas renvoyer ou passer en parametre un tableau sans expliquer. Et encore moins en lui proposant de renvoyer une structure, ce qui n'est utilisé que dans des cas très précis.

    L'usage reste quand même le char*

  18. #18
    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
    Citation Envoyé par NiamorH
    L'usage reste quand même le char*
    Pour moi ce serait plutôt std::string ou std::vector<char> (selon l'utilisation qui en est faite).

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Les solutions proposées plus haut allouent un tableau sur le tas et renvoient un pointeur vers son premier élément. Ce qui veut dire qu'en plus il faudra le libérer quelque part en dehors de la fonction, ce qui est tout sauf propre.
    Ma solution retourne tout simplement un tableau, sur la pile.

  20. #20
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Oui mais tu fais une copie complete de ton tableau au moment du retour si je ne me trompe pas.

    Si ton tableau est enorme cela peut etre genant.

    De plus, si tu veux faire un tableau d'objets, avec ta methode tu est obligé de te taper les constructeurs par copie.

    Si on ne veut pas faire de new j'ai donné aussi une solution en passant le tableau en parametre.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. appel d'une fonction qui renvoie un tableau
    Par yokou dans le forum VB.NET
    Réponses: 1
    Dernier message: 08/01/2008, 21h52
  2. fonction qui renvoie un tableau
    Par GLSpirit dans le forum C++
    Réponses: 9
    Dernier message: 12/05/2007, 14h05
  3. fonction qui renvoie un tableau
    Par toto2022 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/01/2007, 16h11
  4. Comment faire une fonction qui renvoi un tableau.
    Par poly128 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 01h04
  5. Fonction qui renvoie un tableau?
    Par elm dans le forum C
    Réponses: 23
    Dernier message: 21/12/2005, 12h44

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