c - 执行我的 OpenGL C 程序以实现 Bresenham 的画线算法时出错。中止(核心转储)
问题描述
我尝试使用 C 和 OpenGL 实现 Bresenham 的画线算法,但我得到一个空窗口,它会自动关闭并Aborted (core dumped)
打印在我的 Cygwin 终端上。然后我注意到生成了一个a.exe.stackdump文件,然后我做了一个cat a.exe.stackdump
它显示一些十六进制值可能如下图所示。gcc 1lab.c -lglut -lglu -lgl
我使用and编译了程序./a.exe
。谁能解释我的代码有什么本质上的问题?输出和程序附在下面。
注意:请忽略任何注释,因为它们无关紧要,仅因为我通过注释我不需要的内容来修改现有代码而使用它们。
#include<GL/glut.h>
#include<stdio.h>
#include<string.h>
void init (void)
{
glClearColor(0.0, 1.0, 0.0, 0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
GLint **plotterresizer(GLint** plotter)
{
return realloc(plotter,2*sizeof(plotter));
}
int **logic (void)
{
GLint **plotter=(GLint**)malloc(2*sizeof(GLint*)) ;
GLint sp[]={9,18};
GLint ep[]={14,22};
GLint xy[]={0,0};
GLint dxdy[]={ep[0]-sp[0],ep[1]-sp[1]};
GLint pk = 2*dxdy[1]-dxdy[0];
GLint *xkyk = sp;
int i=1;
plotter[0]=sp;
while(memcmp(xkyk,ep,sizeof(ep))!=0){
if(pk>=0){
pk+=2*(dxdy[1]-dxdy[0]);
xkyk[0]++;
xkyk[1]++;
}
else{
pk+=2*dxdy[1];
xkyk[0]++;
}
if(i==sizeof(plotter))
plotter=plotterresizer(plotter);
plotter[i]=xkyk;
i++;
}
return plotter;
}
void lineSegment(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
GLint **plt = logic();
// logic();
glBegin(GL_LINE_STRIP);
for(i=0;i<sizeof(plt);i++){
glVertex2iv(plt[i]);
}
// glVertex2i (180,15);
// glVertex2i (10, 145);
// glVertex2i (21,34);
// glVertex2i (111,9);
glEnd();
glFlush ();
}
void main(int argc, char** argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition (25,50);
glutInitWindowSize (200,150);
glutCreateWindow ("Bresemham's Line Drawing Algorithm");
init();
glutDisplayFunc (lineSegment);
glutMainLoop();
}
解决方案
这不是答案,而是调试程序的指南,将有助于应用您刚刚收到的其他人的建议。
由于该程序是 X 图形程序,因此您需要运行 NOT 从Cygwin Terminal
但从XTerm
. 所以安装xinit
、运行startxwin
和启动Xterm
使用调试信息编译程序,不进行优化,然后使用它运行 GDB:
$ gcc -Wall -ggdb -O0 prova.c -o prova -lGL -lGLU -lglut
$ gdb ./prova.exe
在 GDB 中,您将拥有
....
Reading symbols from ./prova.exe...
运行程序
(gdb) run
Starting program: /tmp/GL/prova.exe
[New Thread 57376.0xef14]
....
Thread 1 "prova" received signal SIGSEGV, Segmentation fault.
0x00007ff97139bebc in ig9icd64!DrvSetLayerPaletteEntries ()
from /cygdrive/c/WINDOWS/System32/DriverStore/FileRepository/ki124757.inf_amd64_b607c305e0c4e0a1/ig9icd64.dll
显示堆栈中的各种帧
(gdb) bt
#0 0x00007ff97139bebc in ig9icd64!DrvSetLayerPaletteEntries ()
from /cygdrive/c/WINDOWS/System32/DriverStore/FileRepository/ki124757.inf_amd64_b607c305e0c4e0a1/ig9icd64.dll
#1 0x000000010040127b in lineSegment () at prova.c:55
#2 0x00000003d2ffb35b in fghRedrawWindow () from /usr/bin/cygglut-3.dll
#3 0x00000003d2ffb6dc in fgProcessWork () from /usr/bin/cygglut-3.dll
#4 0x00000003d2ffd075 in fgEnumWindows () from /usr/bin/cygglut-3.dll
#5 0x00000003d2ffb7dd in glutMainLoopEvent () from /usr/bin/cygglut-3.dll
#6 0x00000003d2ffb876 in glutMainLoop () from /usr/bin/cygglut-3.dll
#7 0x0000000100401306 in main (argc=1, argv=0xffffcc70) at prova.c:75
转到代码中的第一个
(gdb) frame 1
#1 0x000000010040127b in lineSegment () at prova.c:55
55 glVertex2iv(plt[i]);
我们检查你的变量
(gdb) p i
$1 = 6
(gdb) p plt[0]
$8 = (GLint *) 0xffffc9d0
(gdb) p plt[2]
$9 = (GLint *) 0xffffc9d0
(gdb) p plt[5]
$10 = (GLint *) 0xffffc9d0
(gdb) p plt[6]
$11 = (GLint *) 0x1000000010
所以现在你知道它在哪里了。似乎 plt[6] 指向完全错误的内存区域。检查对象的尺寸似乎不是 6。
推荐阅读
- android - 在 android studio 3.1.3 中成绩项目同步失败
- mysql - 我有一个如下表我希望显示最新条目
- angular - Angular 2+ 选择框值未更新问题
- python - 无法在 Python 3.6 + 中使用 imap 获取 gmail 正文内部文本
- json - Angular 6 - 如何使用来自 Web API 的 json 结果中的数组
- windows - Sideloaded app is not listed in Assigned Access
- php - foreach循环没有将值插入mysql
- php - 如何使用 Expression Web 4 从 asp 中的 DropDownList 中检索选定的值?
- c++ - CMake将依赖项复制到可执行输出路径
- netsuite - Netsuite - 安全信息