Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec les réfèrences

pour le passage à une fonction

    11 mars 2008 à 18:38:27

    Bonjour tout le monde ! :)

    Je commence le C++ depuis peu et j'ai un petit problème avec les réfèrences :
    Dans ma fonction main (), j'ai un pointeur de type SDL_Surface et je voudrais passer ce pointeur en paramètre à une fonction qui va lui allouer de la mémoire afin que je puisse l'utiliser dans le reste de mon main (). o_O

    En gros j'ai fait ceci :
    1. #include <iostream>
    2. #include <SDL/SDL.h>
    3. #define COULEUR SDL_MapRGB (ecran->format, 220, 220, 220)
    4. using namespace std;
    5. void InitialiserEcran (SDL_Surface *&ecran, char *titre, int w, int h, Uint32 couleur);
    6. int main (int argc, char* argv [])
    7. {
    8.     SDL_Init (SDL_INIT_VIDEO);
    9.     SDL_Surface *ecran = NULL;
    10.     InitialiserEcran (ecran, "MonTitre", 450, 275, COULEUR);
    11.     SDL_Flip (ecran);
    12.     SDL_Quit ();
    13.     return EXIT_SUCCESS;
    14. }
    15. void InitialiserEcran (SDL_Surface *&ecran, char *titre, int w, int h, Uint32 couleur)
    16. {
    17.     ecran = SDL_SetVideoMode (w, h, 32, SDL_HWSURFACE);
    18.     SDL_WM_SetCaption (titre, NULL);
    19.     SDL_FillRect (ecran, NULL, couleur);
    20. }

    Mais cela ne marche pas et je ne voit pas la solution ! :(

    Donc si vous pouviez m'aider, ce serait super sympa ! :D

    Merci d'avance ! ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      12 mars 2008 à 15:03:34

      void InitialiserEcran (SDL_Surface *&ecran, char *titre, int w, int h, Uint32 couleur)

      je croix que sa serai plutot &ecran et pas *&ecran enfin tu peut esseyer.

      Ensuite ton #define COULEUR SDL_MapRGB (ecran->format, 220, 220, 220)
      sa fait pas trop c++ mais plutot c en c++ on utilise plutot inline
      voila un exemple avec inline a toi de l'adapté sa fait plus propre que avec ton define
      http://www.ann.jussieu.fr/courscpp/Sections/Sect05-D0.html
      • Partager sur Facebook
      • Partager sur Twitter
        12 mars 2008 à 15:17:19

        Est-ce qu'il y a une erreur?


        Parce que je crois que ton #define COULEUR va te poser problème...


        @prsieux -> sont passage de pointeur par référence est bon puisqu'il cherche à modifier la valeur d'une adresse pointée et qu'elle soit conservée au retour de la fonction.

        Pour ce qui est de la corrélation des #define et des fonction inline cela ne s'applique pas ici. Parce qu'il veut pourvoir remplacer "COULEUR" par le texte qui suis... Il n'a pas défini une fonction.

        Reste qu'un #define ça ne fait pas très C++ et que je crois que tu as une mauvaise définition de ce qu'il va arriver avec ton code.

        Essai de faire :

        1. Uint32 couleur = SDL_MapRGB( /*...*/ );
        2. void InitialiserEcran ( /*...*/, couleur );


        Voir si tu as le même problème.
        • Partager sur Facebook
        • Partager sur Twitter
          12 mars 2008 à 19:32:52

          Je ne suis pas sur que les références sur pointeurs soient d'un très bon goût...
          Essaye avec un bon vieux
          1. Init_Ecran(SDL_Surface ** ecr, /*... */);
          2. /* MAIN */
          3. SDL_Surface * ecran = NULL;
          4. Init_Ecran(&ecran, /* ... */);


          Prend bien garde à déréférencer ecran dans la fonction par contre.
          • Partager sur Facebook
          • Partager sur Twitter
            12 mars 2008 à 20:09:19

            pourquoi ne pas faire tout simplement 'Init_Ecran(SDL_Surface*, /* ... */);'
            • Partager sur Facebook
            • Partager sur Twitter
              12 mars 2008 à 21:14:00

              A tout hasard parce que SDL_SetVideoMode() va modifier la valeur du pointeur ?
              • Partager sur Facebook
              • Partager sur Twitter
                13 mars 2008 à 14:18:48

                Chlab_lak, si tu fais ça, au retour de ta fonction, l'ecran va encore valloir 0 et l'adresse retournée par SDL_SetVideoMode() sera perdue!

                groscask : Que ce soit un pointeur de pointeur (**) ou une référence sur pointeur (*&) c'est du pareille au même au final. Sauf que (*&) permet dévité les opérations supplémentaires de déréférencement et de référencement à l'appel et à l'intérieur de la fonction.
                • Partager sur Facebook
                • Partager sur Twitter
                  13 mars 2008 à 22:44:52

                  Tout à fait d'accord MatteX...

                  Considère ça comme les vieilles habitudes d'un programmeur C =)

                  (même si je me sers massivement des références... hein ! Faut vivre avec son temps vindju)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 mars 2008 à 9:13:54

                    Et pourquoi ne pas tout simplement renvoyer le pointeur ?

                    1. SDL_Surface * InitialiserEcran (const std::string & titre, int w, int h, Uint32 couleur);


                    Personnellement je trouve cela beaucoup plus élégant, et plus pratique.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                    Problème avec les réfèrences

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown