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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif 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
    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 confirmé
    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
    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
    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
    Ouch!
    C'est ardu, quand même.

    C'est le genre de code qui bénéficierait de typedefs...
    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.

  4. #4
    Membre très actif 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
    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 confirmé
    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
    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