SDL2 与指针 c 的混淆

SDL2 confusion with pointers c

我正在尝试使用 SDL2 库编写一个基本游戏,但我对基本概念有点困惑。

基本上我想做一个功能:

void quit_clean (SDL_Window *window, SDL_Renderer *renderer)
{
 if (renderer != NULL)
        SDL_DestroyRenderer(renderer);
 if (window != NULL)
        SDL_DestroyWindow(window);

 exit(EXIT_FAILURE);
}

每次出现错误时我都会调用此函数,这样我就可以在退出程序之前正确释放渲染器和 window 例如

texture = SDL_CreateTextureFromSurface(renderer, tmp);
if(texture==NULL){
      printf ("SDL_CreateTextureFromSurface Error: : %s\n", SDL_GetError());
      quit_clean (&window, &renderer);
}

我感到困惑的地方是,如果我需要从另一个函数调用这个函数,它是如何工作的?

准确地说,我会:

  1. 我的 main() 函数,我在其中创建我的 *window 和我的 *renderer
  2. 从 main() 调用的新 my_function(),我会在其中从表面创建纹理并测试错误
  3. 最后我的 quit_clean() 函数从 my_function() 调用以防出错。

我的看法是,为了使用 my_function() 将我的 window 和我的渲染器从 main() 传递到 quit_clean(),原型将是:

void my_function (SDL_Window **window, SDL_Renderer **renderer);
void quit_clean (SDL_Window ***window, SDL_Renderer ***renderer);

我说的对不对? 如果是,那么如果需要,我如何从 main() 调用此函数。

如果我调用“quit_clean (&window, &renderer);”从我的 main() 开始,类型不再正确了。

或者我可以从 window 和渲染器创建指针并将这些指针传递给 quit_clean()。不知道自己脑子糊涂了,不知道自己的思路对不对

遇到这种情况你有什么建议吗?

您不需要双指针作为函数的参数:

int my_function (SDL_Window *window, SDL_Renderer *renderer);
int quit_clean (SDL_Window *window, SDL_Renderer *renderer);

您可能已经注意到,我添加了一个 return 类型 (int),因为每个函数都应该 return 一个结果,表示成功或失败。

其次,最好不要从其他函数调用quit_clean函数,相反,如果遇到错误,例如my_function、return报错,在main函数中调用quit_clean函数。

像这样:

int main() 
{
    SDL_Window *window = NULL; 
    SDL_Renderer *renderer = NULL;

    window = SDL_CreateWindow(...); 

    if (window) {

        renderer = SDL_CreateRenderer(window, ...);

        if (renderer) {

            int err = my_function(window, renderer);

            if (!err) { //success: 0, error: -1
                //do what is needed to be done
            }

        }

    }

    //finally clean up, 
    //no matter the case (either due to error or program termination)
    quit_clean(window, renderer);

    return 0;
}

quit_clean 函数中,您必须检查传递的参数(虽然我认为 SDL 也会检查它们,但总比抱歉好):

int quit_clean (SDL_Window *window, SDL_Renderer *renderer)
{
    //other cleanup first

    //finally
    if (renderer != NULL)
        SDL_DestroyRenderer(renderer);
    if (window != NULL)
        SDL_DestroyWindow(window);
    SDL_Quit();
}

为了清楚起见,举一个 my_function 的例子:

int my_function (SDL_Window *window, SDL_Renderer *renderer)
{
    if (some_condition_does_not_hold)
        return -1;

    //do your stuff
    //never call quit_clean if something goes wrong, return either -1 or
    //some other (previously defined) negative error number

    //finally
    return 0; //success
}