appel de fonctions membre - C++ - Programmation
Marsh Posté le 15-01-2008 à 11:15:52
Salut,
1. Tu devrais éliminer les variables globales à tout jamais
2. Quel est le code setSize ?
Marsh Posté le 15-01-2008 à 12:21:47
Dans SetSize() il n'y a essentiellement rien qu'une mise à jour d'une variable.
void CInterface::SetSize (int x, int y)
{
CIwindow_width = x ;
// this->CIwindow_width = x ;
// this->CIwindow_heigth = y ;
}
Le fait est que si j'appelle cette fonction (l'originale, sans lignes mises en commentaire) à partir du main, tout se deroule correctement.
A propos des variables globales, j'aimerais bien, mais je ne connait pas d'autre solution pour rendre une classe crée dans un fichier accessible ailleurs.
Il faut bien que je lie mon interface avec le reste du programme...
Marsh Posté le 15-01-2008 à 12:51:15
Bon, il semblerait que je puisse appeler la fonction à partir d'un autre endroit du programme, de partout en fait _sauf_ dans le callback de gestion des evenements WndProc.
Pourquoi ? Et pourquoi je peux appeller ICamera->SetVector() alors qu'elle est identique dans sa conception ?
Marsh Posté le 15-01-2008 à 13:42:02
J'ai reglé le probleme gràce à:
if (IInterface != NULL)
{ IInterface->SetSize (Window_width,window_heigth); }
Cela était du au fait que le CallBack était appellé avant que la classe soit crée dans le main.
Cette solution ne me satisfait que très moyennement... un test qui sera effectué X fois simplement pour eviter un bug à l'initialisation. Bof.
Marsh Posté le 15-01-2008 à 13:47:51
Pour remplacer les variables globales, tu peux t'en débarasser dans ce cas en faisant en créant/initialisant une structure contenant les pointeurs auxquels tu veux accéder dans ton WndProc. Un pointeur vers cette structure peut ensuite être associée à ton WndProc comme user data. Il y a un exemple sur ce fil chez Gamedev.net.
Par contre, ce serait plus pratique d'avoir une classe gérant la fenêtre qui contiendra ces 2 pointeurs au lieu d'une solution à base de globales, ou de structures aggrégeant ces pointeurs
Pour en revenir à ton problème, je ne vois pas ce qui cloche avec le code que l'on peut voir ici
Tu détruis fort probablement IInterface quelque part dans ton code. Je ne peux que te conseiller de relire ton code soigneusement et débugger pour voir d'où ça vient.
Edit:
Tu ne peux pas créer IInterface avant?
Marsh Posté le 15-01-2008 à 16:04:26
Et bien oui... honte de moi. La classe est crée au tout début de mon programme, ca règle le probleme.
Pour les variables globales, oui je sait qu'on peu faire differement, j'avais vu certaines methodes dans un tutorial "créez un moteur 3D". Il sera toujours temps plus tard de regler ce probleme, pour l'instant j'apprend et je me consacre plus aux briques qu'au mur, plus tard quand je saurais quoi faire faire à mon programme, j'en extraierais les classes pour batir proprement.
Merci pour le lien, je m'étais effectivement heurté à ce probleme. Satané WndProc ! On y ferait pas attention qu'elle deviendrait obèse.
Marsh Posté le 15-01-2008 à 16:27:21
nick456 a écrit : Il sera toujours temps plus tard de regler ce probleme, pour l'instant j'apprend et je me consacre plus aux briques qu'au mur, plus tard quand je saurais quoi faire faire à mon programme, j'en extraierais les classes pour batir proprement. |
Tuuuuut!!!! Mauvaise approche!
Apprends le minimum de la prog Win32 avant de l'utiliser à l'arrache comme ça, tu t'en sortiras beaucoup mieux, sinon tu va passer ton temps à lutter dans le vide. Si ce genre de "détails" fait parti d'un tuto sur la création d'un moteur 3D, c'est pas pour rien
Marsh Posté le 15-01-2008 à 16:34:54
Ohlala mais je ne souhaite pas forcement programmer sous windows ! Au contraire !
Je m'efforce autant que possible de faire du code réutilisable. C'est difficile, étant seul avec internet comme seule source d'informations...
En tout cas, pour l'instant je programme pour moi, en vu de me faire des applications qui me seront utiles. C'est à dire qu'elles devront se demarquer des applis pro, en particulier au niveau de l'occupation mémoire et consommation processeur... Ce qui implique parfois de méchants hacks; ce n'est pas forcement un probleme ni meme "sale", puisque personne d'autre que moi n'aura à maintenir mes programmes, personne n'y cherchera de faille, etc...
Meme si je voulais faire de la "qualité de production" j'en serais incapable car je ne sais ce que les chefs attendent en entreprise.
cheers
Marsh Posté le 15-01-2008 à 17:28:45
Y'a pas vraiment de rapport.
En ce moment tu codes sous windows, donc il te faut les bases de la prog Win32 associée à un petit moteur 3D/jeu. C'est pas (que) une question de qualité, c'est une question de pouvoir réaliser ce que tu veux avant tout.
Ensuite, il y a une notion de qualité (pas de production, celle-là reste parfois à prouver ), faire en sorte que ton jeu tourne sans planter par exemple. Plantage que tu ne comprendras pas sans un minimum de connaissance de la plateforme ciblée.
Marsh Posté le 16-01-2008 à 20:25:45
Utilises-tu un debugger (ex : gdb)? C'est indispensable pour tout développeur, et cela t'aurait permis de trouver l'erreur très rapidement.
Marsh Posté le 15-01-2008 à 09:34:11
Voila je me décide à poster car je m'arrache les cheveux.
Voice brievement mon probleme.
J'ai deux classes:
CCamera, contenant une fonction membre SetVector (publique)
CInterface, contenant une fonction membre SetSize (publique)
en variable globale j'ai:
CCamera* ICamera = NULL ;
CInterface* IInterface = NULL;
dans le corps du main:
ICamera = new CCamera();
IInterface = new CInterface();
finalement, dans le CallBack de gestion des évenements:
ICamera->SetVector(0,0,(GLdouble)-(GET_WHEEL_DELTA_WPARAM(wParam))/240);
IInterface->SetSize((int)LOWORD(lParam),(int)HIWORD(lParam));
Et le problème... C'est que l'appel de la premiere fonction marche, alors que le second provoque un crash.
Des idées ?