kostenloser Webspace werbefrei: lima-city


Problem mit Maps und Iteratoren

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    notinthetext

    Kostenloser Webspace von notinthetext, auf Homepage erstellen warten

    notinthetext hat kostenlosen Webspace.

    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!?
    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);
        }
    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.

    Ich habe mich im Internet umgesehen, aber im Grunde nur den vorliegenden Quellcode gefunden.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich weiß nicht obs hilft, aber solltest du nicht
    UnloadTexture(iterator->second);
    verwenden?
  4. Autor dieses Themas

    notinthetext

    Kostenloser Webspace von notinthetext, auf Homepage erstellen warten

    notinthetext hat kostenlosen Webspace.

    philippkern schrieb:
    Ich weiß nicht obs hilft, aber solltest du nicht
    UnloadTexture(iterator->second);
    verwenden?
    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
    iterator->first
    aufzurufen. Wirklich gelöscht wird sie dann innerhalb der Funktion. Zum verständnis nochmal die Funktion UnloadTexture
    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;
    }
    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.

    EDIT: Hat sich damit dann wohl erledigt. Hab das jetzt auf
    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();
    }
    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.

    Beitrag zuletzt geändert: 10.9.2012 4:09:48 von notinthetext
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!