2014-11-27 1 views
2

Я пытаюсь написать программу, которая действует как шатер, который использует curses.h library для создания экрана с прокруткой.Как прокручивать сообщение по терминалу?

Должно произойти, что мое сообщение «Hello» должно появиться для прокрутки с правой стороны терминала влево, символа по символу.

«привет» должен появиться прокручивать через терминал, как так:

|            H| // fist frame of animation 

|            He| //2nd 

|           Hel| //3rd 
                ... 
|    Hello        | // some time in the middle of animation 

|Hello           | // finished. 

Вместо того, чтобы появляться прокручивать через терминал моя программа просто выводит сообщение «Hello» на левой стороне терминала, как если бы это закончено.

Я думал, что напечатать соответствующее количество пробелов, то соответствующее количество символов строки будет работать каждый кадр.

Что я делаю неправильно?

Ниже мой код до сих пор:

#include <curses.h> 
#include <string.h> 
main() 
{ 
    char message[] = "Hello"; 
    int  max_y, max_x; // max dimensions of terminal window 
    int  text_length; 
    int  i,row=0,col=0,spaces=0; 

    // Get text length 
    text_length = strlen(message); 

    // Get terminal dimensions 
    getmaxyx(stdscr, max_y, max_x); 

    // num of spaces needed to print 
    spaces = max_x -1; 

    initscr(); // initialize curses 
    clear(); // clear screen to begin 

    while(1) 
    { 
     clear(); // clear last drawn iteration 
     move(5,col); 
     // print spaces as necessary 
     for(i=0;i<spaces;i++) 
     { 
      addch(' '); 
     } 
     refresh(); 
     // print appropriate number of characters of the message    
     for(i=0;i<text_length || i<max_x; i++) 
     { 
      addch(message[i]); 
     } 
     refresh();   
     usleep(50000); // wait some time 
     spaces = spaces-1; //adjust spaces need for next iteration 
    } 
} 
+0

Каково значение 'max_x' в начале бесконечного цикла? –

ответ

4

Первая проблема заключается в том, что вы называете getmaxyx() перед тем initscr(). В этой ситуации stdscr не был инициализирован, поэтому значения, возвращаемые getmaxyx(), бессмысленны. (Я получаю -1 для каждого значения, aka ERR.)

Исправлено, программа в основном работает, но печатает мусор после строки «Hello». Вы можете решить это, изменив тест цикла for text_length || i<max_x, на text_length && i<max_x, хотя результат по-прежнему, вероятно, не совсем то, что вы хотите. Но я оставлю это вам, чтобы понять это.

Наконец, в качестве стилистического материи, я предложил бы использовать собственную функцию napms() проклятий вместо usleep() (т.е. napms(50) вместо usleep(50000)). Но если вы придерживаетесь usleep(), вы должны добавить #include <unistd.h> наверху.

Смежные вопросы