功能输入前的分段错误?

时间:2017-09-18 16:25:10

标签: c++ segmentation-fault sdl-2 sdl-ttf

更新:检查我的答案是否有详细信息,指针错误。

我有一个功能,应该加载一些测试资产并使用SDL2将它们blit到屏幕上。此函数在执行任何命令之前立即抛出段错误,没有明确的原因。请记住,此函数中的一些变量是全局变量。

功能内容:

    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 个答案:

答案 0 :(得分:1)

  1. 仔细检查字体,图像等的路径。它们是否与项目的根目录相关?他们非常敏感。为了避免像这样的简单错误:转到第2点。
  2. 应用一些基本的异常处理。例如:

    SDL_Surface* bg = SDL_LoadBMP("menubg.bmp");
    
    if(bg == NULL)
    {
        // This code will be run when menubg.bmp cannot be loaded.
    }
    

    总是检查您的陈述结果以确保其按计划运作是一种很好的做法。

  3. 使用调试器。 GDB是最受欢迎的;但我个人使用DDD,一个在GDB上运行的可视调试器。它非常轻巧,具有图形和控制台输入功能。
  4. 记录您的代码。即使它是一个个人项目,你也不会向任何人展示它。解释每个陈述的作用以及为什么需要它;您将更清楚地了解代码,您可能会发现问题本身。
  5. 此外,它while(SDL_WaitEvent(&event))还没有while(SDL_WaitEvent(event))

答案 1 :(得分:0)

这实际上是一个愚蠢的错误,可能会发生在SDL的新手身上。 WaitEvent(SDL_Event *)应该是fed&amp; event,因为事件应该是事件,而不是指向事件的指针。通过将while(SDL_WaitEvent(event))更改为while(SDL_WaitEvent(&event))并将SDL_Event* event;更改为SDL_Event event;,此问题已得到解决。

对于任何遇到任何类型段错误的人来说,努力调试都可以胜任。在SO的那些人帮助我追踪和修复我的愚蠢错误,并教育我作为开发人员。