2017-04-18 5 views
0

Mon petit projet comporte une fenêtre surgissant, accueillant l'utilisateur et demandant son nom. Et c'est là que les touches sont pressées et que celles qui sont sauvegardées dans un tableau peuvent être utilisées plus tard. Sauf, quand je lance cette partie du code qui est censé le faire:Obtention d'événements de clavier enregistrés dans un tableau avec une fenêtre graphique sur

while (done != 0) 
{ 
    GFX_GetKeyPress(&key); 
    if (key == ALLEGRO_KEY_ESCAPE) 
    { 
     done = 1; 
    } 
    else 
    { 
     key = GFX_GetKeyPress(*(user.name+1)); 
    } 
} 

Avec le réseau étant caché dans une structure:

struct user_details 
{ 
    char name[40]; 
} 

et appelé dans la fonction principale par struct user_details user. De plus, le GFX_GetKeyPress(int * keypress_ptr) est une fonction d'une bibliothèque que nous avons à l'université, et nous permet de savoir quelle touche est enfoncée. Sauf que lorsque j'utilise le code, cette partie est complètement ignorée. Le programme informe seulement l'utilisateur qu'il veut que son nom, qui est avant cette partie, puis continue à demander d'autres choses, ce qui est après cela. Je suis surtout sûr d'avoir suivi les instructions que nous avons reçues pendant nos cours, mais d'une manière ou d'une autre je ne dois pas être et je n'ai aucune idée de ce que j'ai raté. S'il vous plaît, aidez.

Répondre

0

Si je vois votre code correctement, quand vous dites key = GFX_GetKeyPress(*(user.name+1));, vous êtes déréférencement en fait le deuxième caractère du tableau CString name[40], donc ce que vous faites serait essentiellement équivalent à appeler key = GFX_GetKeyPress('A');. Je suis assez surpris que vous n'ayez pas reçu d'avertissement de compilateur pour cela. Tout d'abord, vous passez le mauvais type (int vs char). Cependant, plus important encore, vous passez une valeur de caractère où un pointeur sur un entier est attendu. En plus d'être surpris, vous n'obtenez pas d'avertissement, je suis complètement choqué que votre programme ne se soit pas déréglé en raison d'essayer d'accéder à la mémoire invalide. Si GFX_GetKeyPress(int * keypress_ptr) est capable de gérer un tampon cstring au lieu d'un pointeur entier et en supposant que vous avez l'intention de passer le pointeur au deuxième caractère dans le tampon user.name, alors tout ce que vous devez faire est: key = GFX_GetKeyPress(user.name+1) (qui sera passer l'adresse du premier élément du tableau tableau + 1 octet pour l'index suivant.)

Je n'ai pas travaillé avec Allegro, donc je ne suis pas sûr de tous les tenants et aboutissants de la bibliothèque, mais c'est juste la connaissance du pointeur C standard.