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.
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.
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(...))
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 :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part int (*) (float)
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 :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part (int (*) (float))ptr
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 ...
... 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 ((int (*) (float))ptr) (5.2)
Voila.
Code : Sélectionner tout - Visualiser dans une fenêtre à part x = ((int (*) (float))ptr) (5.2)
À 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)
Effectivement. C'est modifié.
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)(...)
Partager