(C) Fare una funzione pause();

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
sardylan
Linux 3.x
Linux 3.x
Messaggi: 993
Iscritto il: mar 24 apr 2007, 9:21
Nome Cognome: Luca Cireddu
Slackware: current 64bits
Kernel: 3.16
Desktop: KDE 4.14
Distribuzione: Debian - CLFS
Località: Cagliari
Contatta:

(C) Fare una funzione pause();

Messaggio da sardylan »

Salve a tutti... Una cosa magari banalissimo, ma per la quale non ho trovato nessuna soluzione...
Voglio crearmi una funzione pausa da inserire in ogni programmino che faccio... Siccome non mi piacciono le cose fatte tanto per fare, anche il semplice Hello World me lo sono fatto con tanto di intestazione, parte finale e dicitura "Premere un tasto per continuare"... Credo che un esempio renda meglio l'idea...

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>

void pausa();

void pausa() {
	char pause[2];
	printf("Premere un tasto per continuare... ");
	scanf("%s", pause);
	printf("\n");
}

int main() {
	system("clear");
	printf("\n\n\nProgrammino Ciao mondo...\n\n\n");
	printf("Hello World\n");
	pausa();
	printf("Grazie... Ciao!!!\n");
	return 0;
}
La funzione pausa è comoda per programmi più complessi, dove ho bisogno di bloccare l'esecuzione per un po' e dare il tempo di leggere...
Ho iniziato provando la comunissima funzione getchar();, che non serviva "a niente" perché l'esecuzione continuava come se non ci fosse nessuna getchar...
Ho provato allora ad utilizzare la scanf("%*c"); letta da qualche parte in internet, che solo come è scritta non mi ha convinto molto, ed infatti aveva un comportamento uguale alla getchar()...
Allora ho provato ad usarla normalmente creando una variabile pausa ed usandola con scanf("%c", pausa);, ma mi costringe a digitare almeno un carattere prima di permere INVIO per farlo continuare...
E per ultimo ho provato scanf("%s", pausa); dichiarando la char pause[2]; di due elementi così da poter contenere l'eventuale \0, carattere NULL di fine stringa... ma niente da fare...
Come potrei ovviare a questo problemino??? L'ideale sarebbe un qualcosa di interno al C, in modo tale che, a parte alla dipendenza da Linux dovuta al system("clear");, il programmino sia compilabile anche su altri OS...
Grazie a tutti...

Avatar utente
puzuma
Linux 2.x
Linux 2.x
Messaggi: 482
Iscritto il: mar 4 lug 2006, 17:14
Nome Cognome: Stefano Salvador
Slackware: current
Kernel: 2.6.32.2
Desktop: KDE 4.4.0
Località: Udine
Contatta:

Re: (C) Fare una funzione pause();

Messaggio da puzuma »

secondo questo thread : viewtopic.php?f=20&t=22463 devi usare getch
The quiet ones are the ones who change the world. The loud ones only take the credit.

Avatar utente
kasher
Linux 1.x
Linux 1.x
Messaggi: 175
Iscritto il: gio 20 gen 2005, 0:00
Slackware: 12.2
Kernel: 2.6.27.7
Desktop: kde 3.5.10

Re: (C) Fare una funzione pause();

Messaggio da kasher »

Io ho sempre utilizzato la getchar() ed ha sempre funzionato, non so come mai a te non ti funziona.

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: (C) Fare una funzione pause();

Messaggio da Dani »

kasher ha scritto:Io ho sempre utilizzato la getchar() ed ha sempre funzionato, non so come mai a te non ti funziona.
La macro getchar bufferizza tutto finchè non premi invio, quindi non puo' andare bene per ottenere l'effetto del system("pause") windowsiano...

Avatar utente
kasher
Linux 1.x
Linux 1.x
Messaggi: 175
Iscritto il: gio 20 gen 2005, 0:00
Slackware: 12.2
Kernel: 2.6.27.7
Desktop: kde 3.5.10

Re: (C) Fare una funzione pause();

Messaggio da kasher »

Dani ha scritto:La macro getchar bufferizza tutto finchè non premi invio, quindi non puo' andare bene per ottenere l'effetto del system("pause") windowsiano...
hai ragione dani, ma penso che a sardylan possa bastare anche solo il lavoro che fa la funzione getchar(), solo che a lui non va..
sardylan ha scritto: dove ho bisogno di bloccare l'esecuzione per un po' e dare il tempo di leggere...
Ho iniziato provando la comunissima funzione getchar();, che non serviva "a niente" perché l'esecuzione continuava come se non ci fosse nessuna getchar...

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Re: (C) Fare una funzione pause();

Messaggio da lamarozzo »

Se non mi ricordo male la libreria ncurses dovrebbe avere diverse funzioni che ti aiutano allo scopo. Sono molto flessibili e molto portabili.

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: (C) Fare una funzione pause();

Messaggio da Dani »

hai ragione dani, ma penso che a sardylan possa bastare anche solo il lavoro che fa la funzione getchar(), solo che a lui non va..
Ah ok, in quel caso con ogni probabilità la macro non aveva alcun effetto a causa del buffer sporcato da precedenti input.
Ecco un esempio:

