Oppure

Loading
16/05/10 19:46
Poggi Marco
Postato originariamente da nessuno:

@Marco ... puoi usare la funzione getchar per capire cosa c'è nel buffer ...


Grazie per il suggerimento!

Però ho un dubbio: nel caso in cui il buffer è vuoto, la getchar mi blocca l' esecuzione del programma finche viene premuto un tasto.
Come ovviare al problema?

Ultima modifica effettuata da Poggi Marco 16/05/10 19:48
aaa
16/05/10 20:21
Scusa Marco ... veniamo all'origine del problema ...

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:
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:
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
17/05/10 16:02
Poggi Marco
Grazie xeeynamo! :k:
aaa