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 :

Une fonction qui retourne un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 32
    Par défaut Une fonction qui retourne un tableau
    Bonjour je voudrai savoir comment faire une fonction qui retourne un tableau d'entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int valbalise(int a){
    ...
        return(tab[100]);
    }
     
     
    int main(){
    int tab[100];
     
    tab=valbalise(1);
    }
    je ne récupére pas mon tableau...
    je ne sais pas comment faire...

    merci d'avance pour toute votre aide

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Plusieurs solutions :
    1) Tu alloues un nouveau tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T * creer_tableau(void)
    {
      T * tab;
      tab = calloc(NB_ELEMENTS, sizeof *T);
      return tab;
    }
    Faut biensur penser à liberer (et ne libérer qu'une fois)

    2) Tu laisses l'utilisateur creer et gérer le tableau, la fonction se contenterait de valoriser les éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void init_tableau(T * tab)
    {
      memset(tab, 0, (sizeof *tab) * NB_ELEMENTS);
    }
    3) Tu retournes un tableau global (interne) ou statique => il reste accessible au retour de la fonction (c'est ce que fait par exemple getenv(), ou encore localtime()).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T * get_tableau(void)
    {
      static T tab[NB_ELEMENTS];
      memset(tab, 0, (sizeof *tab) * NB_ELEMENTS);
      return tab;
    }
    L'inconvenient c'est que tu peux avoir qu'un seul tableau en même temps (sinon il faut le copier).

    Note : dans tous les cas, le nombre d'éléments est fixé, et l'initialisation consistait juste en la mise à zero des elements.

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Il est possible de retourner un tableau alloué sur la pile, comme apparement tu souhaites le faire. Mais je te le déconseilles car cela est très gourmand en temps (et il y a des risques de Stack Overflow dans le cas où le tableau est vraiment grand).


    La méthode pour éviter une allocation dynamique (donc autre que la méthode de Gruik) est de passer un pointeur vers le tableau en paramètre, avec éventuellement la taille :

    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
     
    int mafonction(int * tab, size_t taille) {
     
     ....
    }
     
     
    void autrefonction(void) {
     int tab[100];
     
     mafonction(tab, sizeof(tab));
     
     /* ou */
     size_t taille = 100;
     int * tab2 = malloc(sizeof(int) * taille);
     if(tab2==NULL) ....
     
     mafonction(tab2, taille);
     
    }

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par millie
    Il est possible de retourner un tableau
    Pour être précis il n'est pas possible de retourner un tableau, uniquement un pointeur !

    Citation Envoyé par millie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mafonction(tab, sizeof(tab));
    Pour connaître le nombre d'éléments d'un tableau c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof (tab) / sizeof (*tab)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par gege2061
    Pour être précis il n'est pas possible de retourner un tableau, uniquement un pointeur !
    Et moi, j'ai des doutes et je me demande si millie n'a pas raison quelque part.

    Par exemple, en retournant un tableau encapsulé dans une structure (retour de TRÈS gros objet sur la pile)...
    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.

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par gege2061
    Pour être précis il n'est pas possible de retourner un tableau, uniquement un pointeur !


    Pour connaître le nombre d'éléments d'un tableau c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof (tab) / sizeof (*tab)
    Voilà, à vouloir éviter de mettre un 100 en dur, je me plante bêtement .

    Sinon, je pensais en fait à une astuce du genre :

    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 <stdio.h>
    #include <stdlib.h>
     
    struct Tableau {
     int tab[100];
    };
     
    struct Tableau fonction(void) {
     struct Tableau tableau;
     /* ... */
     return tableau;
    }
     
    int main(void)
    {
        struct Tableau sTab;
        sTab = fonction();
     
        return 0;
    }
    J'avais pensé un instant pouvoir retourner des tableaux par exemple avec un prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int[100] fonction(void);
    Mais, n'ayant jamais essayé ce type de code (car c'est très peu performant), je viens seulement de me rendre compte que ce n'était pas possible autrement que d'encapsuler le tableau dans une structure, comme l'a indiqué Medinoc.

    Au temps pour moi,

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    euh.. Il y a encore une solution que vous n'avez pas mentionné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Cree_tableau(int ** tab, int taille)
    {
      *tab = malloc ( taille*sizeof(int) ) ;
    }

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

Discussions similaires

  1. creer une fonction qui retourne un tableau
    Par altaro dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 02/01/2010, 01h01
  2. [Tableau] Créer une fonction qui retourne un tableau
    Par Imageek dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/01/2009, 16h54
  3. Réponses: 3
    Dernier message: 19/12/2007, 14h50
  4. Comment créer une fonction qui retourne un tableau?
    Par Dereck07 dans le forum Delphi
    Réponses: 4
    Dernier message: 26/04/2007, 13h16
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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