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);
}
我感到困惑的地方是,如果我需要从另一个函数调用这个函数,它是如何工作的?
准确地说,我会:
- 我的 main() 函数,我在其中创建我的 *window 和我的 *renderer
- 从 main() 调用的新 my_function(),我会在其中从表面创建纹理并测试错误
- 最后我的 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
}
我正在尝试使用 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);
}
我感到困惑的地方是,如果我需要从另一个函数调用这个函数,它是如何工作的?
准确地说,我会:
- 我的 main() 函数,我在其中创建我的 *window 和我的 *renderer
- 从 main() 调用的新 my_function(),我会在其中从表面创建纹理并测试错误
- 最后我的 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
}