Abération pointeurs de fonction ?

Signaler
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
-
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
-
bonjour,

quelqu'un pourrait m'expliquer ce que signifie ce code pour nos compilateurs ?

int mafonction () {
return 54;
}

int main() {
int (*func)() = mafonction;
int k = (************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************func)();
printf(" %d\n",k);
}

(chez moi ça affiche 54 sans problème)

11 réponses

Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Je pense que ton code devait plutôt être ca :

int mafonction()
{
    return 54;
}

int main()
{
 // déclaration d'un pointeur sur une fonction de signature égale à celle de mafonction

   int (*func)() = mafonction;

  // exécution de la fonction via le pointeur de fonction
   int k = (*func)();

   printf(" %d\n",k);
}
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
Salut

dans ce cas, c'est equivalent a

k=mafonction();

en gtk, en C/Xchat, et autre, ca sert pour les callbacks.

La derniere fois que j'ai fait ca, j'avais un perso a faire bouger, et une fonction appellee a chaque tour,
cette fonction pouvait appeller 5 autres fonctions, selon que le perso soit gentil, phagocyteur, anticorps, visiteur etc..

certains se servent de l'heritage pour ne pas avoir a manipuler ces pointeurs

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
5
salut

vous n'avez peut-être pas compris ma question

vicenzo: une fonction c'est déja une adresse il faut donc faire

int mafonction()
{
return 54;
}

int main()
{
int (*func)() = mafonction;
int k = func();
printf(" %d\n",k);
}


mais qu'en est-il des étoiles dans mon code ?
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
Salut

a part si tu t'es endormi sur le clavier, et que le lendemain, par erreur tu ai enregistre... je ne vois pas d'ou peuvent vennir ces etoiles....

je ne connais aucun humain capable de taper un truc qui renverrait un pointeur sur pointeur (sur pointeur ) {1500} de fonction...

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
D'ailleurs a ce sujet, j'avais poster une fois, car le code suivant marche également:

   int (*func)() = &
mafonction;
   int k = func();
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
5
ça c'est normal luhtor

c'est l'idée qu'une fonction est à la fois l'adresse du prologue de la fonction, et à la fois l'entité "fonctionnelle" (sizeof mafonction = 1 tout comme sizeof(void) !!!)
l'adresse de l'entité fonctionnelle étant l'adresse du prologue....

de la même manière

int tab[15];
( tab == &tab ) est Vrai
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Hm j'ai eu peur. J'ai cru que ton exemple allait compiler.

   int tab[15];
   if (tab == &tab)

Provoque une erreur de compilation et heureusement puisque les types sont différents.
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
5
l'idée est que c'est un code C et pas un code C++ :)

chez moi ça fonctionne (avec gcc, mingw, vc++)
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
[auteurdetail.aspx?ID= 161232 acx01b] : Pour info, le code que j'ai mis était ton code débarrassé des ******** en trop.

Merci de m'apprendre d'une fonction correspond à une adresse mémoire... C'es trop sympa !
Pour info je faisais déja du C que tu apprenais pythagore au collège...
Sinon les expressions k (*func)() et <gras>k func() </gras>sont toute les deux valables car elle exécutent toute les deux mafonction()

Pour ton information la vrai facon de faire est  (*func)()  ...

func() n'est qu'une forme de la première acceptée par la norme pour 'faire + simple'.

Donc avant de donner des lecons, revise ta norme !!!


Bonne continuation....
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
Salut

j'adore les choses genre :

"Pour info je faisais déja du C que tu apprenais pythagore au collège..."

c'est tres constructif, et ne veut finalement pas dire grand chose... j'ai commence les echecs a 5 ans, et je me suis fait battre a 16 contre des gamins de 11 ans...

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
5
bon je crois que la discussion ne sert pas à grand chose

personne n'a lu ma question de départ qui était: comment ça se fait qu'on puisse mettre autant d'étoiles que l'on veut et que ça passe quand même (à la compilation et à l'exécution)

vicenzo : j'ai pas l'impression d'avoir été agressif dans mon message juste que tu n'avais pas lu la question

et je ne sais pas ce que dit la norme sur les pointeurs de fonctions, mais apparement si ce que tu dis est vrai elle ne dit pas que des bonnes choses
( de toute façon mon code tout en haut me laisse penser que la norme est bizarre à ce sujet)