Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Threads mit methoden - SDL

  1. #1
    Registrierter Benutzer
    Registriert seit
    07.09.2003
    Beiträge
    24

    Threads mit methoden - SDL

    Hoi,
    Also ich bin darbei ein kleines SDL spiel zu programmieren hab darbei allerdings das problem das ich mit SDL_CreateThread(rm.shoot, NULL); einen neuen thread erzeugen will. shoot ist allerdings die methode einer klasse und ich bekomm darbei folgenden fehler:

    Code:
          
    sdl-test.cpp:285: error: argument of type `int (spieler::)(void*)' does not 
       match `int (*)(void*)'
    Ich kann mit der fehlermeldung leider nicht viel anfangen. So sieht die funktion shoot aus:

    Code:
    int shoot(void *nichtVerwendet)     {
    
    
    
    if (figure == 0)
    {
      of.x = (quellcods.x + quellcods.w);
      of.y = (quellcods.y + (quellcods.h / 2)-10);
      of.w = kugel->w;
      of.h = kugel->h;
    }
    if (figure == 1)
    {
      of.x = quellcods.x;
      of.y = (quellcods.y + (quellcods.h / 2)-10);
      of.w = kugel->w;
      of.h = kugel->h;
    }
    
    fuck.x = of.x;
    fuck.y = of.y;
    fuck.w = kugel->w;
    fuck.h = kugel->h;
    
    
    
    
    int running = 1;
    while (running)
    {
    fprintf(stderr, "colli %i", colli);
    colli = FireCollision();
    if (colli == 0)
    {
    
    if (figure == 0)
    {
    of.x = of.x + 2;
    }
    if (figure == 1)
    {
    of.x = of.x - 2;
    }
    
    SDL_FillRect(screen, &fuck, SDL_MapRGB(screen->format, 0, 0, 0));
      SDL_BlitSurface(kugel, 0, screen, &of);
      SDL_UpdateRects(screen,1,&of);
      SDL_UpdateRects(screen,1,&fuck);
       
      if (of.x > 800 ||of.x < 1)
      {running = 0;}
     fuck.x = of.x;
     SDL_Delay(2);
     }
     if (colli == 1)
     {running = 0;}
    }
     return(0);
    }
    Wer nett wenn ihr mir nen tip geben könntet.

    Mit freundlichen Grüßen

    locai
    .....Gummierbärn hüpfen hier und da und überall das sind die gummiebärn.....

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von locai
    Hoi,
    Also ich bin darbei ein kleines SDL spiel zu programmieren hab darbei allerdings das problem das ich mit SDL_CreateThread(rm.shoot, NULL); einen neuen thread erzeugen will. shoot ist allerdings die methode einer klasse und ich bekomm darbei folgenden fehler:

    Code:
          
    sdl-test.cpp:285: error: argument of type `int (spieler::)(void*)' does not 
       match `int (*)(void*)'
    Ich kann mit der fehlermeldung leider nicht viel anfangen. So sieht die funktion shoot aus:
    Du musst als Funktionspointer eine static Methode der Klasse übergeben.
    Als Argument benutzt du dann die Instanz der Klassem .d.h in der Thread Methode castest du das void* Argument auf deine Klasse Spieler und rufts dann die eigentliche Methode auf

    Also
    Code:
    Spieler* spieler = new Spieler();
    SDL_CreateThread(Spieler::threadFunction, spieler);
    Code:
    class Spieler
    {
    public:
        static int threadFuntion(void* arg)
        {
            Spieler* spieler = (Spieler*) arg;
            spieler->shoot();
        }
    };
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.09.2003
    Beiträge
    24
    ich hab zwar nicht allzu viel von dem verstanden was du erklärt hast soweit bin ich noch net aber ich habs einfach mal gemacht und bekomme nun die folgenden fehler:
    Code:
    sdl-test.cpp: In static member function `static int 
       Spieler::threadFuntion(void*)':
    sdl-test.cpp:599: error: `shoot' undeclared (first use this function)
    sdl-test.cpp:599: error: (Each undeclared identifier is reported only once for 
       each function it appears in.)
    sdl-test.cpp: In function `int hack(void*)':
    sdl-test.cpp:677: error: `threadFunction' is not a member of type `Spieler'
    .....Gummierbärn hüpfen hier und da und überall das sind die gummiebärn.....

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    SDL_CreateThread erwartet eine Funktion mit einem untypisierten Pointer als argument. Du hast stattdessen eine Klassen-Methode übergeben, welche implizit den this-Pointer als erstes Argument erhält. Damit passen die beiden Funktions-Signaturen nicht überein und es kommt zu der Fehlermeldung beim Übersetzten.
    SDL_CreateThread erwartet als zweites Argument einen untypisierten Pointer. Dieser wird der übergebenen Funktion beim Aufruf übergeben und bietet sich an um irgendwelche Datenstrukturen zu übergeben. In diesem Fall brauchst du dieses Argument um die Instanz deiner Klasse zu übergeben.
    Und hier brauchst du die Lösung von anda_skoa: Es wird eine statische Methode mit der benötigten Signatur int shoot(*)(void* arg) definiert, welche als erstes ihr untypisiertes Argument in die eigene Klasse casted und dann damit arbeiten kann. Zuvor muss SDL_CreateThread natürlich als zweites Argument die Instanz der Klasse bekommen. Siehe dazu die Lösung von anda_skoa

    Gruss, Andy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •