传递指针到函数c++ SDL2

Passing Pointer To Function C++ SDL2

本文关键字:c++ SDL2 函数 指针      更新时间:2023-10-16

我最近一直在把一个大的源文件分成头文件和小的源文件。我以前从来没有这样做过,很大程度上是因为作用域,我不得不重写一些函数来接受指针,然后从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: %sn", 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: %sn", 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: %sn", 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: %sn", 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指针,当我返回。我试过了接线员的地址,但是不接受!

init(gWindow, gRenderer);

我不知道为什么,但我猜这与类型有关。

有什么想法吗??

回应评论…在我的主菜单中,我发射了一个

cout << gRenderer << endl;

,在函数调用前后都返回NULL。

我在触发另一个计数的函数中突出显示了

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

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

看起来你也应该以同样的方式通过gWindow