Abération pointeurs de fonction ?

acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 - 8 juin 2007 à 23:39
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 - 10 juin 2007 à 14:58
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

cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
9 juin 2007 à 08:22
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);
}
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 43
9 juin 2007 à 08:39
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
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
9 juin 2007 à 10:47
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 ?
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 43
9 juin 2007 à 10:52
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 juin 2007 à 13:00
D'ailleurs a ce sujet, j'avais poster une fois, car le code suivant marche également:

   int (*func)() = &
mafonction;
   int k = func();
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
9 juin 2007 à 14:19
ç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
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 juin 2007 à 15:07
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.
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
9 juin 2007 à 17:47
l'idée est que c'est un code C et pas un code C++ :)

chez moi ça fonctionne (avec gcc, mingw, vc++)
0
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
10 juin 2007 à 11:24
[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....
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 43
10 juin 2007 à 11:31
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
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
10 juin 2007 à 14:58
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)
0