1

j'utilise dans un programme un systeme de callbacks, il marche correctement, mais j'ai des warnings a la compilation, et je n'arrive pas a en trouver la source

il s'agit du champ d'une structure :

struct Event;
typedef void(*lrEV_Callback)(struct Event *);
struct Event 
{
	short delay,x,y;
	lrEV_Callback Callback;
} *lrEV;


pour appeler le callback, je proccede comme ceci :
lrEV[i].Callback(&lrEV[i]);

je declare les callback comme ceci :
lrEV_Callback Cb_test(struct Event *parent)
{
  ...
}


voici les warnings que j'obtient :
Initialization from incompatible pointer type.
a chaque fois que le passe comme argument le nom d'une fonction callback (par exemple Cb_test) comme parametre d'une fonction demandant un lrEV_Callback
control reaches end of non-void function.
a la fin de chaque fonction callback (Cb_test par exemple)

je ne comprend pas pourquoi j'ai ces warnings...
vous avez une solution a mon pb ?
avatar

2

Je suis pas sur que le typedef fonctionne bien pour les pointeurs de fonctions, surtout avec

lrEV_Callback Cb_test(struct Event *parent)
{
  ...
}


Et je me demande si tu a compris comment fonctionnait les pointeurs de fonctions...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3

hum, il foudrais donc que je me passe de typedef...
ca va etre chiant cela
avatar

4

azerty83
:
control reaches end of non-void function.
a la fin de chaque fonction callback (Cb_test par exemple)
C'est parce que ta fonction ne retourne rien. Il faut la déclarer comme renvoyant un void { ... } à mon avis :void Cb_test(struct Event *parent)Enfin, je n'ai jamais manipulé de pointeur de fonction, donc ça me casse la tête tout ça.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

ben justement, dans le typedef, je spécifie bien typedef void(*lrEV_Callback)(struct Event *); donc Cb_test devrait etre une fonction void ;(
avatar

6

Non, Cb_test est une fonction renvoyant un pointeur sur une fonction de type lrEV_Callback si je ne me trompe pas.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

Et d'ailleurs l'autre warning est sûrement lié à ce même problème.
[edit] : je développe parce que je n'ai rien à faire : la fonction attend en argument l'adresse d'une fonction ne renvoyant rien, or ta fonction renvoie un pointeur vers une fonction du type compliqué-dont-je-ne-me-souviens-plus-du-nom.

Essaie, on verra si je sors ou non.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

8

hum je pensais que ma fonction etait de type void et attendait un pointeur vers une structure Event
(pour le nom compliqué, tu peux zapper le prefixe wink )
avatar

9

lrEV_Callback est un typedef pour un pointeur de fonction, mais il ne peut marcher sur la fonction elle-même:
Même avec un typedef void(*lrEV_Callback)(struct Event *); , tu dois garder la fonction elle-même définier en:
[12]void [/12]Cb_test([12]struct [/12]Event *parent)
{
}
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

10

ok, merci smile

c dommage, ca perd un peu d'interet alors
avatar