Repository 32bit  Forum
Repository 64bit  Wiki

(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.

(C) Fare una funzione pause();

Messaggioda sardylan » gio feb 21, 2008 14:06

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
sardylan
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: mar apr 24, 2007 8:21
Località: San Vito (Cagliari)
Nome Cognome: Luca Cireddu
Slackware: current 64bits
Kernel: 3.1.2
Desktop: KDE 4.5.5
Distribuzione: Debian - CLFS

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

Messaggioda puzuma » gio feb 21, 2008 14:26

secondo questo thread : http://www.slacky.eu/forum/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
puzuma
Linux 2.4
Linux 2.4
 
Messaggi: 479
Iscritto il: mar lug 04, 2006 16:14
Località: Udine
Nome Cognome: Stefano Salvador
Slackware: current
Kernel: 2.6.32.2
Desktop: KDE 4.4.0

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

Messaggioda kasher » gio feb 21, 2008 15:58

Io ho sempre utilizzato la getchar() ed ha sempre funzionato, non so come mai a te non ti funziona.
Avatar utente
kasher
Linux 2.0
Linux 2.0
 
Messaggi: 174
Iscritto il: gio gen 20, 2005 0:00
Slackware: 12.2
Kernel: 2.6.27.7
Desktop: kde 3.5.10

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

Messaggioda Dani » gio feb 21, 2008 16:04

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...
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

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

Messaggioda kasher » gio feb 21, 2008 16:56

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
kasher
Linux 2.0
Linux 2.0
 
Messaggi: 174
Iscritto il: gio gen 20, 2005 0:00
Slackware: 12.2
Kernel: 2.6.27.7
Desktop: kde 3.5.10

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

Messaggioda lamarozzo » gio feb 21, 2008 18:18

Se non mi ricordo male la libreria ncurses dovrebbe avere diverse funzioni che ti aiutano allo scopo. Sono molto flessibili e molto portabili.
Avatar utente
lamarozzo
Linux 2.6
Linux 2.6
 
Messaggi: 732
Iscritto il: mer lug 13, 2005 23:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

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

Messaggioda Dani » gio feb 21, 2008 18:24

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;
}
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

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

Messaggioda FireEater » gio feb 21, 2008 19:13

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;
}
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

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

Messaggioda Mario Vanoni » gio feb 21, 2008 19:58

@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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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

Messaggioda absinthe » gio feb 21, 2008 20:05

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
absinthe
Iper Master
Iper Master
 
Messaggi: 2354
Iscritto il: sab mag 14, 2005 23:00
Località: Prato
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze

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

Messaggioda FireEater » gio feb 21, 2008 20:20

@absinthe:

2) usleep(microsecondi)
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

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

Messaggioda JohnnyMnemonic » gio feb 21, 2008 20:26

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
JohnnyMnemonic
Staff
Staff
 
Messaggi: 2732
Iscritto il: sab set 04, 2004 23:00
Località: Bologna
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos

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

Messaggioda FireEater » gio feb 21, 2008 20:38

#-o non uso ci da parecchio ormai. Da un po' solo "giava" :D
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

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

Messaggioda boh » gio feb 21, 2008 21:35

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
boh
Linux 2.6
Linux 2.6
 
Messaggi: 926
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.10.17
Desktop: KDE 4.10.5

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

Messaggioda sardylan » gio feb 21, 2008 22:58

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...
Avatar utente
sardylan
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: mar apr 24, 2007 8:21
Località: San Vito (Cagliari)
Nome Cognome: Luca Cireddu
Slackware: current 64bits
Kernel: 3.1.2
Desktop: KDE 4.5.5
Distribuzione: Debian - CLFS

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite