Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL][C++]Erreur avec les timers

Sujet résolu
    28 juin 2006 à 20:21:20

    Bonjour !


    J'ai crée cette fonction de callback pour un timer SDL :


    Uint32 Grue::mettreAJour(Uint32 intervalle, void *Aclavier)
    {
        clavier* Clavier = (clavier*)Aclavier;

        if (Clavier->pageUp)
            longueur--;
        if (Clavier->pageDown)
            longueur++;
        if (Clavier->haut)
            angle1++;
        if (Clavier->bas)
            angle1--;
        if (Clavier->gauche)
            angle2--;
        if (Clavier->droite)
            angle2++;

        return intervalle;
    }


    Et je veux l'utiliser dans ma fonction main :

        Grue grue(70,70,30,50,30,2);
        SDL_TimerID timer1= SDL_AddTimer( 33, grue.mettreAJour, &clavier);


    Bon moi ça m'a l'air correct, mais c'est pas ce que me dis ce bon vieux compilateur :
    Je cite :
    main.cpp:21: error: argument of type `Uint32 (Grue::)(Uint32, void*)' does not match `Uint32 (*)(Uint32, void*)'


    Ben il est bien gentil mais moi je comprends pas son probleme... Quelqu'un seraitsaurait-il m'expliquer ??
    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2006 à 22:59:03

      çà ne peut pas marcher car
      .mettreAJour
      est membre d'une classe/structure qui recquiert l'instance de celle-ci pour fonctionner or la SDL appèle un callback et n'a aucun notione de POO ni membre de méthode membre, d'instance ni quoi que ce soit .

      Il faut donc crée une fonction intermédiaire qui n'est pas membre d'une classe/structure et qui appeler la méthode correspodnante:


      Uint32 Grue::mettreAJour(Uint32 intervalle, void *Aclavier)
      {
          clavier* Clavier = (clavier*)Aclavier;

          if (Clavier->pageUp)
              longueur--;
          if (Clavier->pageDown)
              longueur++;
          if (Clavier->haut)
              angle1++;
          if (Clavier->bas)
              angle1--;
          if (Clavier->gauche)
              angle2--;
          if (Clavier->droite)
              angle2++;

          return intervalle;
      }

      struct DeleagateCallParam
      {
         Grue *obj_instance;
         void *param;
      };

      Uint32 DeleagateCall(Uint32 intervalle,void *ptr)
      {
         DeleagateCallParam *param=(DeleagateCallParam *)ptr;
         return param->obj_instance->mettreAJour(intervalle,param->ptr);
      }

      void func()
      {
          Grue grue(70,70,30,50,30,2);
          DeleagateCallParam param;
          param.obj_instance=&grue;
          param.ptr=(void *)&clavier;

          SDL_TimerID timer1=SDL_AddTimer(33,DeleagateCall,&param);
      }
      • Partager sur Facebook
      • Partager sur Twitter
        29 juin 2006 à 0:09:05

        Ok merci beaucoup !! Sinon y aurait pas moyen avec un pointeur de fonction ?

        EDIT :Aparemment non mon debugger me dit que ISO C++ me l'interdit...



        C'est qui lui ? :D
        • Partager sur Facebook
        • Partager sur Twitter
          29 juin 2006 à 1:04:04

          Non, ou pas en C ni C++ tout du moins .
          Tu ne peut lui passer que un pointeur sur fonction mais pas une méthode d'une classe ou d'une structure, sauf si celle-ci est statique(çà existe en C++ mais pas sûr en C) . C'est pour çà qu'il faut utiliser une fonction intermédiaire qui fasse ensuite l'appel de la méthode .
          Ce n'est pas spécifique à la SDL, c'est spécifique au language .
          • Partager sur Facebook
          • Partager sur Twitter
            29 juin 2006 à 1:34:33

            Ok, merci beaucoup ! Mon prog tourne impec manan !
            • Partager sur Facebook
            • Partager sur Twitter

            [SDL][C++]Erreur avec les 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