MessageBox - Const Char - Concversion ASCII

Signaler
Messages postés
152
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
6 janvier 2009
-
Messages postés
152
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
6 janvier 2009
-
Bonjour,

J'ai encore besoin de vos lumieres (et ca sera pas la derniére)

1- j'utilise une boucle pour récupérer les actions clavier:
if(GetAsyncKeyState(y)==-32768){...} (cool ca marche ;))

2- "y" qui est en ascii je le converti en lettre:
z=(char)y; (je vous cache pas que la je pense faire une connerie)

3- je fais apparaitre MessageBox:
MessageBox(0, z, "lettre", 0); (et la bien sure c un cataclysme y'a rien qui fonctionne).

Pourriez vous m'aider svp .... merci.

18 réponses

Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
Quand tu di "y est en ascii" tu pense au code ascii (nb de la lettre) de la lettre y ?

Si oui, y est un int et je croi que char x=y; devrait marcher
Messages postés
152
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
6 janvier 2009

Bonjour,

- oui je pense a ascii (le nb de la lettre) et "y" est une variable
-oui y est un int
-Et non a mon grand desespoire char x=y; ne fonctionne pas.
Le message d'erreur est le suivant:
"passing `int' to argument 2 of `MessageBoxA(HWND__ *, const CHAR *, const CHAR *, unsigned int)' lacks a cast"

Voila c tout (j'utilise DevC++)

Merci
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
-------------------------------
Réponse au message :
-------------------------------

> Quand tu di "y est en ascii" tu pense au code ascii (nb de la lettre) de la lettre y ?
>
> Si oui, y est un int et je croi que char x=y; devrait marcher
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Bonjour,
> >
> > J'ai encore besoin de vos lumieres (et ca sera pas la derniére)
> >
> > 1- j'utilise une boucle pour récupérer les actions clavier:
> > if(GetAsyncKeyState(y)==-32768){...} (cool ca marche ;))
> >
> > 2- "y" qui est en ascii je le converti en lettre:
> > z=(char)y; (je vous cache pas que la je pense faire une connerie)
> >
> > 3- je fais apparaitre MessageBox:
> > MessageBox(0, z, "lettre", 0); (et la bien sure c un cataclysme y'a rien qui fonctionne).
> >
> > Pourriez vous m'aider svp .... merci.
>
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
Effectivement, ya plusieur pb, mais de tte facon, je crois que ca ne marchera pas, ce n'est pas le code ascii utilisé ici, mais les VirtualKeyCode, c différen et les code sont pas les même ! Donc tu n'aura pas la bonne lettre si tu par du principe qu'il s'agit de code ascii

Je regarde ca et si j'ai du nouveau je te prévien
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Le second param de MessageBox c'est une chaine de caractere terminée par 0.
Je vois la chaine, ou est le 0 final ?
Messages postés
152
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
6 janvier 2009

Bonjour,
- Merci Anacr0x porta recherche
- aardman, en fait je peux pas répondre a ta question car je sais pas a quoi sert ce 0.

Excusé mon ignorance mais je suis un débutant de chez débutant
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Si la variable y contient le numero de la touche, y'a pas de probleme.
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
Bon ben ds ce cas essaye avec ca :

char x=y;
char z[2];
sprintf(z, "%c", x);
MessageBox(NULL, z, "lettre", MB_OK);
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Ben comment tu veux que MessageBox sache combien de caractere elle doit ecrire ? elle est pas medium :)
En fait en C les chaines de caracteres sont terminées par le caractere NULL, le zéro final.
MessageBox copie donc toute ta chaine jusqu'au caractere 0.
Dans ton exemple, pas de caractere 0, donc forcement plantage.
Voila comment je ferais ce que tu veux faire:

if(GetAsyncKeyState(i))
{
char szText[2];
szText[0] = (char)i;
szText[1] = 0;
MessageBox(0, szText, 0, 0);
}
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
Ou encor avec ca (plus rapide)

char z[1];
z[0]=y; z[1]='\0';
MessageBox(NULL, z, "lettre", MB_OK);
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
En effet sans le sprintf(...), c'est plus joli.
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Bijourr!
Anacr0x: char z[1] réserve de la mémoire pour 1 char (soit 1 octet) donc z[1] n'existe pas! => erreur!

Ensuite le compilo donne la syntaxe de MessageBox avec l'arg pour le txt de la MsgBox : char* donc le problème venait du fait qu'un char n'est pas un char*
char est un caractère
char* est une chaîne de caractères
La méthode de Anacr0x (dsl si j'écris mal son nom) marche donc en changeant char z[1] par z[2]

A++

Chouchou182
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
La je croi que tu as tord, char z[1] donne 2 caractère, z[0] et z[1] mais la jsui plu tt a fait sur, tu ma donné un gros doute

de plus char est un caractère, char[] un tableau de caractère et char* est un pointeur sur caractère (pas forcément une chaine)

Et pour finir, le MessageBox accepte tte ces formes de caractère
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
oups, en définitive, tu doit avoir raison
G parler tro vite, dsl Chouchou182
Messages postés
152
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
6 janvier 2009

Merci pour votre aide je pense que je suis presque a la fin.
Cependant je me permet de mettre un bout de mon code pour correction (car ca marche po):
Je voudrais faire une boucle qui detecte et affiche les touches sur lesquelles on appui.
et quand on appuis que ESPACE tout s'arrete.

int x,y;
while(GetAsyncKeyState(32)!=-32768)
{

for(y=0;y=128;y++)
{
if(GetAsyncKeyState(y)==-32768)
{
char x=y;
char z[2];
sprintf(z, "%c", x);
MessageBox(NULL, z, "lettre", MB_OK);
Sleep(5);
}
Sleep(5);
}

Sleep(5);
}

Mon code doit pas etre tres optimisé mais je débute.

Encore merci pour votre aide ;)
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
for(y=0;y<128;y++)
ca devré allé un mieu, ensuite, je ne connais pas GetAsyncKeyState et otr alor...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

int x,y;
while(!GetAsyncKeyState(32))
{
for(y=33;y<128;y++)
{
if(GetAsyncKeyState(y))
{
char z[2];
z[0] = (char)y;
z[1] = 0;
MessageBox(0, z, "lettre", 0);
Sleep(5);
}
Sleep(5);
}
Sleep(5);
}

- quand tu utilise GetAsyncKeyState, pas besoin de mettre = 32768. GetAsyncKeyState retourne un truc different de 0 si la touche est enfoncée, sinon 0.

- Tu ne peux pas commencer a scanner les touches de 0 a 128, les touches "visibles" sont >32.
Messages postés
152
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
6 janvier 2009

Ca marche super merci pour tout