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++,因此您还可以使用引用参数(它在幕后发挥了一些作用)。