16/05/10 20:21
Scusa Marco ... veniamo all'origine del problema ...
Perchè vuoi conoscere la situazione del buffer?
Perchè vuoi conoscere la situazione del buffer?
16/05/10 22:00
Poggi Marco
Chiedo scusa a voi: avrei dovuto spiegare prima il mio problema.
Sto cercando di fare una semplice funzione che attenda la pressione di un tasto da parte dell' utente.
Esempio:
Purtroppo, funziona solo se il buffer è vuuto.
Ho provato anche così:
Ma ho il problema opposto.
Sto cercando di fare una semplice funzione che attenda la pressione di un tasto da parte dell' utente.
Esempio:
void pausa(char *frase) { cout<<frase<<" "; while(! kbhit()); cout<<endl; }
Purtroppo, funziona solo se il buffer è vuuto.
Ho provato anche così:
void pausa(char *frase) { cout<<frase<<" "; while (getchar()!='\n'); while(! kbhit()); cout<<endl; }
Ma ho il problema opposto.
aaa
17/05/10 7:35
xeeynamo
Il buffer non è altro che un array che memorizza sequenzialmente tutti i tasti premuti in quel momento. Se tu premi A S e D contemporaneamente il buffer sarà 0x41, 0x53, 0x44, 0x00, 0x00, ... però qualunque funzione tu usi del C standard ti restituisce solo il primo carattere premuto (ovvero quello che nel buffer è posizionato per primo). Insomma, il buffer ti serve solo nella realizzazione di applicazioni complesse che necessitano di sapere quali tasti sono premuti contemporaneamente ed è qui entrano in gioco le WinApi o le DirectX (DirectInput per la precisione) e non credo affatto che ti serve sapere i tasti premuti perchè tu vuoi solo sapere se un tasto qualsiasi o un tasto specifico viene pigiato in un determinato momento nel tuo programma. Le soluzioni comunque sono varie:
Il primo codice richiama getch, una funzione che blocca il programma e scrive qualunque tasto premi. La funzione giunge al termine quando premi Invio.
Il secondo invece usa il GetAsyncKeyState, che ti dice se il tasto che tu hai specificato è stato premuto o meno. Io in quel caso ho usato VK_LEFT che indica se il tasto sinistra è premuto o meno.
Il terzo esempio usa la funzione system, che emula la programmazione in batch. Quando in batch scrivi "pause" ti dice "Premere qualsiasi tasto per continuare..." e invece quando scrivi "pause blabla" ti fa visualizzare la frase che hai scritto dopo pause con la stessa funzionalità di un normale pause. A me non piace per niente usare le funzioni system, però se vuoi scrivere un programma di fretta allora ok.
Il quarto esempio è un sistema avanzato del secondo esempio, dove con un ciclo verifico il tasto premuto in quel momento. Faccio uno scan da 8 a 255, perchè da 1 a 7 ci sono i tasti del mouse (non vorrai di certo fare "Premi un qualsiasi tasto del mouse per uscire" xD).
Spero di esser stato più dettagliato possibile
void pausa(char *frase) { cout<<frase<<" \n"; getch(); // Quando premi invio il programma continua }
void pausa(char *frase) { cout<<frase<<" \n"; while(!GetAsyncKeyState(VK_LEFT)); // Continua il programma quando premi Sinistra }
void pausa(char *frase) { char cmd[0x80]; sprintf(cmd, "pause %s\n", frase); system(cmd); // Continua con qualsiasi tasto }
char GetKey() { for(int i=8; i<0xFF; i++) if (GetAsyncKeyState(i)) return i; return 0; } void pausa(char *frase) { cout<<frase<<" \n"; while(!GetKey()); // Continua con qualsiasi tasto }
Il primo codice richiama getch, una funzione che blocca il programma e scrive qualunque tasto premi. La funzione giunge al termine quando premi Invio.
Il secondo invece usa il GetAsyncKeyState, che ti dice se il tasto che tu hai specificato è stato premuto o meno. Io in quel caso ho usato VK_LEFT che indica se il tasto sinistra è premuto o meno.
Il terzo esempio usa la funzione system, che emula la programmazione in batch. Quando in batch scrivi "pause" ti dice "Premere qualsiasi tasto per continuare..." e invece quando scrivi "pause blabla" ti fa visualizzare la frase che hai scritto dopo pause con la stessa funzionalità di un normale pause. A me non piace per niente usare le funzioni system, però se vuoi scrivere un programma di fretta allora ok.
Il quarto esempio è un sistema avanzato del secondo esempio, dove con un ciclo verifico il tasto premuto in quel momento. Faccio uno scan da 8 a 255, perchè da 1 a 7 ci sono i tasti del mouse (non vorrai di certo fare "Premi un qualsiasi tasto del mouse per uscire" xD).
Spero di esser stato più dettagliato possibile
aaa