更新:检查我的答案以获取详细信息,指针错误。
我有一个功能,该功能应该加载一些测试资产,并使用SDL2将其闪烁到屏幕上。此功能在执行任何命令之前立即抛出一个segfault,而没有明确的原因。请记住,此功能中的某些变量是Globals。
功能内容:
printf("DEBUG");
int menuSelect = 0;
printf("declare");
SDL_Surface* bg = SDL_LoadBMP("menubg.bmp");
printf("bg load");
SDL_Surface* menu1 = TTF_RenderText_Solid(font,"HACKING PROGRAM",whiteclr);
printf("title blip");
SDL_BlitSurface(bg,NULL,screen,NULL);
printf("event");
SDL_Event* event;
printf("menu2");
SDL_Surface* menu2 = TTF_RenderText_Solid(font,"Hack",whiteclr);
printf("rect");
SDL_Rect menu2r = CreateRect(5,30,menu2->w,menu2->h);
printf("free");
SDL_FreeSurface(menu2);
SDL_FreeSurface(menu1);
while(SDL_WaitEvent(event))
{
switch(event->type)
{
case SDL_MOUSEBUTTONDOWN:
if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h)
{
SDL_FreeSurface(bg);
return 0;
}
break;
case SDL_MOUSEMOTION:
if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h)
{
menuSelect=1;
}
else
{
menuSelect=0;
}
break;
}
if(menuSelect==1)
{
menu2 = TTF_RenderText_Solid(font,"Hack",selectclr);
}
else
{
menu2 = TTF_RenderText_Solid(font,"Hack",selectclr);
}
}
return 0;
- 仔细检查字体,图像等上的路径。它们与项目的根目录有关吗?他们很敏感。为了避免这样的简单错误:转到第2点。
-
应用一些基本异常处理。例如:
SDL_Surface* bg = SDL_LoadBMP("menubg.bmp"); if(bg == NULL) { // This code will be run when menubg.bmp cannot be loaded. }
最好始终检查您的陈述结果以确保按计划工作。
- 使用调试器。GDB是最受欢迎的。但是我个人使用了DDD,这是一个在GDB上运行的视觉调试器。它非常轻巧,具有图形和控制台输入。
- 记录您的代码。即使这是一个个人项目,您也不会向任何人展示。解释每个陈述的作用以及为什么需要;您将对代码有更清晰的了解,并且可能会发现问题本身。
另外,它是while(SDL_WaitEvent(&event))
不是while(SDL_WaitEvent(event))
。
这实际上是一个愚蠢的错误,对SDL的新手可能会发生这种情况。应该给waitevent(sdl_event*)喂食事件,因为事件应该是事件,而不是事件的指针。通过将while(SDL_WaitEvent(event))
更改为while(SDL_WaitEvent(&event))
并将SDL_Event* event;
更改为SDL_Event event;
,此问题已解决。
对于任何经历任何类型的人的人来说,努力调试都会完成这项工作。在这里,这些家伙非常帮助我追踪并解决了我的愚蠢错误,并以开发人员为教育。