Partage
  • Partager sur Facebook
  • Partager sur Twitter

Timers....

Sujet résolu
    7 octobre 2007 à 20:59:44

    Bonjour à tous,
    Voilà, j'ai un problème avec un timers. :D
    Voici une méthode d'une classe que j'ai créé, qui créer un timer:
    1. void SDL_Game::lancerG(int a)
    2. {
    3.     timer= SDL_AddTimer(a, lancerG_CallBack, &getPosition());
    4. }

    Ensuite voilà la fonction callback:
    1. Uint32 SDL_Game::lancerG_CallBack(Uint32 intervalle, void *parametre)
    2. {
    3.     SDL_Rect* position = (SDL_Rect*)parametre;
    4.     setPos(position->x-=2, position->y);
    5. }


    Voici getPosition()
    1. SDL_Rect SDL::getPosition() const
    2. {
    3.     return position;
    4. }


    Et enfin setPos:
    1. void SDL::setPos (long x=0,long y=0)//changer la position
    2. {
    3.     m_x=x;
    4.     m_y=y;
    5. }

    Et mon IDE me dit:
    Project   : SDL Application
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\Documents and Settings\LORMEAU.SN116721270315\Bureau\Projet prog\ProjSDL\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: SDLGame.cpp
    SDLGame.cpp: In member function `void SDL_Game::lancerG(int)':
    SDLGame.cpp:59: warning: taking address of temporary
    SDLGame.cpp:59: error: argument of type `Uint32 (SDL_Game::)(Uint32, void*)' does not match `Uint32 (*)(Uint32, void*)'
    Process terminated with status 1 (0 minutes, 0 seconds)

    Merci de votre aide. :)
    Ps: SDL_Game est une fonction hérité (publiquement) de SDL.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      8 octobre 2007 à 7:46:48

      Tu ne peux pas passer comme fonction de callback une fonction membre d'une classe. Il faut nécessairement que tu passes par une autre fonction, qui fera l'appel à la fonction membre.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        8 octobre 2007 à 10:23:39

        Citation : Cyprien_

        Tu ne peux pas passer comme fonction de callback une fonction membre d'une classe. Il faut nécessairement que tu passes par une autre fonction, qui fera l'appel à la fonction membre.


        Pas sûr.

        Essaye :
        1. void SDL_Game::lancerG(int a)
        2. {
        3.     timer= SDL_AddTimer(a, SDL_Game::lancerG_CallBack, &getPosition());
        4. }


        Problème similaire à mon avis : http://www.siteduzero.com/forum-83-199736-p1-un-pointeur-de-fonction-mais-pour-une-methode.html
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          8 octobre 2007 à 17:28:15

          Dans ce cas, il faut que la fonction callback soit static si j'ai bien lu le topic en question ;) .
          Mais ça ne l'arrange peut-être pas, vu que dans la fonction de callback est fait un appel à une fonction membre, qui nécessite un objet pour être appelée. Dans ce cas, il faudrait alors faire une structure qui contienne l'objet concerné ainsi que le paramètre, puis passer tout cette structure à la fonction de callback.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            8 octobre 2007 à 19:58:37

            Nouveauté dans le topic "frère" :

            Citation : shadosan

            hum, c'est pas vraiment bon de mettre static une méthode rien que pour ça...

            à partir de ce tuto : http://linuxquality.sunsite.dk/articles/memberpointers/ (en anglais) :

            1. int (Test::*f)(int,int) = &Test::additionner;



            ce qui donnerais pour toi, tout simplement :

            1. #include <iostream>
            2. class Test
            3. {
            4.         public:
            5.                 int additionner(int a, int b)
            6.                 {
            7.                         return a+b;
            8.                 }
            9. };
            10. int main()
            11. {
            12.         Test test;
            13.         int (Test::*f)(int, int) = &Test::additionner;
            14.         std::cout << (test.*f)(2, 4) << std::endl;
            15.         return 0;
            16. }



            je l'ai pas testé, mais je crois que je vais le faire.
            ...
            ouep, ça marche : compilation & exécution ^^

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              8 octobre 2007 à 20:14:25

              Non, je ne pense pas que ça marchera. Je l'avais lu, ça résout bien le cas du topic "frère", mais pas celui-ci.
              Je n'ai pas fait le test, mais logiquement, le type ne sera toujours pas le bon.

              A présent, ce qui vaut le coup d'être essayé, c'est de partir de ce qui est proposé et peut-être de faire un cast vers le type souhaité, à savoir Uint32 (*)(Uint32, void*).

              A essayer, là j'ai la flemme ^^ .
              • Partager sur Facebook
              • Partager sur Twitter
                8 octobre 2007 à 20:36:50

                Bonjour,
                je m'incruste dans la conversation pour vous poser une question.

                Pouvez vous m'expliquer ce que fait/veut dire cette ligne :
                1. int (Test::*f)(int, int) = &Test::additionner;


                du code :
                1. #include <iostream>
                2. class Test
                3. {
                4.         public:
                5.                 int additionner(int a, int b)
                6.                 {
                7.                         return a+b;
                8.                 }
                9. };
                10. int main()
                11. {
                12.         Test test;
                13.         int (Test::*f)(int, int) = &Test::additionner;
                14.         std::cout << (test.*f)(2, 4) << std::endl;
                15.         return 0;
                16. }


                merci !!
                • Partager sur Facebook
                • Partager sur Twitter
                :)
                Anonyme
                  8 octobre 2007 à 20:42:18

                  Cela signifie que l'on crée un pointeur de fonction du type int (Test::*f)(int, int), autrement dit une fonction membre de la classe Test qui prend pour paramètres 2 int et renvoie un int.
                  Le nom de la variable créée est f, et on lui affecte la valeur &Test::additionner qui est l'adresse de la fonction membre additionner.

                  Pour plus d'infos sur les pointeurs de fonction : voir là (attention, tuto de C, il faut rajouter le fait que la fonction est membre d'une classe).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 octobre 2007 à 19:05:23

                    Merci pour vos réponse.

                    Donc si je comprend bien: je dois remplacer getPosition() par une fonction exterieur à une classe qui appellerat getPosition()?

                    Mais dans ce cas là, c'est pas vraiment orienté objet les timers???? o_O
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      9 octobre 2007 à 19:52:54

                      Mais la SDL n'est pas du C++. Essaye de combiner la SDL avec Boost pour voir. (->boost.bind)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 octobre 2007 à 21:08:25

                        C'est vrai que la SDL n'est pas du C++ (je devrais peut être aprendre une autre librairie alors.....).

                        Boost, boost....hein??? o_O
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          9 octobre 2007 à 21:19:35

                          google : boost et tu trouve tout (notamment sur boost.org)
                          Un biblio C++ assez semblable à la SDL : SFML (http://sfml.sourceforge.net/index-fr.php) mais je sais pas si les timer sont déjà créés. P-ê devras-tu le faire si ce qui existe déjà (SFML + Boost) ne te conviens pas.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 octobre 2007 à 6:38:08

                            Merci, en effet la SFML a l'air très bien et le site que tu m'a passer est très bien fait. Je pense que je m'y mettre en attendant le tuto Qt de m@teo. :)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Timers....

                            × 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