Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Buffer da tastiera
Forum - C/C++ - Buffer da tastiera - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:21
Domenica, 16/05/2010
Scusa Marco ... veniamo all'origine del problema ...

Perchè vuoi conoscere la situazione del buffer?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 0:00
Lunedì, 17/05/2010
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:
Codice sorgente - presumibilmente C/C++

  1. void pausa(char *frase)
  2. {
  3.    cout<<frase<<" ";
  4.    while(! kbhit());
  5.    cout<<endl;
  6. }



Purtroppo, funziona solo se il buffer è vuuto.
Ho provato anche così:

Codice sorgente - presumibilmente C/C++

  1. void pausa(char *frase)
  2. {
  3.    cout<<frase<<" ";
  4.    while (getchar()!='\n');
  5.    while(! kbhit());
  6.    cout<<endl;
  7. }



Ma ho il problema opposto.


PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 9:35
Lunedì, 17/05/2010
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:
Codice sorgente - presumibilmente C/C++

  1. void pausa(char *frase)
  2. {
  3.    cout<<frase<<" \n";
  4.    getch(); // Quando premi invio il programma continua
  5. }


Codice sorgente - presumibilmente C/C++

  1. void pausa(char *frase)
  2. {
  3.    cout<<frase<<" \n";
  4.    while(!GetAsyncKeyState(VK_LEFT)); // Continua il programma quando premi Sinistra
  5. }


Codice sorgente - presumibilmente C/C++

  1. void pausa(char *frase)
  2. {
  3.    char cmd[0x80];
  4.    sprintf(cmd, "pause %s\n", frase);
  5.    system(cmd); // Continua con qualsiasi tasto
  6. }


Codice sorgente - presumibilmente C++

  1. char GetKey()
  2. {
  3.    for(int i=8; i<0xFF; i++)
  4.       if (GetAsyncKeyState(i))
  5.          return i;
  6.    return 0;
  7. }
  8. void pausa(char *frase)
  9. {
  10.    cout<<frase<<" \n";
  11.    while(!GetKey()); // Continua con qualsiasi tasto
  12. }




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 :)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:02
Lunedì, 17/05/2010
Grazie xeeynamo! :k:

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo