C: ncurses.h y time.h

Imagen de madridista19
0 puntos

Hola, tengo el siguiente problema: estoy intentando insertar una cuenta regresiva en mi programa, programado en C, que utiliza la biblioteca ncurses para abrir otra ventana. La idea es que la cuenta regresiva se ejecute al mismo tiempo que la entrada de otros datos. Es para un juego del ahorcado. Lo que pasa es que al ejecutar el programa, primero se cuenta el tiempo (sin mostrarlo en pantalla), y luego si abre la ventana con la cuenta regresiva ya acabada, y no sé como arreglarlo. Aquí está el código:

#include 
#include 

void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}

int main ()
{
  int n;

initscr();

  for (n=3;n>0;n--)
  {
    printw ("%i\n",n);
    wait(1);
  }
  printw ("FIRE!!!\n");

refresh();
getch();
endwin();
}

Cuando no utilizo ncurses, la cuenta regresiva se ejecuta de manera normal (Primero imprime 3, luego 2, luego 1, y finaliza). Cuando utilizo ncurses la terminal se queda en blanco por los 3 segundos y luego aparece de una vez la salida

3
2
1
FIRE!

Agradecería mucho alguna ayuda :)

Imagen de _CharlyOrg
+1
0
-1

Hola :)

Resulta que cuando ejectuas sin ncurses, el printf imprime por pantalla, como era de esperar, pero si usas ncurses, le estas diciendo que imprima por pantalla, pero no que refresque lo que acabas de imprimir... Podriamos definir esto como si fuera un doble buffer, es decir:

Cuando imprimimos algo, lo escribimos en nuestra memoria, no en la pantalla, de manera que cuando queremos que lo escrito pase a la pantalla copiamos lo que tenemos guardado en la pantalla.
El uso correcto de tu codigo implicaria escribir con el printf y refrescar la pantalla despues de cada escritura para ver la cuenta atras con el tiempo. Si no, lo que haces es escribir, escribir, escribir, y despues refrescar la pantalla, mostrando los mensajes escritos en el buffer nombrado antes. Sin probarlo, el main quedaria aproximadamente asi:

initscr();

for (n=3;n>0;n--)
{
printw ("%i\n",n);
refresh();
wait(1);
}
printw ("FIRE!!!\n");

refresh();
getch();
endwin();

Esto funcionaría de buenas a primeras, pero tienes que contar con un factor más:
Estas escribiendo en el buffer, cuando le dices refresh, copias el contenido del buffer a la pantalla. Si no borras el buffer e intentas escribir otra vez (si no tuvieras el \n) lo escribirias chafando lo que ya tenias, en lugar de sustituirlo. Por esto, justo despues de cada refresh() se suele limpiar el buffer y escribir de nuevo en el buffer todo lo que desees mostrar.

Espero haber sido de ayuda.
Un saludo.
CharlyOrg

+1
0
-1