Linux, C, ncurses: ошибка сегмента, вызванная printw - PullRequest
0 голосов
/ 24 марта 2012

Есть ли причина, по которой printw() может вызвать ошибку сегментации?

Код без него хорош;порвал с этим.Кажется, он не делает ничего эзотерического, поэтому я не уверен, как даже начать понимать, что здесь не так.

Заранее благодарен за любой совет!

#include <ncurses.h>
...
initscr();
noecho();
cbreak();
...
    void draw_court()
    {
        move(TOP_ROW-1, LEFT_COL+4);
        printw("LIVES REMAINING: 3");

        int i;
        for (i = 0; i < RIGHT_COL; i++)
            mvaddch(TOP_ROW, LEFT_COL+i, H_LINE);

        for (i = 1; i < BOT_ROW-TOP_ROW; i++)
            mvaddch(TOP_ROW+i, LEFT_COL, V_LINE);

        for (i = 0; i < RIGHT_COL; i++)
            mvaddch(BOT_ROW, LEFT_COL+i, H_LINE);
    }

ETA: трассировка стека из GDB:

#0 0xb778a139 in _nc_printf_string () from /lib/libncurses.so.5
#1 0xb7785e04 in vwprintw () from /lib/libncurses.so.5
#2 0xb7785f63 in printw () from /lib/libncruses.so.5
#3 0x08048f23 in draw_court ()
#4 0x080489f4 in set_up ()
#5 0x0804890a in main ()

Ответы [ 2 ]

4 голосов
/ 24 марта 2012

Вы забыли позвонить initscr ()?

2 голосов
/ 24 марта 2012

Ваш лучший вариант - запускать код под gdb или другим отладчиком, чтобы вы могли точно видеть, что он делает.

Если это не вариант, проверьте свои индексы на наличие ошибок «один за другим», а затем попробуйте комментировать части (всей) программы, пока не получите самый маленький фрагмент, который все еще падает; затем опубликуйте это, если вам нужна помощь в отладке.

Кроме того, поскольку я не могу с собой поделать, вам нужно всего 2 петли, чтобы нарисовать коробку. : -)

void draw_box()
{
    move(TOP_ROW-1, LEFT_COL+4);
    printw("LIVES REMAINING: 3");

    int i;
    for (i = 0; i < RIGHT_COL; i++) {  // should the limit be RIGHT_COL - LEFT_COL ?
        mvaddch(TOP_ROW, LEFT_COL+i, H_LINE);
        mvaddch(BOT_ROW, LEFT_COL+i, H_LINE);
    }
    for (i = 1; i < BOT_ROW-TOP_ROW; i++) {
        mvaddch(TOP_ROW+i, LEFT_COL, V_LINE);
        mvaddch(TOP_ROW+i, RIGHT_COL, V_LINE);
    }
}
...