ncurses分段错误

时间:2017-02-05 22:47:08

标签: c++ segmentation-fault ncurses

我正在修改一个人用ASCII艺术圆环完成的项目中的代码,称为donut.c。我觉得有必要在面向对象的范例中使用该程序的代码绘制其他三维形状,但也想修改它以使其在多个平台上运行。我选择将C ++与ncurses一起使用,以便可以在Windows,Linux和Mac上使用该库。但是,我的代码遇到了错误:我的代码的一个非常特定的部分出现了分段错误,我不知道在哪里继续解决这个问题。

我使用代码(如下所示)并使用g++ -Wall -g test.cc -o test -lncurses进行编译,以便我们可以使用gdb找出问题所在。以下是该遭遇的结果:

(gdb) watch test == 3030
Hardware watchpoint 1: test == 3030
(gdb) r
Hardware watchpoint 1: test == 3030

Old value = 0
New value = 1
main (argc=1, argv=0xbffff1d4) at test.cc:38
38          Output(output, screen_height, screen_width);
(gdb) step
Output (
  output=0xbfffe958 ' ' <repeats 28 times>, "$$@@@@@@", '$' <repeats 15 times>, ' ' <repeats 54 times>, '$' <repeats 11 times>, '#' <repeats 13 times>, "$$$##", ' ' <repeats 48 times>, "##$$$$#$####******"..., screen_height=24, 
screen_width=80) at test.cc:91
91        printw(output)
(gdb) step
Program received signal SIGSEGV, Segmentation fault.
__wcslen_sse2 () at ../sysdeps/i386/i686/multiarch/wcslen-sse2.S:28
28      ../sysdeps/i386/i686/multiarch/wcslen-sse2.S: No such file or directory.

test变量设置为我所知道的第3030帧,它将出错。有趣的是,如果screen_widthscreen_height值发生变化,则发生分段错误的“帧”仍然相同。我相信我的ncurses库是最新的,因为我专门安装它来处理这个项目(2017年2月1日)。

这是我的C ++代码,从原始donut.c修改并编辑以仅适合被认为是相关的代码。

static volatile int test = 0; //used for checking what frame it happened at

void Output(char* output, int screen_height, int screen_width); //where segfault happens
void RenderFrame(float x_rotation, float z_rotation, char* output, float* zbuffer, int screen_height, int screen_width);

int main(int argc, const char **argv)
{ 
  //Initialization completed. Note that I call initscr() and necessary methods before
  while(getch() == ERR)
  {
    RenderFrame(x_rotation, z_rotation, output, zbuffer, screen_height, screen_width);
    test++;
    Output(output, screen_height, screen_width);
    x_rotation += x_rotation_delta;
    z_rotation += z_rotation_delta;
  }
  endwin();

  return 0;
}

void Output(char* output, int screen_height, int screen_width)
{
  printw(output);
  refresh();
  move(0, 0);
}

TL; DR

ncursesprintw存在导致Segmentation fault的问题。如何解决此问题或移动它,以便我可以正常工作。更重要的是,这是ncurses或我的代码的问题吗?

1 个答案:

答案 0 :(得分:0)

问题与Thomas Dickey在对该问题的评论中有所描述:我需要在代码中将printw更改为addstr。谢谢大家的建议,我仍然很好奇为什么printw会发生这种情况。