Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
831 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  appel de fonctions membre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

appel de fonctions membre

n°1671287
nick456
Posté le 15-01-2008 à 09:34:11  profilanswer
 

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 ?

mood
Publicité
Posté le 15-01-2008 à 09:34:11  profilanswer
 

n°1671370
IrmatDen
Posté le 15-01-2008 à 11:15:52  profilanswer
 

Salut,
 
1. Tu devrais éliminer les variables globales à tout jamais
2. Quel est le code setSize ?

n°1671401
nick456
Posté le 15-01-2008 à 12:21:47  profilanswer
 

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...

n°1671416
nick456
Posté le 15-01-2008 à 12:51:15  profilanswer
 

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 ?

n°1671448
nick456
Posté le 15-01-2008 à 13:42:02  profilanswer
 

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.

n°1671451
IrmatDen
Posté le 15-01-2008 à 13:47:51  profilanswer
 

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?


Message édité par IrmatDen le 15-01-2008 à 13:48:37
n°1671570
nick456
Posté le 15-01-2008 à 16:04:26  profilanswer
 

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. ;)

n°1671597
IrmatDen
Posté le 15-01-2008 à 16:27:21  profilanswer
 

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 :)

n°1671603
nick456
Posté le 15-01-2008 à 16:34:54  profilanswer
 

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

n°1671619
IrmatDen
Posté le 15-01-2008 à 17:28:45  profilanswer
 

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 :D), 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.

mood
Publicité
Posté le 15-01-2008 à 17:28:45  profilanswer
 

n°1672491
xilebo
noone
Posté le 16-01-2008 à 20:25:45  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  appel de fonctions membre

 

Sujets relatifs
Appel synchrone de callbackCompteur de visite journaliére, fonctions de date en sql
[Divers] Appel aux pros de ce forumZone membre: le client choisi lui même ses membres
Class template et membre staticFonction avec parametre en char * et appel avec string
Appel en Javascript avec paramètres vers Php[Javascript] Problème entre deux fonctions
[HTML] Faire appel a du texte externe ?utiliser les fonctions id3 avec php
Plus de sujets relatifs à : appel de fonctions membre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR