#1 Le 01/05/2017, à 17:31
- plouf1221
fonction retournant un pointeur de fonction[RESOLU]
Bonjour la communauté Ubuntu,
J'essaye de comprendre à quoi peut servir une fonction retournant un pointeur de fonction et je suis à la recherche d'exemple concret.
Le premier exemple que j'ai trouvé est sur open classromm l'ex site du zéro.
Voici donc ce que j'en ai compris mais l'exemple n'est pas clair pour moi :
#include <stdlib.h>
#include <stdio.h>
double fonction1 (int a, int b) {
double c = a/(double)b;
printf("%g", c);
}
/* La fonction n'a aucun argument et retourne un pointeur de fonction :
Fonction ne prends aucun arguement
=> fonction (void)
Un pointeur de fonction
=> int (*p) (double, double)
Combinaison
=> int (*FONCTION (void)) (double, double)
Cette FONCTION ne prends aucun argument
Cette FONCTION retourne un pointeur de fonction.
Ce pointeur de fonction pointe sur une fonction retournant un int et prends en argument
deux doubles */
double (*ma_fonction(void)) (int ,int) {
return fonction1; // retourne un pointeur sur fonction
}
// Avec type def
typedef double (*pointeur_sur_fonction) (int ,int);
pointeur_sur_fonction fonction2 (void) {
return fonction1; // retourne un pointeur sur fonction
}
int main(void) {
int resultat = fonction1(1, 2);
printf("%d", resultat);
double (*pf) (int, int) = ma_fonction; //warning
double (*p) (int, int) = fonction2; // warning
ma_fonction;
fonction2;
return EXIT_SUCCESS;
}
Ce que j'ai du mal à saisir c'est que fonction1 est une fonction et un pointeur sur fonction ?
Pourquoi es ce que j'ai des warning ? Normalement les deux types sont bien compatible
Dernière modification par plouf1221 (Le 03/05/2017, à 18:46)
Hors ligne
#2 Le 01/05/2017, à 20:51
- no_spleen
Re : fonction retournant un pointeur de fonction[RESOLU]
Bonjour,
Tu as des warnings car tu as oubliés des parenthèses lors de l'appel de ma_fonction et fonction2
double (*pf) (int, int) = ma_fonction();
double (*p) (int, int) = fonction2();
Hors ligne
#3 Le 01/05/2017, à 21:28
- plouf1221
Re : fonction retournant un pointeur de fonction[RESOLU]
Bonjour,
Merci pour les parenthésés que j'avais oublié.
Peut tu me dires si fonction1 est une fonction ou un pointeur de fonction ?
fonction1 est bien une fonction sans aucun doute.
Mais dans les fonctions qui retournent pointeur sur fonction il y a également fonction1 (return fonction1;)
Hors normalement on retourne un pointeur sur fonction et non une fonction.
C'est ça que je ne comprends pas.
Hors ligne
#4 Le 02/05/2017, à 07:35
- no_spleen
Re : fonction retournant un pointeur de fonction[RESOLU]
Bonjour,
Je ne suis pas certain de comprendre la question. fonction1 est bien une fonction. Pour initialiser un pointeur sur une fonction, la syntaxe logique serait :
double (*pf) (int, int) = &ma_fonction;
-> Tu stockes l'adresse de la fonction "ma_fonction" dans le pointeur pf.
Mais le C te permet de te passer de l'opérateur &, c'est pourquoi tu peux écrire
double (*pf) (int, int) = ma_fonction;
Voici ce qu'en disent Kernighan et Rithchie (ils font allusion à un exemple dans le bouquin, mais on comprend l'idée).
"In the call to qsort, strcmp and numcmpare addresses of functions. Since
they are known to be functions, the & operator is not necessary, in the same way
that it is not needed before an array name."
Hors ligne
#5 Le 02/05/2017, à 12:38
- Esbian
Re : fonction retournant un pointeur de fonction[RESOLU]
Bonjour
J'essaye de comprendre à quoi peut servir une fonction retournant un pointeur de fonction et je suis à la recherche d'exemple concret.
un pointeur de fonction permet d'affecter une action via un CallBack.
Par exemple, lors de la programme d'une GUI, tu dois indiquer quelle fonction est associée aux signaux de tes boutons, menus, ... Les pointeurs de fonctions le permettent.
Dernière modification par Esbian (Le 02/05/2017, à 12:40)
Hors ligne
#6 Le 02/05/2017, à 13:21
- plouf1221
Re : fonction retournant un pointeur de fonction[RESOLU]
Merci pour vos exemples, mais pourquoi alors dans ma_fonction je peux retourner fonction1
Normalement je doit retourner un pointeur de fonction et non une fonction et le compilateur ne génère pas d'erreur.
double (*ma_fonction(void)) (int ,int) {
return fonction1; // doit retourner une pointeur de fonction mais retourne une fonction. C'est cela que je ne comprends pas.
}
Dernière modification par plouf1221 (Le 02/05/2017, à 13:21)
Hors ligne
#7 Le 02/05/2017, à 17:48
- no_spleen
Re : fonction retournant un pointeur de fonction[RESOLU]
Merci pour vos exemples, mais pourquoi alors dans ma_fonction je peux retourner fonction1
Normalement je doit retourner un pointeur de fonction et non une fonction et le compilateur ne génère pas d'erreur.
double (*ma_fonction(void)) (int ,int) {
return fonction1; // doit retourner une pointeur de fonction mais retourne une fonction. C'est cela que je ne comprends pas.
}
As-tu lu ma réponse ? Je pense que tout est dit.
Hors ligne
#8 Le 03/05/2017, à 18:46
- plouf1221
Re : fonction retournant un pointeur de fonction[RESOLU]
no_spleen, je viens juste de comprendre. Comme tu l'as dit tout est dit. fonction1 est en faite &fonction1 donc c'est bien un pointeur de fonction.
Merci c'est plus clair dans mon esprit comme ça.
Dernière modification par plouf1221 (Le 03/05/2017, à 18:46)
Hors ligne