Zeplayerfou
Messages postés7Date d'inscriptionsamedi 30 décembre 2000StatutMembreDernière intervention22 juin 2009
-
27 déc. 2008 à 12:10
Zeplayerfou
Messages postés7Date d'inscriptionsamedi 30 décembre 2000StatutMembreDernière intervention22 juin 2009
-
27 déc. 2008 à 19:09
Bonjour,
Je fais une petite application utilisant ODE, et je cherche à simuler la friction atmosphérique pour freiner les mouvements de type "rolling"
Je dispose d'une class ODESphere qui hérite d'une class abstraite ODEObject, qui me permet de créer facilement à la fois le body et la geom de mon objet, et qui est aussi capable d'en effectuer le rendu.
Afin de simuler la friction atmosphérique, je fais appelle au callback dBodySetMovedCallback(dBodyID, void(*)(dBodyID) ) tout en déclarant ma fonction de callback.
Je me retrouve donc avec ceci :
ODESphere::ODESphere()
{
// du code...
dBodySetMovedCallback(body,movedCallback);
}
void ODESphere::movedCallback(dBodyID _body)
{
// du code...
}
Et en tentant de compiler je me retrouve avec ce message d'erreur :
1>.\ODESphere.cpp(17) : error C3867: &'ODESphere::movedCallback' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'ODESphere::movedCallback' pour créer un pointeur vers membre
Ce que je ne comprends pas, c'est que j'ai essayé de faire ça dans mon main.cpp, et là ça fonctionne à merveille. Comme me le dit le compilo, j'imagine qu'il y a une subtilité qui m'échappe pour créer des pointeurs vers des fonctions membres, mais je ne vois pas du tout laquelle
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 27 déc. 2008 à 17:57
Bienvenue,
Effectivement, il n'est pas forcément évident de coller (Ou de copier) des codes sur ce site. Et on ne peut pas éditer ses messages.
Concernant ton problème, le message d'erreur est (presque) un modèle de limpidité... Qui plus est, il est français. Encore que la traduction est peut être pas top.
Là il te dit que soit :
1) Il te manque les arguments dans ton appel de fonction
2) Tu as mal écrit ton pointeur sur le membre, et qu'il faudrait que tu l'écrive comme ça : 'ODESphere::movedCallback'.
Le "soit" n'est cependant il est vrai pas très clair dans ce message d'erreur.
Dans ton cas, vu le nom de la fonction avec callback dedans, tu es manifestement dans le deuxième cas. Il faut donc que tu écrive ton pointeur comme le compilo te le demande.
Par contre, je ne sais pas si la fonction que tu appelles attend un pointeur sur une méthode. Je crois qu'il faut que tu lui donne un pointeur sur une fonction classique. Comme ici.
Il faudra donc peut être que tu oublies un peu de C++ deux minutes pour revenir au C.
Zeplayerfou
Messages postés7Date d'inscriptionsamedi 30 décembre 2000StatutMembreDernière intervention22 juin 2009 27 déc. 2008 à 12:17
Bonjour, Je fais une petite application utilisant ODE, et je cherche à simuler la friction atmosphérique pour freiner les mouvements de type "rolling".
Je dispose d'une class ODESphere qui hérite d'une class abstraite ODEObject, qui me permet de créer facilement à la fois le body et la geom de mon objet, et qui est aussi capable d'en effectuer le rendu.
Afin de simuler la friction atmosphérique, je fais appelle au callback dBodySetMovedCallback(dBodyID, void(*)(dBodyID) )
tout en déclarant ma fonction de callback.
Je me retrouve donc avec ceci :
ODESphere::ODESphere()
{
// du code...
dBodySetMovedCallback(body,movedCallback);
}
void ODESphere::movedCallback(dBodyID _body)
{
// du code...
}
Et en tentant de compiler je me retrouve avec ce message d'erreur :
1>.\ODESphere.cpp(17) : error C3867: &'ODESphere::movedCallback' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'ODESphere::movedCallback' pour créer un pointeur vers membre.
Ce que je ne comprends pas, c'est que j'ai essayé de faire ça dans mon main.cpp, et là ça fonctionne à merveille.
Comme me le dit le compilo, j'imagine qu'il y a une subtilité qui m'échappe pour créer des pointeurs vers des fonctions membres, mais je ne vois pas du tout laquelle.
voilà désolé pour le triple post, mais jusqu'à présent je n'ai pas trouver s'il était possible d'éditer ses propres messages, mais bon avec des sauts de ligne c'est bcp plus clair !
Je viens de remarquer aussi que le sujet se trouve sous linux...mais en fait pas vraiment puisque je travaille sous VS2005..mais bon c'est de l'openGL..
Zeplayerfou
Messages postés7Date d'inscriptionsamedi 30 décembre 2000StatutMembreDernière intervention22 juin 2009 27 déc. 2008 à 19:09
J'ai tenté les 2 méthodes :
si je donne les arguments, l'erreur provient d'un problème de conversion (impossible de convertir le 2 arguments de 'void' en void (__cdecl *)(dBodyID) )
Ensuite ecrire ODESphere::movedCallback ne change strictement rien.
Et en effet, utiliser une fonction classique est beaucoup plus efficace qu'une fonction membre !
Ensuite ayant très peu fait de C jusqu'à maintenant, il est vrai que j'ai peut-être chopper de mauvaises habitudes, comme vouloir mettre toutes les fonctions comme membres de ma classe ^^'.