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 :

Affecter un pointeur de fonction à un pointeur void*


Sujet :

C

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Affecter un pointeur de fonction à un pointeur void*
    Hello,

    Je dois affecter l'adresse d'une fonction à un pointeur void*.

    Comment puis-je ensuite utiliser ce pointeur pour appeler la fonction ?

    Je suppose qu'il y a un transtypage, mais quelle en est la syntaxe ?

    MErci.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bon, à force de tatonner, j'ai trouvé...

    Finalement, c'est tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((MON_TYPEDEF)_variable_pointeur(...))

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Bonjour,

    Alors, si je ne dis pas trop de bêtises (corrigez-moi sinon) :

    Il faut impérativement connaître le prototype de la fonction pour pouvoir l'appeler correctement, mais ça, tu t'en doutes :-) Admettons que ta fonction reçoive un float en argument et retourne un int.

    Le prototype d'un pointeur de fonction s'écrit comme ceci :


    Soit, le type de la fonction (donc, de sa valeur de retour), la référence à la fonction elle-même, en l'occurence un pointeur, que l'on met entre parenthèses car, autrement, il aurait ambiguïté avec une fonction de type « int * », puis les arguments entre parenthèses, selon la déclaration ordinaire.

    Ensuite, on met cette expression entre parenthèses et on l'accole à la variable à transtyper :


    Cette expression se réfère à une fonction, on peut donc l'utiliser comme un symbole ordinaire, en la faisant suivre par les arguments entre parenthèses, à un détail près ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (int (*) (float))ptr (5.2)
    ... qui est que l'appel à une fonction est prioritaire sur le transtypage. Ici, on appelerait donc « ptr(5.2) » puis on transtyperait la valeur de retour en pointeur de fonction. Donc, on ajoute encore des parenthèses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((int (*) (float))ptr) (5.2)
    Et on peut alors récupérer la valeur de la fonction dans une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = ((int (*) (float))ptr) (5.2)
    Voila.
    À noter également que l'on pourrait penser que si on a un pointeur de fonction et que l'on veut se référer à la fonction elle-même, il faudrait peut-être déréférencer le pointeur. Ce n'est pas nécessaire, mais ça marche quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x =(*(int (*) (float))ptr) (5.2)

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par oodini Voir le message
    Finalement, c'est tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((MON_TYPEDEF)_variable_pointeur(...)
    - Il te manque une parenthèse ;
    - Toute la difficulté réside dans ce qu'il y a dans MON_TYPEDEF, justement.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    - Il te manque une parenthèse ;
    Effectivement. C'est modifié.

    Citation Envoyé par Obsidian Voir le message
    - Toute la difficulté réside dans ce qu'il y a dans MON_TYPEDEF, justement.
    Je n'avais pas de problème sur ce point :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef type_de_retour (*MON_POINTEUR)(...)

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

Discussions similaires

  1. std::fonction vs pointeur de fonction
    Par oodini dans le forum Langage
    Réponses: 5
    Dernier message: 29/10/2013, 11h03
  2. Réponses: 4
    Dernier message: 30/10/2009, 11h45
  3. pointeur de methode vers pointeur de fonction
    Par yvesall dans le forum GTK+
    Réponses: 1
    Dernier message: 19/11/2008, 17h23
  4. Réponses: 4
    Dernier message: 11/08/2008, 14h49
  5. Réponses: 10
    Dernier message: 03/02/2005, 13h09

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