将指针传递给函数C ++ SDL2

时间:2016-08-23 18:42:38

标签: c++ pointers sdl

我最近将一个大型源文件分解为标题和较小的源文件。我之前从未这样做过,主要是因为范围,我不得不重写一些函数来接受指针然后从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函数时,它变成了本地的,当我返回时我留下了一个NULL指针。我试过“&amp;”运营商的地址,但不接受它!

init(gWindow, gRenderer);

我不确定为什么,但我猜这与该类型有关。

任何想法的人??

回应评论......在我的主要内容中,我开了一个

cout << gRenderer << endl;

并且在函数调用之前和之后返回NULL。

我在功能中突出显示了我发射另一个cout。

1 个答案:

答案 0 :(得分:1)

使函数签名成为对指针的引用,它将返回从SDL_CreateRenderer返回到调用函数的值(假设gRenderer在传入时是一个指针):

bool init(SDL_Window *gWindow, SDL_Renderer *&gRenderer)

看起来你也应该以同样的方式传递gWindow