Map Nutzung nicht ganz O.K.?



  • Hallo Leute.

    Ich nutze eine Map, allerdings gibt es in bestimmetn Situationen einige Probleme, die ich im Anschluss noch etwas erläutern werde.
    Da es eigentlich nur um Grundfunktionen geht, wollte ich mal fragen, ob sich das jemand mal kurz anschauen kann, ob alles in Ordnung ist:

    #include "MAVXGraphics.h"
    
    MAVXG_API MAVXGraphics::MAVX2DDraw MAVXGraphics::MAVX2DDraw::instance;
    
    // ======================================================================================
    
    MAVXG_API void MAVXGraphics::MAVX2DDraw::DeleteAllPictures()
    {
      if(SMap.size() == 0)
          return;
      for (SpriteMapit SMapit = SMap.begin(); SMapit != SMap.end(); SMapit++)
      {
          delete SMapit->second;
      }
      SMap.clear();
    }
    
    // ======================================================================================
    
    MAVXG_API bool MAVXGraphics::MAVX2DDraw::LoadPicture(char* filename, char* name, MAVXSpriteInfo* SpriteInfo, D3DCOLOR ColorKey, bool crypt)
    {
       MAVXSprite* sprite = new MAVXSprite(filename, SpriteInfo, ColorKey, crypt);
    
       std::pair<char*, MAVXSprite*> member(name, sprite);
    
       SMap.insert(member);
    
       return true;
    }
    
    // ======================================================================================
    
    MAVXG_API void  MAVXGraphics::MAVX2DDraw::DeletePicture(char* name)
    {
       SpriteMapit ite = SMap.find(name);
       if (ite != SMap.end())
       {
          delete ite->second;
          SMap.erase(ite);
       }
    }
    
    // ======================================================================================
    
    MAVXG_API void  MAVXGraphics::MAVX2DDraw::SetStructure(char* name, MAVXSpriteInfo* SpriteInfo)
    {
       SpriteMapit ite = SMap.find(name);
       if (ite != SMap.end())
       {
          ite->second->SetStructure(SpriteInfo);
       }
    }
    
    // ======================================================================================
    
    MAVXG_API void  MAVXGraphics::MAVX2DDraw::DrawPicture(char* name, short x, short y, bool scale)
    {
       SpriteMapit ite = SMap.find(name);
       if (ite != SMap.end())
       {
          ite->second->DrawPicture(x, y, scale);
       }
    }
    
    // ======================================================================================
    
    MAVXG_API void  MAVXGraphics::MAVX2DDraw::DrawPicture(char* name, int nPicCount, Vector2D* vec, bool scale)
    {
       SpriteMapit ite = SMap.find(name);
       if (ite != SMap.end())
       {
          ite->second->DrawPicture(nPicCount, vec, scale);
       }
    }
    
    // ======================================================================================
    
    MAVXG_API void  MAVXGraphics::MAVX2DDraw::DrawPicture(char* name, int nPicCount, Vertex2D* vec, bool scale)
    {
       SpriteMapit ite = SMap.find(name);
       if (ite != SMap.end())
       {
          ite->second->DrawPicture(nPicCount, vec, scale);
       }
    }
    
    // ======================================================================================
    
    MAVXG_API void  MAVXGraphics::MAVX2DDraw::DrawPicture(char* name, int nPicCount, MAVXSpriteInfoX* vec, bool scale)
    {
       SpriteMapit ite = SMap.find(name);
       if (ite != SMap.end())
       {
          ite->second->DrawPicture(nPicCount, vec, scale);
       }
    }
    
    // ======================================================================================
    
    MAVXG_API bool MAVXGraphics::MAVX2DDraw::InitSpriteVnIB(int n, int n2)
    {
        if(!MAVXGraphics::MAVXSprite::InitVnIB(n, n2))
            return false;
        return true;
    }
    
    // ======================================================================================
    
    MAVXG_API void MAVXGraphics::MAVX2DDraw::ExitSpriteVnIB()
    {
        MAVXGraphics::MAVXSprite::DeleteVnIB();
    }
    
    // ======================================================================================
    

    MAVXGraphics ist ein NameSpace
    MAVX2DDraw ist eine Klasse in MAVXGraphics
    Die Map hat als zweites Element ebenfalls eine Klasse...
    SMap ist ein Element der Klasse, definiert als SpriteMap.
    Hier meine Definition der Map und dessen Iterators:

    typedef MAVXG_API std::map<char*, MAVXSprite*>           SpriteMap;
        typedef MAVXG_API std::map<char*, MAVXSprite*>::iterator SpriteMapit;
    

    MAVXG_API ist eine Definition für meine DLL.

    Probleme:
    size()==0 arbeitet nicht einwandfrei, sogar wenn nichts drin ist, funktioniert es nicht einwandfrei.
    Es gibt manchmal Probleme (= Zusammenbrechungen), wenn ich etwas in die Map einfüge, lösche und wiederum einfüge, ich glaube die Elemente werden nicht korrekt gelöscht, ich rufe oft die Funktion DeleteAllPictures auf, wie gesagt entweder läuft size()==0 nicht, oder das Löschen ist nichts Richtiges, ich schaue auch noch einmal drüber, bin aber eher noch STL Anfänger. 🙄

    Manchmal bricht es zusammen, wenn es ansonsten einfach im Debugger auf den Code hinweisen würde, ich nutze die Klasse durch eine DLL, deswegen ist dies so.

    Danke schon mal im Voraus, falls jemand Zeit und Lust hat, das mal kurz anzuschauen. 🙄

    MfG MAV



  • MAVXG_API MAVXGraphics::MAVX2DDraw MAVXGraphics::MAVX2DDraw::instance;

    die namensgebung ist ein Horror!
    wozu machst du nen namespace wenn du dann sowieso immer prefixe nimmst?
    ich glaube du hast entweder den sinn von prefixen oder den von namespaces nicht verstanden...

    oder
    for (SpriteMapit SMapit = SMap.begin(); SMapit != SMap.end(); SMapit++)

    findest du das gut lesbar?

    ++i statt i++

    naja, statt size()==0 verwendet man empty()
    aber das ist in DeleteAllPictures sowieso sinnlos, da begin()==end() ist wenn der container leer ist.

    aber so beim drüberfliegen habe ich keine fehler gesehen...

    btw:
    ganz sicher das du hier eine map brauchst?



  • Hi,

    OK, empty() oder size() lass ich da ganz weg, da wahr ein anderes Problem, dann sollte es jetzt funktionieren, das mit den Präfixen ist wirklich ein bißchen dämlich gedacht, ich werde es bei der nächsten Version korrigieren und nur noch in Namespaces verwenden, du hast ja recht. 🙄
    Aber ich kann das alles eigentlich recht gut lesen 😉

    Aber kannst du mir verraten, was an:

    for (SpriteMapit SMapit = SMap.begin(); SMapit != SMap.end(); SMapit++)
    

    so schlimm ist? 😕
    Da finde ich ja nun überhaupt nichts schlimm dran.

    Soll ich die SpriteMapit villeicht in der Klasse anlegen und dann nachher immer wieder verwenden?
    Geht natürlich auch.
    Aber du meinst was anderes, aber was?
    Ich finde es recht schön, dass ich das alles in einer Zeile habe, oder findest du hier wieder die Namen schlecht?
    Wenn es das ist, würde ich sagen, dass das ganz passend ist weil es ja wirklich eine SpriteMap ist, kannst du mir verraten, was dann daran wiederum so schlecht ist?

    Weißt du, egal was ich mache, ich bekomme immer gesagt, dass es falsch ist.
    Ich finde es SEHR GUT lesbar.

    Und ja, eine Map ist hier sehr nützlich, ich verwalte die einzelnen Sprites durch Namen, so muss ich in meiner SingleTon Klasse nur eine Funktion Draw mit den Paramtern Name, x, y aufrufen und schon ist das Bild gerendert, das ist unheimlich praktisch.

    PS: problem behoben, aber mich interessiert wirklich, was du da an den Stellen zu bemängeln hast.

    MfG MAV

    [ Dieser Beitrag wurde am 08.06.2003 um 11:06 Uhr von Mis2com editiert. ]

    [ Dieser Beitrag wurde am 08.06.2003 um 11:12 Uhr von Mis2com editiert. ]



  • Außerdem habe ich andere Probleme als, dass der Code anderen Leuten nicht passt.
    Die Map ist hier sehr nützlich und ich habe wirklich genug Probleme, hauptsache es funktioniert und Hauptsache ich kann es lesen, oder?
    Ich habe mir schon genug Mühe mit dem Design gegeben, ok?



  • nimm lieber einen Hash-Container



  • Nö.

    Ich habe 1. gar keine Ahnung, wie der funktioniert, da ich C++ sowieso noch nicht 100% kann und 2. keien Lust jetzt alles umzuschreiben.
    Das Teil läuft genauso wie ich will und damit habe ich auch keinerlei Performanceprobleme.
    Folglich ist alles in Ordnung.

    Außerdem sitze ich gerade an einem Riesenprojekt.

    Da will ich jetzt endlich mal weiterkommen und nicht wegen jeder kleinen Sache gleich alles umschreiben, wenn es im Endeffekt doch sowieso nichts bringt.

    Da ich aber schon extrem viel geschrieben und programmiert habe (für das projekt), werde ich jetzt auch nicht mehr alles neu umschreiben, denn am Ende kommt ein schnell laufendes Spiel heraus, dessen Code für mich gut lesbar ist, der Aufbau ist mit vielen Klassen (Singleton und auch vererbten) ausgerüstet und sogar das Erste, das ich so kompliziert aufgebaut habe.

    Wenn ich mich gleich an der Perfektion messe, dann werde ich damit doch niemals fertig.

    MfG MAV

    [ Dieser Beitrag wurde am 08.06.2003 um 11:54 Uhr von Mis2com editiert. ]



  • signifikant beim lesen sind immer die ersten paar zeichen.

    bei deiner for schelife als SMap - was danach kommt ueberfliegt man meistens.

    ein i statt SMapit waere besser... denn dann erkennt man auch beim ueberfliegen was das heisst.

    Das ist keine persoenliche Kritik, aber ich bin immer froh wenn mir jemand Tipps gibt wie ich meinen Code besser gestalten kann. Wenn du das nicht willst, musst du ja nicht hinhoeren...

    kann es sein, dass

    MAVXG_API void MAVXGraphics::MAVX2DDraw::DrawPicture(char* name, int nPicCount, Vertex2D* vec, bool scale)

    exakt 2mal existiert, oder ist das ein copy & paste fehler?

    ansich sehe ich immer noch keine probleme mit der map

    wenn es mit dem debugger und der DLL probleme gibt, dann kompliere doch erstmal als static library (oder besser als Konsolen anwendung)

    du kannst dann debug sachen ausgeben und/oder log-libraries verwenden.
    bzw. funktioniert der debugger dann auch ordentlich...



  • Hallo,

    es funktioniert ja jetzt, danke für die Tipps, ich werde das auch in der nächsten Version überarbeiten, du hast Recht.
    DrawPicture gibt es sogar 4 mal, allerdings überladen ;).
    Da lag das Problem nicht, das Problem lag da, dass ich ein paar nicht initialisierte Instanzen in der Map hatte, der Versuch diese zu löschen schlug fehl, tjaja und da war das Problem schon, ich werde bei gelegenheit diesen fehler korrigieren. 😉

    Danke jedenfalls für den Tipp, ich werde ihn bei der nächsten Vollüberarbeitung ins Auge fassen.

    MfG MAV


Anmelden zum Antworten