PDA

View Full Version : [C] getch che non blocca


australopiteci
11-04-2007, 17:00
Salve a tutti, non capisco per quale motivo questa getch sia non bloccante e tutti i valori vadano a finire sul case default. Ora incollo la parte del codice interessata.



while (in_esecuzione)
{


//pos_nave.x += SPOSTAMENTO_NAVE; /*sposta a sinistra la nave*/
pos_nave.vita +=1;


/*invia il dato alla funzione controllo i dati che indicano la nuova posizione della nave*/
scrivi_su_buffer(pos_nave);

//fflush(stdin);

/* input da tastiera*/
fflush(stdin);
switch(c = getch())
{


case TASTO_USCITA:
/*scrivi sul buffer (accedendo tramite l'opportuno mutex e verificando se vi
siano posizioni disponibili per la scrittura)relativo alla comunicazione con
controllo i dati che indicano che il giocatore ha scelto di uscire dal
gioco*/
pos_niente.tipo = USCITA;



in_esecuzione = false;/*esci dal ciclo esterno e quindi fai finire il thread*/

break;

/*se si preme la freccia sinistra la nave si sposta a sinistra*/
case SINISTRA:

/*se la nave è in una posizione dello schermo dove può stare*/
if(pos_nave.x > DISTANZA_DAI_LATI)
pos_nave.x -= SPOSTAMENTO_NAVE; /*sposta a sinistra la nave*/

scrivi_su_buffer(pos_nave);

break;
/*se si preme la freccia destra la nave si sposta a destra*/
case DESTRA:
/*se la nave è in una posizione dello schermo dove può stare*/
if(pos_nave.x < MAXX-DISTANZA_DAI_LATI)
pos_nave.x += SPOSTAMENTO_NAVE;/*sposta a destra la nave*/

scrivi_su_buffer(pos_nave);

break;
default:
sleep(1);
pos_nave.x -= SPOSTAMENTO_NAVE;

}

}


Ho provato anche ad usare fflush ma il problema rimane..

andbin
11-04-2007, 17:16
Salve a tutti, non capisco per quale motivo questa getch sia non bloccante e tutti i valori vadano a finire sul case default.getch() è bloccante. Inoltre fflush(stdin) non serve a nulla e come ho già detto molte altre volte, lo standard prevede che fflush sia usato con stream di output (con stream di input il comportamento non è predefinito, ma con certi compilatori funziona).

Piuttosto le costanti SINISTRA/DESTRA sono per le frecce della tastiera??? I tasti "speciali" (Fxx, frecce, page up/down, ecc...) vengono ottenuti tramite una sequenza di 2 codici, il cui primo valore è 0 oppure 224 e il secondo un codice particolare. Quindi serve una sequenza di 2 getch() per usare tali tasti.

australopiteci
11-04-2007, 17:49
si esatto sono le frecce direzionali. Il fatto è che pero' va sempre nel case di default senza premere nessun tasto. Sto debuggando e mi sa proprio che la getch ritorna un -1 quindi c'è un errore ma mi sembra giustissimo il codice...

andbin
11-04-2007, 19:38
si esatto sono le frecce direzionali. Ripeto che per i tasti speciali c'è una sequenza particolare composta da 2 codici, quindi un modo corretto di gestire tali tasti è il seguente:
#include <stdio.h>
#include <conio.h>

int main (void)
{
int ch, end = 0;

while (!end)
{
ch = getch ();

switch (ch)
{
case 0x00:
case 0xE0:
ch = getch ();

switch (ch)
{
case 0x4B:
printf ("Freccia sinistra\n");
break;
case 0x4D:
printf ("Freccia destra\n");
break;
}
break;

case 0x1B: /* ESC */
printf ("ESC\n");
end = 1;
break;
}
}

return 0;
}