Newsgroup: it.comp.lang.c
Titolo: countdown

Ciao a tutti. VOrrei realizzare un countdown in C, per la visualizzazione
ho pensato di utilizzare i caratteri speciali ascii CR e NULL (in modo da
coprire il caratteri precedente). Il problema č che non so come inserire
una pausa (vorrei un secondo) tra una istruzione e l'altra. Esiste
un'istruzione specifica? Grazie.ůů
#include<stdio.h>
main()
{
 int inizio=10;
 char ritorna=13;
 char cancella=0;
 printf("nnconto alla rovesciann");
 
 while(inizio>0)
 {
  printf("%d%c%c%c",inizio,ritorna,cancella,ritorna);
  inizio--;
 }
 printf("nnlancio!");
 printf("nn%d",inizio);
 getchar();
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 un'istruzione specifica? Grazie.
CR può andare ma il NUL assolutamente non dà il risultato che ti 
aspetti. Piuttosto usa uno spazio.
Per la pausa verifica se è disponibile la funzione sleep().  Il loop 
corretto è il seguente.  La tua versione cancella immediatamente i 
numeri dopo averli stampati e se non aggiungi la chiamata a fflush() 
non riuscirai a vedere nulla perché il video non verrà aggiornato fino 
al ricevimento di un '\n';
  while (inizio > 0) {
         printf("%2d\r", inizio);
	/* od anche printf("\r  \r%d", inizio); */
         fflush(stdout);
         inizio--;
         sleep(1);
   }
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 Giovanni
Grazie per la risposta, ma anche come dici tu non funziona: riesco a
vedere solamente un 10 oppure un 1!
se guardi questo algoritmo:
#include<stdio.h>
main()
{
 int inizio=10;
 char ritorna=13;
 char cancella=0;
 char controllo='c';
 
 printf("nn%d",inizio);
 printf("nn%cr%cr",controllo,cancella);
 getchar();
}
provando ad aggiungere una sequenza di escape alla volta vedrai che
funziona. Se poi usandolo dentro a un ciclo le cose cambiano questo non lo
so. La funzione sleep sembra non ritardare nulla:
#include<stdio.h>
#include <unistd.h>
main()
{
 int inizio=10;
 char cancella=0;
 printf("nnconto alla rovesciann");
 
 while(inizio>0)
 {
  printf("%dr%cr",inizio,cancella);
  inizio--;
  sleep(1);
 }
 printf("nnlancio!");
 printf("nn%d",inizio);
 getchar();
}
inoltre inizio non dovrebbe arrivare a zero...non so cosa pensare.


 }
Che ambiente usi?  Su Linux il loop che ho postato funziona 
perfettamnte. :-)
Inoltre ti ripeto che senza la fflush() non vedi nulla.  Lo stdout è 
uno stream bufferizzato e fintanto che non riceve '\n' (o con il 
comando di flushing) non trasferisce al video.
Anche il tuo cliente delle news è un po' strano tagli tutti i '\' :-(
Forse perché vengano mantenuti dovresti raddoppiarli '\\' per far sì 
che anche gli altri li vedano.


Giovanni wrote:

In effetti su Linux funziona benissimo così:
#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
main()
{
 int inizio=15;
 char cancella=0;
 system("clear");
 printf("\n\nconto alla rovescia\n\n");
 
 while(inizio>0)
 {
  if(inizio<10)
  {printf("0");}
 
  printf("%d",inizio);
  sleep(1);
  printf("\r");
  fflush(stdout);
  inizio--;
 }
 printf("\n\nlancio!");
 getchar();
}
mentre su windows assolutamente no, ottengo solo la visualizzazione di 01.
Da cosa può dipendere?
I

Da cosa può dipendere?
Sostituisci lo sleep con:
Sleep(1000);
in quanto il parametro è espresso in millisecondi.

 in quanto il parametro � espresso in millisecondi.
Grazie!