我正在修改一个人用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_width
和screen_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);
}
ncurses
与printw
存在导致Segmentation fault
的问题。如何解决此问题或移动它,以便我可以正常工作。更重要的是,这是ncurses
或我的代码的问题吗?
答案 0 :(得分:0)
问题与Thomas Dickey在对该问题的评论中有所描述:我需要在代码中将printw
更改为addstr
。谢谢大家的建议,我仍然很好奇为什么printw
会发生这种情况。