Übergabe von handles



  • n’Abend
    in meinem Programm kommt die Klasse cCreature vor. In dieser ist folgende Funktion vorhanden:

    // bewegt eine Kreatur
    void cCreature::MoveCreature(HDC hworkDC, int deltaX, int deltaY)
    {
    
        // zuerst Kollision ueberpruefen
        BOOL test=FALSE;
    
        test=CollDetect(hworkDC, x+deltaX,y+deltaY);
    
        if( test==TRUE)  // falls keine Kollision
        {
          // alte Position bekommt momentane Position
          oldX=x;
          oldY=y;
    
          // momentane Position aktualisieren
          x+=deltaX;
          y+=deltaY;
        }
        // andernfalls wird die Kreatur nicht bewegt
    
    }
    
    wie man sieht wird in ihr die Funktion CollDetect aufgerufen
    // prueft, ob an gegebener Position ein Hindernis ist 
    // (momentan ist eine Farbe != schwarz ein Hindernis)
    BOOL cCreature::CollDetect(HDC hWorkDC, int testx, int testy)
    {
        COLORREF colour; 
    
        // Farbwert an Position x,y holen
        colour= GetPixel(hWorkDC, testx, testy);
    
        if (colour != RGB(0,0,0))
            return false;         // Kollision
        else 
            return true;          // Weg ist frei
    
        //
        return false;
     }
    

    als ich anfangs zu Testzwecken direkt ein Objekt von cCreature erzeugte (cCreature test) konnte ich jede Memberfunktion ohne Probleme aufrufen und ihnen den DC des Fensters übergeben.

    Doch nun habe ich mir mittels der STL eine Liste erzeugt, die Kreaturen fassen kann. Um mir die Arbeit zu erleichtern habe ich folgende typdefs:

    typedef cCreature *PCREATURE; // Pointer auf eine cCreature Klasse
    typedef std::list<PCREATURE> CREATURELIST; // typdef fuer Kreaturen Liste
    typedef std::list<PCREATURE>::iterator CREATURELISTITER; // typdef fuer Kreaturenliste Iterators
    

    und die Liste global angelegt:
    CREATURELIST MainCreatureList; // Hauptliste der Kreaturen

    Und nun kommt mein Problem beim durchlaufen der Liste:

    for (CREATURELISTITER iter=MainCreatureList.begin();iter!=MainCreatureList.end();iter++)
        {
                 // Kreatur in diese Richtung bewegen
          switch (direction) {
            case 0: {pCreature->MoveCreature(hdc,0,-1);break;}
            case 1: {pCreature->MoveCreature(hdc,1,0);break;}
                case 2: {pCreature->MoveCreature(hdc,0,1);break;}
                case 3: {pCreature->MoveCreature(hdc,-1,0);break;}
    
          }
    }
    

    beim Aufruf einer MoveCreature Funktion gibt es Probleme beim übergeben des handles hdc. Irgendwie habe ich da was verbotenes mit der Adressierung gemacht, aber ich habe im Moment ein Brett vorm Kopf. ????



  • Also ich nehm für sowas immer vector, hatte noch nie Probleme damit... was ist eigentlich genau der Unterschied zwischen std::list und std::vector???

    thx & cu



  • std::vector ist ein Vektor, std::list eine Liste 🙂



  • Die Implementierung unterscheidet sich grundlegend.

    Die zugriffszeiten sind auch ganz anders, ebenso die Sortierzeiten.



  • Aha.

    thx & cu



  • ähm, wäre natürlich schön, wenn ihr noch etwas zu meinem Problem wüßtet...



  • Läuft das ganze in einem Thread oder Multithtreaded? Der HDC und die HWNDs sind ja nur in dem Fenstern gültig in denen sie erstellt wurden. Ansonsten hatte ich damit noch nie Probleme, habe aber für sowas dann fast immer CList aus der MFC benutzt - kann also bei STL nicht richtig mitreden.
    Um den Fehler einzugrenzen kannst du ja mal die Liste durch ein entsprechend großes Array ersetzen oder?



  • nein, es läuft nicht in einem Thread.

    der Fehler ist schon eingegrenzt:
    ich glaube es liegt daran, wie ich den handle übergebe. Zuvor habe ich die Objekte direkt angesprochen und die handles normal übergeben können. Da die Objekte jetzt jedoch in der Liste liegen, werden sie über Zeiger angesprochen. Das scheinen die handles nicht zu vertragen.
    wenn ich die Liste in meiner Hauptroutine durchlaufe, gibt es einen schweren Ausnahmefehler in einem der case-Anweisungen. Der Debugger bleibt in der Funktion MoveCreature bei der Zeile
    test=CollDetect(hworkDC, x+deltaX,y+deltaY);
    hängen. Also muß ich doch die handles auf eine andere Art übergeben.. nur wie?



  • Das ist total egal wie du das Handle übergibst. Das stört die schon nicht. 😉



  • AAAAAHHHHHHHHH, sowas blödes aber auch. Ich habe endlich meinen Felher gefunden!
    Habe in der for-Schleife eine Zeile vergessen:
    pCreature= *iter;
    Ist natürlich toll, wenn man die Liste durchzählt, aber nicht auf das Objekt zugreift, sondern nur rumNULLT.
    Ihr seid mir ein paar Schlümpfe, warum habt ihr mir das nicht gesagt? Drei Tage den Kopf zerbrochen und verzeifelt. Ich Oberschlumpf!
    Mmh, gab es nicht mal einen Thread "eure dümmsten Fehler"?


Anmelden zum Antworten