Problème avec un appel de fonction

Problème avec un appel de fonction - C++ - Programmation

Marsh Posté le 31-03-2003 à 21:54:40    

J'ai un petit souci dans un prog en open GL et C++.
 
Je vais essayer de faire simple :
 

Code :
  1. classe cassebrique {
  2. public:
  3.  void reshape(int w, int h);
  4.  void jeu();
  5. }

 
 
La fonction jeu uilise à un moment donné la fonction GLUT suivante :
 

Code :
  1. glutReshapeFunc(reshape);


 
et le compilo me retourne ça :
 

Code :
  1. cassebrique.cpp: In constructor `cassebrique::cassebrique()':
  2. cassebrique.cpp:199: no matches converting function `reshape' to type `void (*)(int, int)'


 
Si la fonction reshape n'appartient pas a la classe cassebrique, cela marche sans souci, voyez vous le problème ?
Merci d'avance.


Message édité par manu025 le 31-03-2003 à 22:08:38
Reply

Marsh Posté le 31-03-2003 à 21:54:40   

Reply

Marsh Posté le 31-03-2003 à 22:04:36    

Je vois plusieurs choses qui me dérangent :

  • Apparemment reshape doit être du type void func(int, int) or toi tu la déclare comme void func(void). Il me semble que ça n'est pas valide.
  • Ta fonction reshape fait partie de ta classe cassebrique, il faut donc indiquer cette appartenance : cassebrique::reshape.
  • Je ne connais pas OpenGL, mais je pense que ta fonction reshape doit être déclarée static (j'imagine que tu déclares une fonction callback). En effet elle ne doit être instanciée qu'une seule fois pour toutes tes classes cassbrique.
  • De mémoire, il me semble qu'il faut passer un pointeur vers ta fonction (ce qu'indiquerais le (*) dans l'erreur du compilo). Là-dessus, je peux me tromper, il faudrait que j'essaie.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 31-03-2003 à 22:13:56    

j'ai édité mon post, j'avais fait une erreur.
En fait pour le coup du cassebrique::reshape, cela n'est normalement pas nécessaire car je travaille dans la classe (dans le constructeur plus précisément).
Pour le static, je ne comprends pas vraiment le souci.
Et le pointeur, ben en fait la fonction glutReshapeFunc prend une fonction e nparamètre, et pas un pointeur donc ...
Bizarre.

Reply

Marsh Posté le 31-03-2003 à 22:27:09    

manu025 a écrit :

Pour le static, je ne comprends pas vraiment le souci.


Bon je connais pas tous les détails, mais en gros si elle n'est pas static, ta fonction existe pour chaque classe que tu crée. Or une fonction callback ne doit exister qu'une seule fois (sinon OpenGL ne sait pas quelle version appeler). C'est pour ça qu'il faut la déclarer static, elle sera donc commune à toutes les instances de ta classe.
C'est pour cette raison qu'il faut aussi la passer en temps que cassebrique::reshape.
Pour information, dans ta fonction, tu ne pourras accéder à this (comme elle est commune à toutes tes instances de cassebrique). En fait, utiliser une fonction membre comme fonction callback n'a que très peu d'intérêt en dehors de la clarté.
 

manu025 a écrit :

Et le pointeur, ben en fait la fonction glutReshapeFunc prend une fonction e nparamètre, et pas un pointeur donc ...


Comme je le disais, j'ai dû me planter, je ne sais jamais comment passer une fonction en paramètre (juste le nom ou '&' + le nom).


---------------
each day I don't die is cheating
Reply

Marsh Posté le 31-03-2003 à 22:55:46    

Je comprends a peu près le problème que tu évoques mais l'ajout de static induit d'autres erreurs :
 
 

Code :
  1. cassebrique.o(.text+0xdbf): In function `cassebrique::cassebrique[in-charge]()':
  2. : undefined reference to `glBlendFunc'
  3. cassebrique.o(.text+0xdcd): In function `cassebrique::cassebrique[in-charge]()':
  4. : undefined reference to `glLightModeli'
  5. cassebrique.o(.text+0xdd9): In function `cassebrique::cassebrique[in-charge]()':
  6. : undefined reference to `glutReshapeFunc'
  7. cassebrique.o(.text+0xde5): In function `cassebrique::cassebrique[in-charge]()':
  8. : undefined reference to `glutDisplayFunc'
  9. cassebrique.o(.text+0xdf1): In function `cassebrique::cassebrique[in-charge]()':
  10. : undefined reference to `glutIdleFunc'
  11. cassebrique.o(.text+0xdf6): In function `cassebrique::cassebrique[in-charge]()':

 
 
Je me souviens avoir eu une erreur de ce type dans un projet utilisant le toolkit QT mais je ne me souviens plus de la raison...


---------------
-@- When code matters more than commercials -@-
Reply

Marsh Posté le 31-03-2003 à 23:05:54    

Je suis pas un expert en g++ mais je suppose que c'est au moment du link que tu as ces erreurs. Il faut indiquer lors de la compilation que tu veux linker avec la library OpenGL.
tu peux regarder cette page par exemple.


---------------
each day I don't die is cheating
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed