将指针传递给函数 C++ SDL2
Passing Pointer To Function C++ SDL2
我最近一直在将一个大的源文件分解成头文件和较小的源文件。我以前从未这样做过,主要是因为范围,我不得不重写一些函数来接受指针,然后从 main() 调用它们。
这项工作仍在进行中,但是,我 运行 遇到了一个我已经尝试了几个小时才能解决的问题。代码来源于Lazy Foos优秀的SDL系列教程
我已将此函数移至头文件中。巧妙地命名为 misc.cpp/misc.h.
bool init(SDL_Window *gWindow, SDL_Renderer *gRenderer)
{
//Initialization flag
bool success = true;
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Set texture filtering to linear
if( !SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" ) )
{
printf( "Warning: Linear texture filtering not enabled!" );
}
//Create window
gWindow = SDL_CreateWindow( "Roulette Testing", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( gWindow == NULL )
{
printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Create renderer for window
gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if( gRenderer == NULL )
{
printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Initialize renderer color
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if( !( IMG_Init( imgFlags ) & imgFlags ) )
{
printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
success = false;
}
std::cout << gRenderer << "renderer not NULL" << std::endl; //This is where I am checking the value of gRenderer within the function.
}
}
}
std::cout << "initialization success" << std::endl;
return success;
}
现在我试图在包含头文件并将 cpp 编译成目标代码后从我的 main() 调用此函数。这适用于纹理头文件。
不幸的是,现在当我将一个 SDL_Renderer 指针传递给这个 init 函数时,它变成了本地指针,当我 return 时我留下了一个 NULL 指针。我试过运营商的“&”地址,它不接受!
init(gWindow, gRenderer);
我不确定为什么,但我猜这与类型有关。
有什么想法吗??
回应评论......在我的主要我开火
cout << gRenderer << endl;
函数调用前后均返回 NULL。
我在函数中突出显示了我触发另一个 cout 的地方。
使函数签名成为对指针的引用,它将 return 值 return 从 SDL_CreateRenderer
编辑到调用函数(假设 gRenderer
是一个指针传入时):
bool init(SDL_Window *gWindow, SDL_Renderer *&gRenderer)
看来你也应该以同样的方式传递 gWindow
。
我最近一直在将一个大的源文件分解成头文件和较小的源文件。我以前从未这样做过,主要是因为范围,我不得不重写一些函数来接受指针,然后从 main() 调用它们。
这项工作仍在进行中,但是,我 运行 遇到了一个我已经尝试了几个小时才能解决的问题。代码来源于Lazy Foos优秀的SDL系列教程
我已将此函数移至头文件中。巧妙地命名为 misc.cpp/misc.h.
bool init(SDL_Window *gWindow, SDL_Renderer *gRenderer)
{
//Initialization flag
bool success = true;
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Set texture filtering to linear
if( !SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" ) )
{
printf( "Warning: Linear texture filtering not enabled!" );
}
//Create window
gWindow = SDL_CreateWindow( "Roulette Testing", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( gWindow == NULL )
{
printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Create renderer for window
gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if( gRenderer == NULL )
{
printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Initialize renderer color
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if( !( IMG_Init( imgFlags ) & imgFlags ) )
{
printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
success = false;
}
std::cout << gRenderer << "renderer not NULL" << std::endl; //This is where I am checking the value of gRenderer within the function.
}
}
}
std::cout << "initialization success" << std::endl;
return success;
}
现在我试图在包含头文件并将 cpp 编译成目标代码后从我的 main() 调用此函数。这适用于纹理头文件。
不幸的是,现在当我将一个 SDL_Renderer 指针传递给这个 init 函数时,它变成了本地指针,当我 return 时我留下了一个 NULL 指针。我试过运营商的“&”地址,它不接受!
init(gWindow, gRenderer);
我不确定为什么,但我猜这与类型有关。
有什么想法吗??
回应评论......在我的主要我开火
cout << gRenderer << endl;
函数调用前后均返回 NULL。
我在函数中突出显示了我触发另一个 cout 的地方。
使函数签名成为对指针的引用,它将 return 值 return 从 SDL_CreateRenderer
编辑到调用函数(假设 gRenderer
是一个指针传入时):
bool init(SDL_Window *gWindow, SDL_Renderer *&gRenderer)
看来你也应该以同样的方式传递 gWindow
。