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 :

Comprendre pointeur --> fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 45
    Par défaut Comprendre pointeur --> fonction
    Bonsoir à tous!

    J'ai du mal a comprendre la notion de pointeur vers une fonction.
    En fait le pb est que je me l'imagine un peu à la façon d'un pointeur vers un tableau (ie vers le premier element du tableau) et du coup j'ai du mal a comprendre comment on peu faire passer un argument à une "adresse" du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int (*f) (float a)
    (*f) (x);
    Quelqu un peut il m expliquer comment ca fonctionne en réalité?

    Merci a tous!

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut



    Un petit exemple vaut mieux qu'un long discours... en tous cas pour commencer:

    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>
     
     
    void msg (char * p)
    {
       printf ("%s\n", p);
    }
     
     
    void func (void (* fonction) (char * p), char * p)
    {
       fonction (p);
    }
     
     
    int main (void)
    {
       func (msg, "Bonjour !");
       return EXIT_SUCCESS;
    }
    Dans cet exemple on appel la fonction func qui elle, appelle la fonction msg dont on a passé l'adresse en tant que premier argument (voir le main). Pour passer un argument à cette fonction msg, il faut que la fonction appelante (ici func), possède un second argument du même type que ce que la fonction appelée (ici msg) possède.

    L'appel comme fait dans le main reste des plus simple. C'est un principe largement utilisé dans GTK+ qu'on appel également plus communément callback, c'est un des principal cas d'utilisation des pointeurs sur fonctions, l'autre étant de la POO en C par exemple mais pas très pratique d'utilisation ! Si tu as des question hésite pas
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 45
    Par défaut
    Salut Franck,

    merci pour l exemple, mais ce n'est pas la pratique qui me fait defaut mais plutot le fonctionnement profond du principe de pointeur vers une fonction.
    J'ai l impression qu'on pointe vers l'adresse du premier octet du code de la fonction, et a partir de la je ne comprend pas comment on peut passer un argument à une adresse?
    Mais ce n'est surement pas le vrai mecanisme. Quelqu un a t il une explication?

    Merci

  4. #4
    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
    C'est le compilo qui fait le travail.

    Quand tu fais fonction(p) dans le code de Franck.H, le compilo sait que fonction n'est pas un pointeur ordinaire, mais un pointeur de fonction. Il interprète donc correctement le code pour empiler les paramètres et sauter à l'adresse pointée par fonction, plutôt qu'à une adresse hard-codée dans le programme.
    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.

  5. #5
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 45
    Par défaut
    OK, c'est un peu plus clair pour moi, merci!

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Oui c'est un peu délicat de savoir comment ca se passe exactement en interne à part éventuellement lire le code assembleur généré par le compilateur mais faut-il encore connaître se langage et encore...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par Franck.H Voir le message



    Un petit exemple vaut mieux qu'un long discours... en tous cas pour commencer:

    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>
     
     
    void msg (char * p)
    {
       printf ("%s\n", p);
    }
     
     
    void func (void (* fonction) (char * p), char * p)
    {
       fonction (p);
    }
     
     
    int main (void)
    {
       func (msg, "Bonjour !");
       return EXIT_SUCCESS;
    }
    Dans cet exemple on appel la fonction func qui elle, appelle la fonction msg dont on a passé l'adresse en tant que premier argument (voir le main). Pour passer un argument à cette fonction msg, il faut que la fonction appelante (ici func), possède un second argument du même type que ce que la fonction appelée (ici msg) possède.

    L'appel comme fait dans le main reste des plus simple. C'est un principe largement utilisé dans GTK+ qu'on appel également plus communément callback, c'est un des principal cas d'utilisation des pointeurs sur fonctions, l'autre étant de la POO en C par exemple mais pas très pratique d'utilisation ! Si tu as des question hésite pas
    Ca ferait un bon article de FAQ ça...

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Gnux Voir le message
    Ca ferait un bon article de FAQ ça...
    Oui c'est exact, merci de me l'avoir fait remarqué
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Il faut savoir qu'une fonction, une fois compilée, n'est rien d'autre qu'une adresse à l'intérieur d'un binaire (exécutable ou librairie).
    Evidemment, ce qui est au bout du pointeur n'est pas une donnée, mais la première instruction de la fonction (en langage machine).
    C'est ce que l'on appelle le point d'entrée de la fonction.

    Pendant la compilation, le compilateur vérifie que les types des paramètres sont bien respectés, et une fois qu'il est sûr que tout va bien de ce coté là, la fonction n'est plus définie que par son point d'entrée i.e un pointeur.

    En C++, les méthodes virtuelles sont gérées par ce mécanisme, mais il est masqué par le langage lui-même.

    Voilà, j'espère avoir un peu éclairé ta lanterne...

Discussions similaires

  1. opengl et pointeur de fonction
    Par Oldhar dans le forum C
    Réponses: 5
    Dernier message: 06/11/2003, 23h56
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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