我刚开始关注Lazy Foo's SDL tutorial。我的问题是关于第02课的代码,所以我认为这是非常基本的。我不得不说我也没有太多的C ++经验!
Lazy Foo提供的代码在我的机器上运行正常(Windows-Code :: Blocks)。但是,作为练习,我试图将示例函数移动到一个单独的文件(带有相应的头文件)。我还将变量移到main中,以避免全局变量。我需要实现的唯一真正的改变是为我的函数包含一些输入变量,因为我不会依赖于全局变量。
我的代码已编译,但无法根据需要上传图片。这里有简单函数的代码:
bool loadMedia(SDL_Surface* gHelloWorld) {
//Loading success flag
bool success = true;
//Load splash image
gHelloWorld = SDL_LoadBMP("hello_world.bmp");
if(gHelloWorld == NULL) {
printf("Unable to load image %s! SDL Error: %s\n", "hello_world.bmp",
SDL_GetError());
success = false;
}
return success;
这就是我称之为该功能的地方:
if(!loadMedia(gHelloWorld)) {
printf( "Failed to load media!\n" );
} else {
//Apply the image
SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
//Wait two seconds
SDL_Delay( 2000 );
}
使用调试器我注意到gHelloWorld永远不会更新它的值,这与Lazy Foo给出的原始示例不同。由于gHelloWorld是一个指针,我相信这应该可以正常工作。
这里发生了什么?
非常感谢你的帮助!
巴勃罗
答案 0 :(得分:1)
您需要另一个指针级别来实际修改调用函数中的变量:
bool loadMedia(SDL_Surface** gHelloWorld) {
...
*gHelloWorld = SDL_LoadBMP("hello_world.bmp");
if(*gHelloWorld == NULL) {
...
并将其称为:
SDL_Surface *gHelloWorld;
if(!loadMedia(&gHelloWorld)) {
说明:在C中,使用指针时几乎没有幕后魔术。 SDL_LoadBMP
创建一个新的SDL_Surface
并将指针返回到该表面。您的函数仅将该指针(即地址)存储在局部变量中,但不不会修改调用函数中的变量。为此,您需要使用&
运算符在调用函数中传递变量的地址,并使用*
将值存储在该地址的指针中。
lazy foo示例中的代码有效,因为gHelloWorld
是一个全局变量。
由于你使用的是C ++,你也可以使用参考参数(这会做一些幕后魔术)。