Codice: Seleziona tutto

#include <stdio.h>
int main (void)
{
unsigned short i = 0;

while (i++ < 3)
{
	puts ("Press Enter.");
	getchar ();
}

return 0;
}
Provare ad avviare questo e alla prima fase di input anzichè premere solo invio inserite un paio di caratteri :D

Che io sappia non c'è nulla di standard per ripulire il buffer in input, quindi uso qualcosa del genere dopo ogni getc() scanf() ecc...

Codice: Seleziona tutto

void clrbuff (void) 
{
int c;
while ((c = getc(stdin)) != '\n' && c != EOF) ;
return;
}

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: (C) Fare una funzione pause();

Messaggio da FireEater »

La soluzione, senza l'utilizzo della libreria ncurses, è sempre la solita.
Disabilitare il line buffering della shell in modo che la getchar legga solo un carattere.

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>

int newgetch();
 
int newgetch( ) {
 struct termios oldt,
 newt;
 int ch;
 tcgetattr( STDIN_FILENO, &oldt );
 newt = oldt;
 newt.c_lflag &= ~( ICANON | ECHO );
 tcsetattr( STDIN_FILENO, TCSANOW, &newt );
 ch = getchar();
 tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
 return ch;
}


int  main() {
   int key;
   system("clear");
   printf("\n\n\nProgrammino Ciao mondo...\n\n\n");
   printf("Hello World\n");
   printf("Premere un tasto per continuare...\n");
   key=newgetch();
   printf("Grazie... Ciao!!!\n");
   return 0;
}

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: (C) Fare una funzione pause();

Messaggio da Mario Vanoni »

@sardylan

La domanda e` ambigua (pausa?):

- vuoi che il programma aspetti ad infinitum la risposta
- vuoi che il programma aspetti tot tempo e poi continui autonomo se passato il tempo definito

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Re: (C) Fare una funzione pause();

Messaggio da absinthe »

se metti uno scanf prima di un getchar ti ritrovi il buffer già pieno. soluzioni per implementare una pusa:
1-se vuoi che l'utente prema un tasto per continuare (qundi non una pausa ma un'attesa di input basta appunto il getchar prevenendo il riempimento del buffer.
la soluzione più idiota è infilare 2 getchar il primo si mangia il carattere in eccesso generato dallo scanf: ma mi immagino che non sia ciò a cui aspiri... ci deve essere anche una funzione di flush da qualche parte... mi pare fflush... in quel caso chiami fflush su stdout e poi getchar.
2- se vuoi fare una cosa tipo un periodo di attesa di tot secondi... nell'ansi c mi pare che non ci sia niente ma sia le api win32 che posix implementano la funzione sleep

ciao,
M

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: (C) Fare una funzione pause();

Messaggio da FireEater »

@absinthe:

2) usleep(microsecondi)

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: (C) Fare una funzione pause();

Messaggio da JohnnyMnemonic »

Fire_eater ha scritto:@absinthe:

2) usleep(microsecondi)

usleep è deprecata in favore di nanosleep

Codice: Seleziona tutto

 int nanosleep(const struct timespec *req, struct timespec *rem);

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: (C) Fare una funzione pause();

Messaggio da FireEater »

#-o non uso ci da parecchio ormai. Da un po' solo "giava" :D

Avatar utente
boh
Linux 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven 16 set 2005, 0:00
Slackware: 14.2 (x64)
Kernel: 4.4.111
Desktop: KDE 4.14.32
Località: Milano
Contatta:

Re: (C) Fare una funzione pause();

Messaggio da boh »

Dani ha scritto:
Che io sappia non c'è nulla di standard per ripulire il buffer in input, quindi uso qualcosa del genere dopo ogni getc() scanf()
Veramente ci sarebbe

Codice: Seleziona tutto

fflush(stdin);
"Be yourself. Everyone else is already taken." ~ Oscar Wilde

Avatar utente
sardylan
Linux 3.x
Linux 3.x
Messaggi: 993
Iscritto il: mar 24 apr 2007, 9:21
Nome Cognome: Luca Cireddu
Slackware: current 64bits
Kernel: 3.16
Desktop: KDE 4.14
Distribuzione: Debian - CLFS
Località: Cagliari
Contatta:

Re: (C) Fare una funzione pause();

Messaggio da sardylan »

Mario Vanoni ha scritto:@sardylan

La domanda e` ambigua (pausa?):

- vuoi che il programma aspetti ad infinitum la risposta
- vuoi che il programma aspetti tot tempo e poi continui autonomo se passato il tempo definito
Dovrebbe essere la prima... La mia idea era proprio di farmi una funzione pausa che potrei richiamare prima di dare il system("clear")... Cosi' da avere tutto il tempo di vedere con comodita' l'output, e poi, quando ho finito, premo un tasto per riprendere l'esecuzione del programma...
Grazie a tutti delle risposte... Appena finisco di risistemarmi il portatile provero' le varie soluzioni...

Rispondi