Pagina 1 di 2

(C) Fare una funzione pause();

Inviato: gio 21 feb 2008, 14:06
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...

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

Inviato: gio 21 feb 2008, 14:26
da puzuma
secondo questo thread : viewtopic.php?f=20&t=22463 devi usare getch

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

Inviato: gio 21 feb 2008, 15:58
da kasher
Io ho sempre utilizzato la getchar() ed ha sempre funzionato, non so come mai a te non ti funziona.

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

Inviato: gio 21 feb 2008, 16:04
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...

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

Inviato: gio 21 feb 2008, 16:56
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...

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

Inviato: gio 21 feb 2008, 18:18
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.

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

Inviato: gio 21 feb 2008, 18:24
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;
}

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

Inviato: gio 21 feb 2008, 19:13
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;
}

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

Inviato: gio 21 feb 2008, 19:58
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

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

Inviato: gio 21 feb 2008, 20:05
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

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

Inviato: gio 21 feb 2008, 20:20
da FireEater
@absinthe:

2) usleep(microsecondi)

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

Inviato: gio 21 feb 2008, 20:26
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);

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

Inviato: gio 21 feb 2008, 20:38
da FireEater
#-o non uso ci da parecchio ormai. Da un po' solo "giava" :D

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

Inviato: gio 21 feb 2008, 21:35
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);

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

Inviato: gio 21 feb 2008, 22:58
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...