|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
[C] Funzione getch(); su linux...
Salve ragazzi. Sto programmando su ambiente GNU/Linux, e sto avendo problemi sull'utilizzo della funzione getch(); (quella che su windows ferma l'esecuzione in attesa della pressione di un tasto da parte dell'utente!)
Cercando sulla rete ho scoperto che la stessa funzione non è presente (c'è un altra getch() inclusa in ncurses.h credo, ma non fa la stessa cosa!) - ma ho bisogno assolutamente di quella funzionalità! Spero possiate darmi una soluzione (possibilmente funzionante anche su win, per la portabilità)!
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
fgetc?
__________________
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 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
ho già provato a fare:
Codice:
getc(); getc(stdin); getchar(); Codice:
void Pausa(void)
{
int invio;
printf(" - Premi INVIO per continuare - \n");
invio = getchar();
}
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync Ultima modifica di Starise : 21-10-2006 alle 15:10. |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
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 |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
Scusate, non capisco cosa sbaglio. Il codice di prima non funziona. Adesso l'ho modificato cosi:
Codice:
void Pausa(void)
{
int invio;
printf(" - Premi INVIO per continuare - \n");
invio = fgetc(stdin);
}
PS: Sto su Gentoo Linux, compilo con gcc 4.1.1
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non saprei, qui va.
Provala come main() singola, ci deve essere un problema da qualche altra parte. In che senso non ti funziona? Non si blocca sulla fgets? Non risponde a <invio>?
__________________
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 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
Non si blocca sul fgetc. Però provata come main singola... funziona!
però è strano.... chiamata da questa main invece, non va: Codice:
main()
{
/* contiene la scelta dell'utente */
char scelta;
do
{
MenuPrincipale();
scanf("%c", &scelta);
if( scelta == '1' )
{
printf("scelta 1\n");
Pausa();
}
else if( scelta == '2' )
{
printf("scelta 2\n");
Pausa();
}
}while( scelta != '0' );
return (0);
}
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
Codice:
if( scelta == '1' )
{
int invio;
printf(" - Premi INVIO per continuare - \n");
invio = fgetc(stdin);
}
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#9 | |
|
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 |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
ho provato a riavviare la macchina, far partire il programma...
ma continua non funzionare... (anche togliendo il do-while) cosa posso fare?
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
C'è un punto precedente del programma dove leggi dell'input dato dall'utente?
__________________
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 |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
l'unica istruzione di lettura è
Codice:
scanf("%c", &scelta);
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
La scanf legge da stdin, che è line-buffered. Quindi nessun carattere viene passato alla scanf finché stdin con contiene una riga intera, <invio> incluso. La scanf si ciuccia il suo bel %c, le la getchar legge \n. Prova a sostituire la scanf con scanf("%c\n", &scelta);
__________________
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 |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
Ho provato cosi, ma alla scanf devo inserire 2 volte il valore prima che lo accetti. Dopodichè entrato in Pausa(), continua a non funzionare (ho controllato con printf il valore di "invio", in pratica prende il valore che sta in scanf.
Ti do un esempio dell'output: Codice:
::MENU PRINCIPALE::
1) Visualizza Contatto
0) Esci dal Programma
1
1
scelta = 1
(entro nella function Pausa)
- Premi INVIO per continuare -
invio = 1
::MENU PRINCIPALE::
1) Visualizza Contatto
0) Esci dal Programma
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Allora rimetti la scanf come era prima; subito dopo la scanf metti questo:
while(getchar()!='\n'); E' un pò una ciofeca; per risolvere bene il problema dovresti usare le funzioni di i/o di linux.
__________________
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 |
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
Quote:
Quote:
Grazie ancora.
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
||
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Io inizierei con read e write: apri Konqueror e digita come indirizzo: man:/read o man:/write (la pagina di man che ti interessa è la prima, se ce n'è più d'una). Oppure usa il "man" da console, ma ti consiglio Konqueror per 2 motivi: 1) dopo che hai digitato man:/ ti escono tutte le pagine di man disponibili come lista. 2) Puoi navigare nelle pagine di man come fossero ipertesto (utile soprattutto nella parte "See also", dove vengono citate le altre funzioni correlate: ti basta cliccare sulla funzione correlata di interesse e viene aperta in automatico la pagina di man associata).
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
scusa ma perché una getchar semplice non va? io la uso sempre su Windows; l'unica cosa è che non ferma l'esecuzione alla pressione di un tasto qualsiasi, ma di Invio.
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
fpurge x svuotare i buffer?
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Codice:
#include <stdio.h>
int main(void)
{
int x;
scanf ("%d", &x);
printf("Premi INVIO per continuare...");
getchar();
}
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:14.



















