【发布时间】: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成功了吗?