Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 01/05/2017, à 18: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, à 19:46)

Hors ligne

#2 Le 01/05/2017, à 21: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, à 22: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, à 08: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, à 13: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, à 13:40)

Hors ligne

#6 Le 02/05/2017, à 14: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, à 14:21)

Hors ligne

#7 Le 02/05/2017, à 18:48

no_spleen

Re : fonction retournant un pointeur de fonction[RESOLU]

plouf1221 a écrit :

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, à 19: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, à 19:46)

Hors ligne