【问题标题】:Strange unhandled exception; Access violation reading location奇怪的未处理异常;访问冲突读取位置
【发布时间】:2013-05-08 12:46:39
【问题描述】:

当我尝试调用 SDL_DisplayFormatAlpha 时,我得到了这个未处理的异常:“herorpg.exe 中 0x68125981 (SDL.dll) 的未处理异常:0xC0000005:访问冲突读取位置 0x0000013C。”

代码:

SDL_Surface* load_image ( char* filename ) {
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;
    loadedImage = IMG_Load ( filename );

    if ( loadedImage != NULL ) {
        optimizedImage = SDL_DisplayFormatAlpha ( loadedImage );
        SDL_FreeSurface ( loadedImage );
    }

    return optimizedImage;
}

bool init ( SDL_Surface*& screen ) {

    //Initialize SDL
    if ( SDL_Init ( SDL_INIT_EVERYTHING ) == -1 ) return false;
    screen = SDL_SetVideoMode ( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_FULLSCREEN );
    if ( screen == NULL ) return false;

    //Set the caption
    SDL_WM_SetCaption ( "Hero RPG", NULL );

    return true;
}

主要:

int main ( int argc, char** argv ) {
init ( screen );

load_image ( "graphics\\background\\overworld" );

return 0;
}

其他:

如果我注释掉

    //if ( loadedImage != NULL ) {
    //  optimizedImage = SDL_DisplayFormatAlpha ( loadedImage );
    //  SDL_FreeSurface ( loadedImage );
    //}

改变

    loadedImage = IMG_Load ( filename );

    optimizedImage = IMG_Load ( filename );

图像加载正常。所以我知道文件名没有问题。

问题:

这是我在我设计的最后一个程序中使用的确切功能,并且上次运行良好。我认为这个问题的答案将是开箱即用的。为什么我会收到这个未处理的异常?

【问题讨论】:

  • 在我看来,这段代码永远不会做任何事情,因为loadedImage 将在整个函数中保持 NULL。你的 if 测试应该总是失败。我想你想改用loadedImage = IMG_Load ( filename );
  • 是的,我在一秒钟前进行了一些错误测试并复制了错误的代码。现在已经修好了。
  • 如果你只注释掉带有SDL_DisplayFormatAlpha的行会发生什么?
  • 黑屏。 optimizedImage 由于某种原因无法访问。
  • 您提供的代码在我的 Linux 机器上编译并运行良好,并添加了一些小功能。我让它在SDL_DisplayFormatAlpha 上崩溃的唯一方法是事先不调用SDL_SetVideoMode。或者在加载图像之前调用SDL_Quit。你确定SDL_SetVideoMode 成功了吗?

标签: c++ sdl


【解决方案1】:

documentation 中有这一行:

当然,视频表面必须在调用此函数之前使用 SDL_SetVideoMode 进行初始化,否则会出现段错误。

看到我在您发布的代码中没有看到对 SDL_SetVideoMode 的调用,我可以假设这可能是原因。

【讨论】:

  • 喜欢吗?如果您需要更多信息,请告诉我
  • 可能是关于颜色质量设置(32位,16位?)
  • 我正在调用的函数SDL_DisplayFormatAlpha 更改颜色质量设置。
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 2013-11-22
  • 1970-01-01
  • 2011-09-28
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
相关资源
最近更新 更多