PDA

View Full Version : [C] Pausa - system("PAUSE")


salvodel
15-07-2008, 17:02
Salve a tutti, volevo chiedervi un modo semplice per far fermare il programma e leggere a schermo i risultati. Sotto windows utilizzo system("PAUSE") ma non è standard e sotto Linux non va. A questo punto mi ero creato la funzione pausa:
void pausa(void)
{
printf("\nPAUSE\nPremere INVIO....");
getchar();
}
quando la richiamo nel main vedo la printf ma non si ferma a getchar. Dov'è l'errore :confused: ?
Grazie a tutti.

wingman87
15-07-2008, 18:08
Forse il buffer di input non è vuoto, quindi getchar prende il suo char e l'esecuzione va avanti

salvodel
15-07-2008, 19:06
Forse il buffer di input non è vuoto, quindi getchar prende il suo char e l'esecuzione va avanti

Mi potresti dire come lo risolvo?
grazie

Big Bamboo
15-07-2008, 19:13
Mi potresti dire come lo risolvo?
grazie

while(1)
getchar();
e poi fermi il programma con un ctrl+c

ndakota
15-07-2008, 19:22
due getchar are the way :p

Stev-O
16-07-2008, 08:29
oppure molto + semplicemente

system("read");

:)

ndakota
16-07-2008, 08:41
oppure molto + semplicemente

system("read");

:)

se system("pause") non è standard immagino che nemmeno system("read") lo sia..

Stev-O
16-07-2008, 08:48
ho appena provato per sicurezza su ubuntu e funziona

scrivi read da shell e il controllo attenderà che premi un tasto

come normale che sia

analogamente se vuoi fare una lettura ritardata c'e' sempre

system("sleep x"); con x= secondi di delay

potresti mettere system("sleep 5");
per sospendere l'esecuzione per 5 sec e avere il tempo di leggere

cmq la read per unix è l'alternativa a pause di dos

salvodel
16-07-2008, 09:12
Pensavo che la cosa fosse piu semplice ed invece no.
1) Il ciclo while non mi convince l'uscita con ctrl+c.
2) Il doppio getchar va bene la prima volta ma se il buffer è vuoto la seconda volta devo dare due enter.
3) system("read") mi costringe ad usare system("PAUSE") per rendere il programma identico anche sotto Windows.

Se svuotassi il buffer prima di dare getchar? Non so come si fa.
Cmq ho provato gets e funziona ma quando compilo mi da il seguente warning:
In function `pausa':
main.c:(.text+0x2a): warning: the `gets' function is dangerous and should not be used.
Inquietante :mbe:

Energy++
16-07-2008, 09:33
void pausa(void)
{
printf("\nPAUSE\nPremere INVIO....");
fflush(stdin);
getchar();
}


provato a svuotare il buffer della tastiera? :stordita:

salvodel
16-07-2008, 09:54
void pausa(void)
{
printf("\nPAUSE\nPremere INVIO....");
fflush(stdin);
getchar();
}


provato a svuotare il buffer della tastiera? :stordita:

