Kleines Designproblemnchen...



  • Hallo,

    das ist eigentlich ein eher allgemein-programmieriges Thema, aber ich bin schon mitten mit C++ drin und habe eigentlioch glöeichzeitig die Probleme das da umzusetzen...

    Also es ist so:
    Ich habe eine STL-MAP, die als objekt eine Struktur und als Primärschlüssel einen char* hat.
    Die Struktur enthält eine Strukturinstanz.
    Ich muss einer Funktion ein Array dieser Struktur übergeben.
    Nun brauche ich also ein Array oder einen zeiger auf alle diese Objektinstanzen.
    Dabei sind die Instanzen aber in anderen Instanzen, das heißt ich muss es kopieren, aber wie mache ich das am Schnellsten?

    Hier noch einmal eine kleine Veranschaulichung:

    STL Map -> Objekt1 -> Objekt2
    
    Funktion(Objekt2*)
    

    Hat jemand eine Idee, oder muss ich es einzeln auslesen und dann einzeln für jedes Objekt in ein Array kopieren, was extrem langsam wäre? 😕

    MfG MAV



  • sehe ich richtig, dass du einfach der funktion ein array von objekten übergeben willst, aber nicht auf die sortierung der map verzichten willst?
    spontane idee: übergib den map.begin() und den map.end() (iteratoren) und terier dich durch. oder du musst überlegen, ob du nicht
    - die funktion so anpasst, dass sie maps nimmt
    - von der map auf ne eigene datenstruktur umsteigst



  • Hallo,

    ich könnte natürlich den Anfang und das Ende übergeben, aber das Dumme ist, dass das Objekt, dass die Map verwendet ja nicht das ich was ich suche, sondern das Unterobjekt!
    Dann müsste das Teil alles durchsuchen und nachher noch auf die Unterelemenete zugreifen.
    Ein weiteres Problem ist, dass ich die Engine ungern umbauen würde, da ich dieses innerhalb der Engine habe, die aber von dem Spiel getrennt sein soll.

    Was haltet ihr von folgendem Lösungvorschlag:
    In jeder Struktur1 habe ich einen Zeiger auf Struktur2.
    Dann habe ich 2 Maps, eine hat Struktur1en und die andere Struktur2en.
    Dann müsste ich aber irgendwie einen zeiger auf die erste Struktur2 in der 2. Map bekommen.
    Aber die Teile sind ja nicht linear gespeichert, oder? 😞

    MfG MAV



  • Ne, statt der zweiten Map muss ich was anderes nehmen, wo kein Primärschlüssel im Weg ist.
    Die Reihenfolge der Renderungen ist ja schließlich völlig egal, ich nutzte nämlich eh nur eine Textur. 😉
    Aber ich habe gehört eine Map sei schneller, ich brauche eigentlich keinen Primärschlüssel, da ich ganz einfach via ID, also auch via [] zugreifen könnte, was bietet sich da an, soll ich dennoch eine Map verwenden?
    Und was soll ich für das zweite Teil nehmen?

    PS: Also jetzt stellen sich nur noch die Fragen, welche beiden STL-Teile ich nehmen soll, es muss keine Reihenfolge haben, also brauche ich acuh keine Map, ich durchgehe ohnehin alles, und muss nix rauspicken, soll ich List oder Vector nehmen? Und was soll ich für die zweite Struktur nehmen, die ebenso nur eine einzige Struktur enthält!?

    MfG MAV



  • Ich will es nochmal genauer erklärern, obwohl ich es eigentlich nur pushen wollte. 😉

    Also ich habe jetzt folgende Idee:

    #define STL_X STL_VECTOR/STL_LIST/STL_WASAUCHIMMER
    

    Also STL_X 1 hat nun als Objekt einfach nur eine Klasse minerseits.
    Genauergesagt ein Basisklassenzeiger, aber das ist trivial. 😉
    Dann habe ich vor, dass diese Klasse einen Zeiger (als Zeiger genutzt) auf die Struktur MAVXSpriteInfoX beinhaltet.
    zweitens habe ich eine STL_X 2 die als Objekt MAVXSpriteInfoX beinhaltet.
    Beim Laden lasse ich genausoviele STL_X 1 wie STL_X 2 erstellen.
    Dann lasse ich die Zeiger auf MAVXSpriteInfoX jeweils auf das Element von STL_X 2 zeigen, sodass ich dann durch einfachen Zugriff auf das Element MAVXSpriteInfo* zeiger bei STL_X 1 auch die Element bei STL_X 2 veändere.
    Soweit klar?

    Jetzt stellt sich die Frage, warum...

    Nun, die zeichenfunktion braucht wie gesagt einen Zeiger (als Array genutzt).
    Wenn ich nun STL_X 2 als STL Vector habe, dann liegen die Teile linear im Speicher und ich müsste durch übergabe der Anfangsadresse einfach so übergeben können. 🙂
    Da ich nicht durch Primärschlüssel auf einzelne Elemente in STL_X 1 zugreife, reicht es einen Vector oder eine Liste zu verwenden, das spart Speicher und reicht so auch.
    Ich werde allerdings durch die IDs auf einzelne Elemente zugreifen müssen und auch die ganze Liste durchsuchen müssen (allerdings durch eigenen Algorithmus).
    Deswegen würde mir die STL Map in der Sache auch nicht beim Suchen helfen.

    Nun stellen sich mir die Fragen:

    1. Ist mein Konzept so in Ordnung? Wenn nicht, warum nicht?

    2. Was sollte ich nun genau für STL_X 1 und STL_X 2 verwenden? Am besten mit Erklärung.

    3. Liegen die Objekte im Speicher wirklich linear, wenn ich Vector oder List verwende, sodass ich die Anfangsadrsese übergeben kann und dann genauso verfahren kann, als wäre es ein Array (mit der Anfangsadresse?)

    Hier nochmal was STL_X 1 und 2 sind.

    STL_X 1 hat als Objekt eine Klasse, die >>>u.A.<<< einen Zeiger auf ein MAVXSpriteInfoX hat.

    STL_X 2 hat als Object MAVXSpriteInfoXs, auf die von STL_X 1 gezeigt wird.

    Der Zeiger in STL_X 1 ist dafür da, dass die Klasse die daten einfach verändern kann und sogleich die Daten in STL_X 1 linear bereitstehen sollten, um dann einfach die Startadresse zu übergeben.

    Danke im Voraus 🙂

    mfG MAV


Anmelden zum Antworten