SDL 无法使用文件和 headers 加载媒体
SDL fail to load media using files and headers
我刚开始关注 Lazy Foo's SDL tutorial。我的问题与第 02 课中的代码有关,所以我认为这是非常基础的。不得不说我也没有太多的C++经验!
Lazy Foo 提供的代码在我的机器上运行良好 (Windows-Code::Blocks)。但是,作为练习,我尝试将示例的函数移动到一个单独的文件(具有相应的 header 文件)。我还将变量移动到 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 是一个指针,我相信这应该可以正常工作。
这是怎么回事?
非常感谢您的帮助!
巴勃罗
您需要另一个指针级别来实际修改调用函数中的变量:
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
和 returns 指向该表面的 指针 。您的函数仅将该指针(即地址)存储在局部变量中,但 not 未修改调用函数中的变量。为此,您需要使用 &
运算符在调用函数中传递变量的 地址 ,并使用 [=] 将值存储在该地址的指针中15=].
lazy foo 示例中的代码有效,因为 gHelloWorld
是那里的全局变量。
由于您使用的是 C++,因此您还可以使用引用参数(它在幕后发挥了一些作用)。
我刚开始关注 Lazy Foo's SDL tutorial。我的问题与第 02 课中的代码有关,所以我认为这是非常基础的。不得不说我也没有太多的C++经验!
Lazy Foo 提供的代码在我的机器上运行良好 (Windows-Code::Blocks)。但是,作为练习,我尝试将示例的函数移动到一个单独的文件(具有相应的 header 文件)。我还将变量移动到 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 是一个指针,我相信这应该可以正常工作。
这是怎么回事?
非常感谢您的帮助!
巴勃罗
您需要另一个指针级别来实际修改调用函数中的变量:
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
和 returns 指向该表面的 指针 。您的函数仅将该指针(即地址)存储在局部变量中,但 not 未修改调用函数中的变量。为此,您需要使用 &
运算符在调用函数中传递变量的 地址 ,并使用 [=] 将值存储在该地址的指针中15=].
lazy foo 示例中的代码有效,因为 gHelloWorld
是那里的全局变量。
由于您使用的是 C++,因此您还可以使用引用参数(它在幕后发挥了一些作用)。