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 talbeau


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut Retourner un talbeau
    Peut on retourner un tableau d'entier ?! Je me pose la question !!
    Retourner un entier ou mais un tableau ?!!

    Faut il retourner un pointeur vers le 1er element du tableau ?!

  2. #2
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    On ne peut pas renvoyer directement de tableau, seulement un pointeur. Gare à ce qu'il ne soit pas local à la fonction !
    Mais on peut retourner une structure contenant un tableau.

    Ah mais tu demandes pour un talbeau, ça je connais pas.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Comme cela a été dit, tu ne peut pas renvoyer un tableau mais un pointeur vers le premier éléments.
    Attention tout de même car cela pose des problèmes.
    Il faut que tu l'alloue dynamiquement sinon ton tableau est perdu à la fin de la fonction:
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *fonction()
    {
             char buffer[15];
     
             /* ... traitement ... */
     
             return buffer;
    }
    Ce code NE MARCHE PAS !
    En effet, la fonction te renverra bien l'adresse du tableau buffer mais comme buffer est une variable locale à la fonction, elle est libéré à la fin de la fonction...

    Pour faire plus propre, il faut soit que tu alloue dynamiquement le tableau dans la fonction,
    Toutefois cela pose des problèmes car en général il est préférable que les allocation / désallocation soit faite dans la même fonction.
    De plus si tu utilises ta fonction plus tard dans un autre programme tu peux oublier qu'elle alloue la mémoire donc tu peux oublier de faire le free() --> fuite de mémoire...
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char *fonction2()
    {
             char *buffer;
     
             buffer = (char*) malloc ( sizeof(char) * 15 );
             /* ... traitement ... */
     
             return buffer;
    }
    Dans ce cas pas de probleme mais il faut bien penser à liberer la memoire avec un free():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *tableau;
    tableau = fonction2();
    printf ("%s\n", tableau);
    free (tableau);
    soit que tu passes le tableau alloué en paramètres,:
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fonction3(char *buffer, int sizemax)
    {
             /* ... traitement ... */
    }
    utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char tableau[15];
    fonction3 (tableau, 15);
    printf ("%s\n", tableau);
    Dans ce cas pas de problème d'allocation/libération de la memoire...
    Je te conseille aussi de donner des noms explicite tels que malloc_tableau() si tu alloue dans la fonction...

    Il y avait un vieux post ou il y avait eu un mini debat la dessus mais je ne l'ai pas retrouvé...

    a++

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Pour les chaines de caracteres je sais faire mais pour les entiers, ca me parait bizarre ?!!

    Dans ma fonction je devrais donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int *Tableau;
    Tableau = malloc (TailleTableau);
     
    /*Mon traitement*/
     
    return Tableau;
    Comme ca ou non ?

  5. #5
    Membre éprouvé
    Avatar de jérôme
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 591
    Points : 1 071
    Points
    1 071
    Par défaut
    Pour un tableau d'entiers ça marche pareil que pour un tablea de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int *Tableau; 
    Tableau = (int *) malloc (sizeof(int) * TailleTableau); 
     
    /*Mon traitement*/ 
     
    return Tableau;
    (int *) pour caster en pointeur sur le type entier (int), car malloc renvoit un pointeur sur void
    sizeof(int) car à priori tu ne sais pas combien d'octets utilise le type int

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Le forcage de la caste n'est pas obligatoire je crois, non ?
    Il le fait automatiquement je crois, non ?

  7. #7
    Membre éprouvé
    Avatar de jérôme
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 591
    Points : 1 071
    Points
    1 071
    Par défaut
    Citation Envoyé par taupin
    Le forcage de la caste n'est pas obligatoire je crois, non ?
    Il le fait automatiquement je crois, non ?
    Vi mais ça coûte rien de le faire explicitement, comme ça tu es sûr de ce que tu as.

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    pour réussir à coup sûr, sans faire d'allocation dynamique car pour débute c'est pas ce qu'il y a de plus facile.
    prend cette base!!!

    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
     
    // definition la taile de ton tableau cela permet de ne pas avoir à cherché 
    // plein de modification à faire dans tous ton code losrque 
    // tu change la taille de ton tableau
    #define TAILLE_TABLEAU 6
     
    void main (void)
    {
       int tableau [TAILLE_TABLEAU];
     
       //instructions
     
       rempir_tableau(tableau);
     
       //instructions
     
    }
     
    void rempir_tableau(&tab)
    {
       int i;
       //exemple d'instruction
       for(i=0;i<TAILLE_TABLEAU;i++)
       {
          tab=getch();
       }
    }
    la variable tableau est un pointeur sur un tableau donc quand tu le passe en paramètre tu peux en servir comme un tableau et non comme un pointeur de pointeur de tableau (je répete pointeur de deux fois et c'est bien ce que j'ai voulu dire!!!)

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

Discussions similaires

  1. limiter le résultat retourné par le count
    Par SuperFoustan dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/08/2003, 12h10
  2. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11
  3. sum(XPATH) retourne NaN
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 19/03/2003, 13h48
  4. Réponses: 2
    Dernier message: 06/03/2003, 16h37
  5. [Manip de fichiers] Fonction retournant des infos
    Par sans_atouts dans le forum C
    Réponses: 3
    Dernier message: 24/07/2002, 14h16

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