2016-01-28 2 views
1

J'apprends à créer des applications C++ en utilisant la bibliothèque SDL2 et j'ai rencontré un problème en essayant d'organiser mon code.Comment passer correctement un pointeur vers une fonction en C++ pour une autre fonction opérant directement sur ce pointeur?

Voici un exemple simple ilustrating la situation:

void createWindow (SDL_Window *gameWindow) 
{ 
    gameWindow = SDL_CreateWindow(/* arguments here */); 
} 

int main (int argc, char* argv[]) 
{ 
    SDL_Window* gameWindow = NULL; 
    createWindow(gameWindow); 
    // some code here... 
} 

Pourquoi ça ne marche pas? Lorsque j'essaie de compiler le code, SDL_GetError() crie: "Renderer Invalid".

Quand je fais cette façon

SDL_Window* createWindow (SDL_Window* gameWindow) 
{ 
    gameWindow = SDL_CreateWindow (/* arguments here*/); 
    return gameWindow; 
} 

cela fonctionne. Mais je ne l'aime pas comme ça. Je ne comprends peut-être pas quelque chose au sujet des pointeurs ou de la façon dont fonctionne SDL2, mais je pensais que passer à la fonction me permettait de travailler directement sur les variables, donc je n'ai rien à retourner. Pour moi, il semble que je travaillais sur la copie de l'adresse de la variable, mais pas la variable elle-même.

+3

Qu'en est-: 'SDL_Window * createWindow() {return SDL_CreateWindow (/ * arguments ici * /); } ' –

+0

Vous modifiez la copie du pointeur' createWindow'. – Michael

+0

Même si vous ne l'aimez pas, la plupart des gens préféreraient simplement renvoyer le pointeur ici. Notez que la fonction SDL le fait aussi. – emlai

Répondre

4

Les arguments en C sont passés par valeur, qui est, les arguments sont copiés et toutes les modifications appliquées aux arguments dans une fonction modifie la valeur de cette copie, pas l'argument réellement passé.

résoudre le problème en

  • passer une référence à un pointeur:

    void createWindow (SDL_Window*& gameWindow) 
    { 
        gameWindow = SDL_CreateWindow(/* arguments here */); 
    } 
    
  • faire passer un pointeur vers un pointeur. Attention: ceci est C-ish et mauvais code C++!

    void createWindow (SDL_Window** gameWindow) 
    { 
        *gameWindow = SDL_CreateWindow(/* arguments here */); 
    } 
    
  • retourner le pointeur:

    SDL_Window* createWindow() 
    { 
        return SDL_CreateWindow(/* arguments here */); 
    } 
    
+1

Je vais vous conseiller d'utiliser la "version du pointeur de retour" c'est plus clair. Les autres versions sont déroutantes. – Mickael

0

Vous passez un pointeur, mais vous essayez d'affecter le pointeur lui-même. Essayez de passer par référence, comme ceci:

void createWindow (SDL_Window *& gameWindow) 

Hope this helps. Le reste du code ne doit pas être modifié pour que cela fonctionne.

1

Lorsque vous passez votre pointeur, il est transmis par la valeur! Donc, vous êtes juste en train de changer l'adresse de la copie locale dans votre fonction

Solution:

void createWindow(SDL_Window **gameWindow) 
{ 
    *game_Window = SDL_CreateWindow(/*...*/); 
} 

int main() 
{ 
     SDL_Window* gameWindow = NULL; 
     createWindow(&gameWindow); 
} 

cette façon, vous donnez l'adresse de votre pointeur sur la fonction et l'activer pour modifier la valeur de celui-ci!

+2

N'utilisez pas de pointeurs vers des pointeurs en C++. Utilisez des références ou renvoyez la valeur. – Downvoter

-1

Il ne s'agit pas de savoir comment fonctionne SDL, mais comment C++ gère les paramètres.

Lorsque vous transmettez une variable en paramètre à une fonction, le comportement par défaut est de prendre la valeur de la variable et de la copier dans la variable à l'intérieur de la fonction. Alors ... dans votre cas quand vous faites.

createWindow (gameWindow); Ce qui se passe sous le capot ne fait que passer NULL comme paramètre. Si vous voulez modifier le pointeur de gameWindow, vous devez passer son adresse.

par exemple:

void createWindow(SDL_Window ** pointer) { 
    *pointer = SDL_CreateWindow(/** args **/); 
} 

et l'appeler: createWindow(&gameWindow);

Vous pouvez voir une explication profonde à ce sujet sur cette question: What's the difference between passing by reference vs. passing by value?

+1

N'utilisez pas de pointeurs sur des pointeurs en C++. Utilisez des références ou renvoyez la valeur. – Downvoter

+0

Pouvez-vous me montrer quelque chose expliquant pourquoi le pointeur vers le pointeur est une mauvaise chose? –

+0

[ici] (http://programmers.stackexchange.com/questions/56935/why-are-pointers-not-recommended-when-coding-with-c) et [ici] (http: //programmers.stackexchange. com/questions/163393/whats-so-bad-about-pointeurs-en-c). Les pointeurs vers des pointeurs en particulier parce qu'ils sont encore plus faciles à corriger et que les références et la bibliothèque standard C++ font un travail bien meilleur, plus sûr et plus beau. En outre, il ne s'agit pas seulement de transmettre des variables mais des expressions en général. – Downvoter