Niente. Piallata in pieno la funzione pausa(); :muro: Vedo solo la printf e non si ferma.
Cito: (http://forum.html.it/forum/showthread/t-996680.html) "il comportamento di fflush sugli stream di input non è definito. fflush è fatta per operare sugli stream di output." Almeno non sono il solo :D

Energy++
16-07-2008, 10:09
Niente. Piallata in pieno la funzione pausa(); :muro: Vedo solo la printf e non si ferma.
Cito: (http://forum.html.it/forum/showthread/t-996680.html) "il comportamento di fflush sugli stream di input non è definito. fflush è fatta per operare sugli stream di output." Almeno non sono il solo :D

si è vero però a me una volta aveva funzionato :D

Stev-O
16-07-2008, 13:18
ma tu vuoi creare un prg sia per linux che per win retrocompatibile ?

salvodel
16-07-2008, 13:40
ma tu vuoi creare un prg sia per linux che per win retrocompatibile ?

Che intendi per retrocompatibile? Io sto scrivendo un programma in C e per quanto ne so io se rispetto lo standard non importa il sistema operativo.
Per adesso mi sa che l'unica soluzione è l'utilizzo di direttive. Ho trovato questa soluzione ma per adesso l'ho provata una mezza volta e mi ha dato un po di problemi. Dove la devo mettere?
#ifdef _WIN
const char* pulisci = "cls";
#elseif
#ifdef LINUX
const char* pulisci = "clear";
#else
#error "OS NOT SUPPORTED"
#endif
...
system(pulisci);
Cmq anche con system("read") il programma non si ferma e va avanti :muro: :confused: .

wingman87
16-07-2008, 19:15
Ecco la mia soluzione, fammi sapere se funziona anche su linux:
#include <stdio.h>

int main(int argc,char*argv[]){
getchar();
fseek(stdin,0,SEEK_END);
getchar();
return 0;
}

Stev-O
16-07-2008, 20:25
Che intendi per retrocompatibile? Io sto scrivendo un programma in C e per quanto ne so io se rispetto lo standard non importa il sistema operativo.
Per adesso mi sa che l'unica soluzione è l'utilizzo di direttive. Ho trovato questa soluzione ma per adesso l'ho provata una mezza volta e mi ha dato un po di problemi. Dove la devo mettere?
#ifdef _WIN
const char* pulisci = "cls";
#elseif
#ifdef LINUX
const char* pulisci = "clear";
#else
#error "OS NOT SUPPORTED"
#endif
...
system(pulisci);
Cmq anche con system("read") il programma non si ferma e va avanti :muro: :confused: .
i fai quasi venir voglia di provare a scriverlo

cmq stamattina funzionava

se vuoi disimpegnarti dal sistema operativo allora ci vuole un getche();
occhio alle librerie ;)

pero' ho paura che vada solo su dos....

gugoXX
16-07-2008, 20:53
e la (giustamente) bistrattata scanf?
PS: Non tocco C puro dal 1993, e scanf forse l'ho usato una volta sola...

Albi89
16-07-2008, 21:08
Ma un ide furbetto che ti tiene la finestra aperta? :fagiano:

Big Bamboo
16-07-2008, 22:11
Ma un ide furbetto che ti tiene la finestra aperta? :fagiano:
ma lanciare il programma da terminale? :)

Albi89
16-07-2008, 22:38
ma lanciare il programma da terminale? :)

Vabè, può essere noioso, soprattutto se si fanno piccoli programmini di prova e si modificano più e più volte per testare il comportamento :D

Stev-O
17-07-2008, 07:41
cmq in genere un programma si sviluppa o per una piattaforma o per un'altra

se vuoi un prog indipendentemente dalla piattaforma devi fare un'applet java

salvodel
17-07-2008, 09:13
Premesso che io lo lancio da terminale, il problema è poter leggere dei dati a video prima che giunga alla fine il programma.

Il problema di lavorare su due sistemi operativi diversi è dovuto al fatto che il mio portatile scalda un pochino sotto Linux :mad: e dopo un po ritorno a Windows. Siccome queste sono quisquilie ("pause"&"clear") pensavo di risolverle in modo indolore.
Grazie a tutti per i suggerimenti.

Big Bamboo
17-07-2008, 10:22
Premesso che io lo lancio da terminale, il problema è poter leggere dei dati a video prima che giunga alla fine il programma.

se sei sotto linux, redirigi l'output su file con > e così non ci sono più problemi

Stev-O
17-07-2008, 11:42
ma anche sotto windows

salvodel
17-07-2008, 11:47
Lo so, ma era piu rapida una sbirciatina dei dati a video piuttosto che stampare n file.
Grazie

peppepz
17-07-2008, 18:40
Provate con:


#include <stdio.h>

void pause(void)
{
scanf("%*[^\n]");
getchar();
}

int main(int argc, char **argv)
{
puts("Hello! Press return!");
pause();
puts("Please press that again!");
pause();
puts("OK, bye!");
return 0;
}