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 :

fonctions retournant un pointeur sur un tableau de pointeurs


Sujet :

C

  1. #1
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut fonctions retournant un pointeur sur un tableau de pointeurs
    Bonjour à tous,

    J'essaie de comprendre les déclarations. Voici, même si je me fourvoie, deux déclarations de fonctions retournant un pointeur sur un tableau de pointeurs sur char . Ça compile sans warning.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char **tst2(char *in[])
     {/*    tst:  fonction retournant un pointeur sur un tableau de pointeurs sur char  */
     
     return in;
     }
     
     
     char*( (*tst() )  [])
     {/*    tst:  fonction retournant un pointeur sur un tableau de pointeurs sur char   */
     static char *p[5] = {0};
     return &p;
     }
    Puisque nous sommes en démocratie, en a-t-ils qui ne sont pas d'accord?

    Question complémentaire:
    Si j'utilise le paramètre -std=c99, GCC n'émet pas de warning si je ne déclare pas mes fonctions autres que la fonction main.


  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Il y a une différence entre les deux codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char **tst2(char *in[])
     {/*    tst:  fonction retournant un pointeur sur un tableau de pointeurs sur char  */
     return in;
     }
    un argument du type type in [] est en fait un argument du type type * in. Le compilateur créera un variable in de ce type.
    Ton code est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char **tst2(char **in)
     {/*    tst:  fonction retournant un pointeur sur un tableau de pointeurs sur char  */
     return in;
     }
    Ces deux versions retournent un pointeur sur un pointeur sur char, pas un pointeur sur un tableau de pointeurs.
    Ces deux versions peuvent être appelées par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* tab[....];
    char** ret = tst2(tab);
    Le second code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     char* (*tst(void)) [] ////////(Une paire de parenthèses était inutile)
     {/*    tst:  fonction retournant un pointeur sur un tableau de pointeurs sur char   */
     static char *p[5] = {0};
     return &p;
     }
    renvoie bien un pointeur sur un tableau de pointeurs sur char. Le code d'appel doit être du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char* (*ret)[...] = tst();
    // et non char** ret = tst();

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    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 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Ouch!
    C'est ardu, quand même.

    C'est le genre de code qui bénéficierait de typedefs...

  4. #4
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ouch!
    C'est ardu, quand même.

    C'est le genre de code qui bénéficierait de typedefs...
    Vous assumez probablement que je comprends.
    Quid??? Exemple ...?

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef char * TB[5]; // TB est le type "tableau de 5 pointeurs sur char"
     
     TB *tst(void)
     {/*    tst:  fonction retournant un pointeur sur un tableau de pointeurs sur char   */
     static TB p = {0};
     return &p;
     }
    ...
     TB * ret = tst();
    Ce qui allège la syntaxe donc la compréhension du code.

Discussions similaires

  1. Tableau de pointeurs sur fonctions.
    Par JulieCarree dans le forum Débuter
    Réponses: 18
    Dernier message: 29/04/2013, 22h59
  2. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  3. Réponses: 5
    Dernier message: 21/09/2008, 09h45
  4. [BCB6]Tableau de pointeurs sur fonctions
    Par rtg57 dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/10/2006, 20h49

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