Problem mit Maps und Iteratoren
lima-city → Forum → Programmiersprachen → C/C++ und D
code
datum
ding
element
ergebnis
fehler
first
folgen
frage
funktion
internet
laufen
methode
schleife
textur
url
verwenden
verwendete textur
vorliegenden quellcode
ziemlich seltsame ergebnisse
-
Also ich versuche meine Texturen zu löschen, deren ID's in einer std::Map gespeichert sind. Nun will ich die Map in einer Schleife durchgehen und jeweils einzeln löschen. Jedoch bekomme ich da irgendwie ziemlich seltsame Ergebnisse. Möglicherweise liegt es ja an meinem Code!?
Die Ausgabe variiert leicht. Obwohl sich eigentlich nur ein Element darin befindet, liefert er mir zwei oder mehr Ergebnisse. Das erste Element mit dem Schlüssel "0" wird richtig erkannt, danach folgen dann merkwürdige Dinger wie Schlüssel "65536" und so weiter.typedef std::map<unsigned int, GLuint>::iterator it_type; for(it_type iterator = mTexID.begin(); iterator != mTexID.end(); iterator++) { printf("Deleting Texture %i!\n", iterator->first); UnloadTexture(iterator->first); }
Ich habe mich im Internet umgesehen, aber im Grunde nur den vorliegenden Quellcode gefunden. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich weiß nicht obs hilft, aber solltest du nicht
verwenden?UnloadTexture(iterator->second);
-
philippkern schrieb:
Nein, weil an UnloadTexture die externe ID, also ein vom... "Benutzer" festgelegter Wert verwendet wird. Das ganze ist halt in einer Klasse. Da die interne, also von OpenGL verwendete Textur-ID von aussen nicht einsehbar ist und man einzelne Texturen auch von "außen" löschen können soll, ist es notwendig, die Methode/Funktion mit dem Schlüssel, also
Ich weiß nicht obs hilft, aber solltest du nicht
verwenden?UnloadTexture(iterator->second);
aufzurufen. Wirklich gelöscht wird sie dann innerhalb der Funktion. Zum verständnis nochmal die Funktion UnloadTextureiterator->first
Vielleicht liegt der Fehler ja darin, dass er in der Funktion das Element aus der Map entfernt. Dann wäre die Frage, wie ich das ganze möglichst effizient umsetze.bool graphics::UnloadTexture(unsigned int texID) { bool result(true); if(mTexID.find(texID) != mTexID.end()) { glDeleteTextures(1, &(mTexID[texID])); mTexID.erase(texID); } else { result = false; } return result; }
EDIT: Hat sich damit dann wohl erledigt. Hab das jetzt auf
geändert. Scheint bisher ganz gut zu laufen. Man sollte wohl nicht an Daten rumfummeln, welche gerade ausgelesen werden. Ich hoffe, clear wirkt genau so, wie das einzelne löschen.void graphics::UnloadAllTextures() { for ( std::map< unsigned int, GLuint, std::less< int > >::const_iterator iter = mTexID.begin(); iter != mTexID.end(); ++iter ) { glDeleteTextures(1, &(iter->second)); //UnloadTexture(iter->first); } mTexID.clear(); }
Beitrag zuletzt geändert: 10.9.2012 4:09:48 von notinthetext -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage