Euhhh ... :-) desolé, c'est compliqué a expliquer...

Résolu
BertaNd Messages postés 9 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 17 août 2005 - 2 août 2005 à 23:53
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 3 août 2005 à 15:35
salut

c'est assez compliqué a expliquer donc je met une source, ca parle mieux !



(API win32)



tout le tralala de la creation de la fenetre etc...

TranslateMessage(&msg);

DispatchMessage(&msg);

// un des deux appelle le module d'en dessous (si j'ai bien compris...)





LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

int i;

switch (msg)

{

case WM_TIMER: // ce n'est pas le message qui est important

switch (i)

{

case 1:


// instructions

i++;

break;

case 2:


// instructions

i++;


break;

// etc...

}

}

return 0;

}



voila, mon probleme c'est que ... en fait je n'arrive pas a garder la bonne valeur de i...

a chaque fois que le programme arrive a WinProc, i se reinitialise
(normal ! enfin il me semble, vu que c'est une variable d'un module)

il retourne 0, et lorsqu'il revient, i a une valeur differente de celle d'avant...

je sais pas si vous comprenez... (j'explique tres mal je le sais, désolé...)



je voudrais pouvoir garder la valeur de i apres avoir retourné 0 (tout simplement !)



merci et bravo a ceux qui m'ont compris !

12 réponses

meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
3 août 2005 à 00:09
Salut,



En effet, pas tout compris...



En fait, il me semble que la fonction WinProc est chargée de traiter les évènements (quand on clique quelque part, qu'on déplace la fenêtre, qu'on appuie sur une touche, etc.).



Si tu souhaites conserver la valeur de i, il faudrait mieux que cette
variable soit déclarée de manière globale (en dehors de la fonction) et
non localement (dans la fonction).



En fait, essaie de placer ta déclaration int i
dans un fichier d'en-têtes (ou au-dessus de toutes tes fonctions), en
précisant éventuellement le mot-clef static... L'incrément de ton i devrait alors se réaliser correctement lors de chaque appel d'un évènement Win32.



#include <windows.h>



// déclaration variabale globale i.

int i = 0;



// fonction WinMain...



// fonction WinProc...

LRESULT CALLBACK WinProc(...)

{

// (!) ne pas déclarer de nouveau la variable i

switch(msg)

{

case WM_TIMER:

switch(i)

{

case 2:

i++;

case 3:

i++;

// (...)

}

}

}





J'espère avoir compris le but et t'avoir un peu aidé.



NB. Profites-en pour initialiser une bonne fois pour toutes cette variable à zéro (par exemple, au démarrage de l'application).
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 août 2005 à 00:01
Tu lances ton Timer au moins ??? lol

Balance tout le code si c'est petit parce que c'est vrai que t'explique mal lol :p

void Aurevoir( void ); //Bonne journée
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 août 2005 à 00:02
Ah j'viens de voir que le message n'est pas important :)

Désolé j'lis toujours tout en 2 fois

void Aurevoir( void ); //Bonne journée
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 00:07
ben non, i est dans la wndproc donc initialisé "nouveau" à chaque appel de cette wndproc.
Mets i en variable globale, il conservera sa valeur.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 août 2005 à 00:09
et si on fait

static int i;



et une initialisation dans WM_CREATE, ou WM_INITDIALOG ?

void Aurevoir( void ); //Bonne journée
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 00:23
vi vi c'est bon Joky ainsi mais ce n'est qu'une variante de syntaxe pour éviter qu'on y retouche ailleurs dans le code (hors de la wndproc) sinon le compilo génèrera le même code que si on met i en var globale.

ciao...
BruNews, MVP VC++
0
BertaNd Messages postés 9 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 17 août 2005
3 août 2005 à 01:04
"// déclaration variabale globale i.

int i = 0;"



ok merci !

c'est tout simple !!!

c'est juste parce que je pensais que les variables globales ne pouvait pas etre changées...



j'ai confondu avec les constantes...



enfin bon ! il est quand meme 1h du matin, je suis plus tres frais !
0
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
3 août 2005 à 09:02
BertaNd,



Ca serait sympa d'accepter ma réponse



Peace.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 août 2005 à 10:03
ok meech, je te l'ai validée.

ciao...
BruNews, MVP VC++
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 11:33
static me semble la meilleure solution, pour garantir une bonne encapsulation des données.
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
3 août 2005 à 14:38
BN, Joky , XTH,...>

parfaitement d'accord avec [auteurdetail.aspx?ID=213313 xterminhate]


static me semble bcp plus propre, je suis de l'école à proscrire au max les var globales



mm si le code généré est le mm,

les protection précompil me semble plus fortes et plus protectrices



y a déjà suffisement d'err possible ds un code ....

___________________________________________________________
Magicalement
Nono
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
3 août 2005 à 15:35
Salut,

Moi aussi je préfère la solution du static. On met juste static int i =0; au début de la WindProc.
0
Rejoignez-nous