gpt4 book ai didi

c++ - SDL 无法使用文件和 header 加载媒体

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:45 24 4
gpt4 key购买 nike

我刚开始关注 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 是一个指针,我相信这应该可以正常工作。

这是怎么回事?

非常感谢您的帮助!

巴勃罗

最佳答案

您需要另一个指针级别来实际修改调用函数中的变量:

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

关于c++ - SDL 无法使用文件和 header 加载媒体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32628950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com