Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

SteveKr

Frischling

  • »SteveKr« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

1

08.09.2006, 21:14

Problem mit vector und erase

Also, ich habe einen Vector mit dem Namen "Statical" und möchte nun alle Elemente löschen, die eine Höhe von 236 haben. Wenn es allerdings mehr als zwei Elemente gibt, die die Höhe 236 haben stürzt das Programm ab.

Hier ist die Funktion zum Löschen der Elemente:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
vector<vStatical>::iterator it;
for (it=Statical.begin(); it!=Statical.end();) {
      if ((it)->Height==236)
      {
         it = Statical.erase (it);
      }
      else {
         ++it;
      }
}

Kennt jemand die Lösung für mein Problem? Danke schon mal für die Antworten.

mfg SteveKr

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

09.09.2006, 11:57

Also ist nur eine vermutung: aber wenn ein Vektor gelöscht wird, wird der Iterator nicht inkrementiert! Ich benutz eine selbstentwickelte Liste, und bei mir würde das nicht funktionieren, da nach dem löschen, der iterator, einen falschen wert hat! (Ungültiger speicherbereich...)

//Edit
Hab grad gesehen, dass die erase-Methode einen Wert zurückgibt... welchen?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

09.09.2006, 12:11

Ich sehe da keinen Fehler.
erase löscht das Element, auf das der Iterator zeigt, und liefert dann den Iterator auf das nachfolgende Element.
Was sagt der Debugger?

Anonymous

unregistriert

4

09.09.2006, 12:12

da ist kein fehler.

SteveKr

Frischling

  • »SteveKr« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

5

09.09.2006, 12:45

Der Debbuger sagt folgendes:

Zitat


Die Anweisung in "0x004184ec" verweist auf Speicher in "0xdddddde5". Der Vorgang"read" konnte nicht auf dem Speicher durchgeführt werden.
Klicken Sie auf "OK", um das Programm zu beenden.


Dieser Fehler kommt allerdings erst, wenn ich danach (nach dem Löschen) eine Methode meiner "Statical-Klasse" aufrufe.

Also hier:

C-/C++-Quelltext

1
2
3
    for(i=0;i<Statical.size();i++) {
        Statical[i].Draw();
    }

Statical.Draw ruft in diesem Fall die DirectX-Funktion Draw auf, und zeichnet das entsprechende Sprite.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

09.09.2006, 13:09

Lass dir mal vor dem Löschen die Größe des Vektors ausgeben, und bei jedem Löschvorgang nochmal eine Meldung, und danach nochmal die Größe. Also so:

Größe = 120
Lösche
Lösche
Lösche
Lösche
Größe = 116

Vielleicht ein Bug in deiner STL-Implementierung?

SteveKr

Frischling

  • »SteveKr« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

7

09.09.2006, 14:04

Hab mal das gemacht was David vorgeschlagen hat, allerdings bringt mich das nicht unbedingt weiter. Hier mal die Logbucheinträge.

Kommt raus wenn es insgesamt 3 Elemente gibt und das Erste (mit der Höhe 236) gelöscht wurde (stürzt danach ab):

Quellcode

1
2
3
Statical[0].Height = 236
Lösche
Statical[0].Height = 260


Kommt raus wenn es insgesamt 4 Elemente gibt und Zwei mit der Höhe 236 gelöscht wurden (stürzt auch danach ab):

Quellcode

1
2
Statical[0].Height = 236
Lösche


Kommt raus wenn es insgesamt 2 Elemente gibt und das Zweite mit der Höhe 236 gelöscht wurde (stürzt nicht ab):

Quellcode

1
2
3
Statical[0].Height = 260
Lösche
Statical[0].Height = 260


Kommt raus wenn es insgesamt 2 Elemente gibt und das Erste mit der Höhe 236 gelöscht wurde (stürzt ab):

Quellcode

1
2
3
Statical[0].Height = 236
Lösche
Statical[0].Height = 260


mfg SteveKr

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

8

09.09.2006, 14:14

David meinte nicht, dass du die Inahlte des Vectors sondern dessen Größe ausgeben sollst. Also Statical.size()

SteveKr

Frischling

  • »SteveKr« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

9

09.09.2006, 14:28

Ups. David hat als Beispiel so große Zahlen vorgeschlagen, dass ich dachte er meinte die Höhe. Na gut, hier jetzt nochmal das Ganze, diesmal mit der Größe.

Kommt raus wenn es insgesamt 3 Elemente gibt und das Erste (mit der Höhe 236) gelöscht wurde (stürzt danach ab):

Quellcode

1
2
3
Größe 3
Lösche
Größe 2



Kommt raus wenn es insgesamt 4 Elemente gibt und Zwei mit der Höhe 236 gelöscht wurden (stürzt auch danach ab):

Quellcode

1
2
Größe 4
Lösche


Kommt raus wenn es insgesamt 2 Elemente gibt und das Zweite mit der Höhe 236 gelöscht wurde (stürzt nicht ab, und funktioniert so wie es eigentlich überall funktionieren soll):

Quellcode

1
2
3
Größe 2
Lösche
Größe 1


Kommt raus wenn es insgesamt 2 Elemente gibt und das Erste mit der Höhe 236 gelöscht wurde (stürzt danach ab):

Quellcode

1
2
3
Größe 2
Lösche
Größe 1

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

09.09.2006, 16:01

Zitat

Kommt raus wenn es insgesamt 4 Elemente gibt und Zwei mit der Höhe 236 gelöscht wurden (stürzt auch danach ab):

Quellcode

1
2
Größe 4
Lösche

heißt das eine "Lösche", dass er schon abstürzt bevor das 2. "Lösche" eingetragen wird, oder hast du jetzt nur ein Lösche gepostet?

Werbeanzeige