我正在学习使用SDL2库创建C ++应用程序,我在尝试组织代码时遇到了问题。
这是一个说明情况的简单例子:
void createWindow (SDL_Window *gameWindow)
{
gameWindow = SDL_CreateWindow(/* arguments here */);
}
int main (int argc, char* argv[])
{
SDL_Window* gameWindow = NULL;
createWindow(gameWindow);
// some code here...
}
为什么它不起作用?当我尝试编译代码时,SDL_GetError()会尖叫:"无效的渲染器"。
当我这样做时
SDL_Window* createWindow (SDL_Window* gameWindow)
{
gameWindow = SDL_CreateWindow (/* arguments here*/);
return gameWindow;
}
它有效。但我不喜欢这样。
我可能不了解指针或SDL2对它们起作用的方式,但我认为将一个传递给函数让我直接操作副本的变量,所以我不必返回任何东西。对我来说,看起来我正在操作变量地址的副本,而不是变量本身。
答案 0 :(得分:4)
C中的参数是传递的值,也就是说,复制了参数,并且对函数中的参数应用的每个修改都会改变该复制的值,而不是实际传递的参数强>
通过
解决问题将引用传递给指针:
void createWindow (SDL_Window*& gameWindow)
{
gameWindow = SDL_CreateWindow(/* arguments here */);
}
将指针传递给指针。注意:这是C-ish和糟糕的C ++代码!
void createWindow (SDL_Window** gameWindow)
{
*gameWindow = SDL_CreateWindow(/* arguments here */);
}
返回指针:
SDL_Window* createWindow()
{
return SDL_CreateWindow(/* arguments here */);
}
答案 1 :(得分:1)
当你传递指针时,它会被值传递! 因此,您只是在功能中更改本地副本的地址
解决方案:
void createWindow(SDL_Window **gameWindow)
{
*game_Window = SDL_CreateWindow(/*...*/);
}
int main()
{
SDL_Window* gameWindow = NULL;
createWindow(&gameWindow);
}
这样你就可以给你指向函数的地址,并让它改变它的值!
答案 2 :(得分:0)
您正在传递指针,但您正在尝试分配指针本身。 尝试通过引用传递,如下所示:
void createWindow (SDL_Window *& gameWindow)
希望这会有所帮助。其余的代码不应该被改变以使其起作用。
答案 3 :(得分:-1)
这不是关于SDL如何工作,而是关于c ++如何处理参数。
将任何变量作为参数传递给函数时,默认行为是获取变量的值并复制到函数内的变量。所以..在你的情况下,当你这样做。
createWindow(gameWindow);引擎盖下发生的事情就是将NULL作为参数传递。如果要修改gameWindow指针,则必须传递它的地址。
例如:
void createWindow( SDL_Window ** pointer ) {
*pointer = SDL_CreateWindow( /** args **/ );
}
并致电:createWindow( &gameWindow );
您可以在该问题上看到有关该问题的深层解释:What's the difference between passing by reference vs. passing by value?