2016-08-23 153 views
0

我最近将大型源文件分解为头文件和较小的源文件。我从来没有这样做过,主要是因为范围,我不得不重写一些函数来接受指针,然后从main()中调用它们。将指针传递给函数C++ SDL2

这仍然是一个工作正在进行中,但是,我遇到了一个问题,我一直在尝试几个小时来解决。该代码是从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指针。我已经尝试过运营商的“&”地址,但它不会接受它!

init(gWindow, gRenderer); 

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

任何想法的家伙?

在回应评论...在我主我把火关

cout << gRenderer << endl; 

而且之前和函数调用后回来NULL。

我已经在功能上突出显示了我发射另一个cout的功能。

回答

1

让函数签名的指针引用,它将返回从SDL_CreateRenderer返回给调用函数的值(假设gRenderer是通过在当指针):

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

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

+1

非常感谢。我会在早些时候验证您的回复,但我忘记更新该函数的前向声明,但我仍然遇到问题。现在完美运作。非常感谢。 –