2012-03-24 5 views
0

printw()이 세그멘테이션 오류를 일으키는 이유가 있습니까?리눅스, C, ncurses : printw로 인한 seg 오류

코드가 없어도 괜찮습니다. 그것으로 부서졌다. 난해한 일을하는 것처럼 보이지 않으므로, 여기서 잘못된 점을 이해하는 방법조차 모릅니다.

미리 조언 해 주셔서 감사합니다.

#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() 
+0

'TOP_ROW-1'은 올바른 계산인가, 아니면 'TOP_ROW + 1'이어야합니까? 나는 한계 밖의 오류를 생각하고있다. –

+0

'TOP_ROW'는 실제로 5로 정의됩니다 - 죄송합니다. 조금 혼란 스럽습니다. –

+2

나는 valgrind에서 메모리 오류를 검사하기 위해 프로그램을 실행하려고합니다. –

답변

3

당신이 initscr을 호출하셨습니까()?

+0

'initscr()'은 els라고 부릅니다. 어디서나. 'printw()'로 행을 주석 처리하면 코드가 실행됩니다. –

+0

이 메서드를 호출하기 전에 초기화 호출을 보여주기 위해 편집했습니다. –

+0

initscr() 전에 draw_court()를 호출했기 때문에이 문제가 해결되었다고 밝혀졌습니다. 이 코드는 한 줄의 코드 없이도 잘 작동하기 때문에 이것이 문제라고 생각하지 않았습니다. 이상하게 mvaddch는 initscr()보다 먼저 작동하지만 printw()는 작동하지 않습니다. –

2

가장 좋은 방법은 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); 
    } 
} 
+0

오, 나는 두 개의 루프가 마음에 든다. :) gdb에서 stacktrace를 사용하여 내 게시물을 편집 할 것입니다. –