2016-08-23 276 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

非常感謝。我會在早些時候驗證您的回覆,但我忘記更新該函數的前向聲明,但我仍然遇到問題。現在完美運作。非常感謝。 –