|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: vinci-spicchio
Messaggi: 530
|
Pulire il buffer di tastiera[c/c++]
Cerco una funzione che pulisca il buffer di tastiera, perchè sto costruendo un gico in stile asteroids per una esercitazione di scuola, lavoriamo su uno schifosissimo borland 5.02 in modalita grafica sotto dos a 256 colori, e non riesco a pulire i tasti premuti precedentemente neanche con fflush(stdin);, qualcuno di voi massimi esperti conosce un qualsiasi modo per poter risolvere questo problema, anche includendo delle librerie o con un pezzo di codice scritto in assembler, come vi pare, basta funzioni.
La navicella si sposta però avvolta rimangono in memoria i tasti premuti precedentemente e va un po come gli pare. Cionci aiutami!!! Grazie
__________________
Intel Pentium DualCore E2140 1,60 GHz , Asus P5LD2 R2.0,Sapphire x600xt 128Mb,hauppauge winTV,2x256Mb Ddr2 Vitesta 533Mhz,western digital caviar 160gb, seagate 20gb 5400giri, maxtor 40gb 7200giri, dvd+-rw gigabyte(BTC) 4x,Samsung writemaster dvd duallayer 18x , edimax wireless<-->router D-link G604T. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2002
Città: vinci-spicchio
Messaggi: 530
|
up
nessuno che mi da una mano?
__________________
Intel Pentium DualCore E2140 1,60 GHz , Asus P5LD2 R2.0,Sapphire x600xt 128Mb,hauppauge winTV,2x256Mb Ddr2 Vitesta 533Mhz,western digital caviar 160gb, seagate 20gb 5400giri, maxtor 40gb 7200giri, dvd+-rw gigabyte(BTC) 4x,Samsung writemaster dvd duallayer 18x , edimax wireless<-->router D-link G604T. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Un modo (non standard e poco pulito) è usare le funzioni di conio.h:
while(kbhit()) getch();
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
fflush(stdin);
|
|
|
|
|
|
#5 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Purtroppo non è standard, e può funzionare o meno a seconda del compilatore. (E, a quanto ci dice alderighi, in questo caso non va.) A proposito: catturare un segnale da tastiera (anziché leggere semplicemente un carattere dallo standard input) è un'operazione fortemente machine-dependent. Temo che in questo caso sia d'obbligo consultare il manuale del compilatore. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Raga , io ho trovato anke
Codice:
while ( getchar() != '\n' ); Grazie Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Ma dici che è una soluzione consigliabile anke se non specificata dallo standard? Ciao EDIT : Comunque ilsensine , ho provato a fare come mi hai detto tu , ossia includere "termios.h" , e poi ho provato "fflush(stdin);" , al posto del codice che avevo postato poco sopra , ma non sembra funzionare , con questa va in LOOP e genera una roba del genere : 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in instruction shell 00 ? Sorry , no letters in inst bash-2.05b$ Mentre dovrebbe essere : 00 ? s Sorry , no letters in instruction shell 00 ?
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 04-02-2004 alle 17:17. |
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Dai una occhiata a man termios
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Mi inginocchio al tuo cospetto , e ti chiedo umilmente di dirmi come esare le funzioni di sto header per flushare lo STDIN , perchè nella mia somma ignoranza non riesco a decifrare una pippa del man di "termios"
![]() Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Nun me abbandonà ilsensì!!
Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
tcflush?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Si , l'avevo pensato ank io , ma il problema è come lo uso? Cioè , io sono ankora un principiante , e del MAN non ci ho capito una mazza . Ho solo capito che al secondo membro della funzione ci devo piazzare "TCIFLUSH" e quindi diventa : tcflush(XXX, TCIFLUSH); ma al primo membro che ci metto? Ho provato tcflush(stdin, TCIFLUSH); Ma ovviamente non funziona simpletron.c: In function `main': simpletron.c:40: warning: passing arg 1 of `tcflush' makes integer from pointer without a cast Come la devo configurare sta funz?
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
man fileno
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Ho tentato sta forma , ma non sembra funzionare :
tcflush(fileno(stdin), TCIFLUSH); Avrebbe dovuto funzionare o ho scannato anke in questo caso? Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Boh ho provato, e mi funziona...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
A me no , ho provato anke con sto programmino di prova : Codice:
#include <stdio.h>
#include <termios.h>
int main()
{
int prova;
scanf("%d", &prova);
printf("%d\n", prova);
tcflush(fileno(stdin), TCIFLUSH);
scanf("%d", &prova);
printf("%d\n", prova);
return 0;
}
Codice:
bash-2.05b$ ./test <------ Parte il programma a <------ Immetto un carattere al posto di un intero 1073821792 <------ Viene printato un valore intero dal primo printf 1073821792 <------ Il secondo scanf è come se non esistesse e viene subito printato il valore dal secondo printf bash-2.05b$ Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
(Indizio: stdin è line-buffered di default)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Ok , ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
#include <stdio.h>
#include <termios.h>
int main() {
int prova;
struct termios tios;
int fd = fileno(stdin);
tcgetattr(fd, &tios);
tios.c_lflag &= ~ICANON;
tios.c_cc[VMIN] = 1;
tios.c_cc[VTIME] = 0;
tcsetattr(fd, TCSAFLUSH, &tios);
scanf("%d", &prova);
printf("%d\n", prova);
tcflush(fd, TCIFLUSH);
scanf("%d", &prova);
printf("%d\n", prova);
return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:11.



















