Debug Vector fehler, Release Vector geht?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Raidenkk
Beiträge: 64
Registriert: 27.11.2011, 02:32
Echter Name: Kevin
Wohnort: Bergkamen
Kontaktdaten:

Debug Vector fehler, Release Vector geht?

Beitrag von Raidenkk »

Hey,
ich habe eine kleine Kollision zwischen Maus und Objekt geschrieben und Ziel ist es den Vector nach dem Treffen zu löschen.
Jetzt habe ich aus versehen die ganze Zeit im Release gearbeitet und habe es jetzt auf Debug geschaltet.
Leider kommt beim Debug Modus ein Inkrement Vector Fehler.
Im Release aber gibt es kein Fehler und alles Funktioniert einwandfrei.
Hat jemand eine Idee woran es liegen könnte?

Code: Alles auswählen

for (std::vector<CBottles>::iterator i =vBottles.begin (); i<vBottles.end (); i++)
		{
			if (Mouse.Get_Y ()-32 >= i->Get_Y ()-8 && Mouse.Get_Y ()-32 <= i->Get_Y ()+32)
			{
				if (Mouse.Get_X ()-32 >= i->Get_X ()-11 && Mouse.Get_X ()-32 <= i->Get_X ()+11)
				{
					vBottles.erase (i);
				}
			}
		}
simbad
Establishment
Beiträge: 132
Registriert: 14.12.2011, 14:30

Re: Debug Vector fehler, Release Vector geht?

Beitrag von simbad »

Nach dem erase dürfte dein iterator ungültig sein.
Kann sein, das erase einen gültigen iterator als ergebnis liefert. Ansonsten schleife neu starten. Abbrechen. Aber nicht weiter verwenden.
Benutzeravatar
Raidenkk
Beiträge: 64
Registriert: 27.11.2011, 02:32
Echter Name: Kevin
Wohnort: Bergkamen
Kontaktdaten:

Re: Debug Vector fehler, Release Vector geht?

Beitrag von Raidenkk »

wird beim erease der ganze iterator gelöscht 0o?

EDIT:
Habe die Schleife mit einem Break unterbrochen und es Funktioniert danke dir :)

Code: Alles auswählen

for (std::vector<CBottles>::iterator i =vBottles.begin (); i<vBottles.end (); i++)
		{
			if (Mouse.Get_Y ()-32 >= i->Get_Y ()-8 && Mouse.Get_Y ()-32 <= i->Get_Y ()+32)
			{
				if (Mouse.Get_X ()-32 >= i->Get_X ()-11 && Mouse.Get_X ()-32 <= i->Get_X ()+11)
				{
					vBottles.erase (i);
					break;
				}
			}
			else if (Mouse.Get_Y ()-32 >= i->Get_Y ()-32 && Mouse.Get_Y ()-32 <= i->Get_Y ()-8)
			{
				if (Mouse.Get_X ()-32 >= i->Get_X ()-6 && Mouse.Get_X ()-32 <= i->Get_X ()+6)
				{
					vBottles.erase (i);
					break;
				}
			}
		}
simbad
Establishment
Beiträge: 132
Registriert: 14.12.2011, 14:30

Re: Debug Vector fehler, Release Vector geht?

Beitrag von simbad »

erase entfernt ja ein element aus dem vector.
In logischer konsequenz, rücken die folgenden elemente auf.
Damit wird der alte iterator ungültig. Ungültig und gelöscht sind zwei unterschiedliche Dinge!

erase liefert aber einen iterator auf das nun aktuelle element zurück.

Man könnte also das Ergebnis von erase dem iterator zuweisen und hätte dann wieder einen gültigen iterator

Wenn man dann noch das weiterschieben des iterators in den else zweig der Abfragen packt, dann dürfte das ganze nahe an optimal sein.
Das mit dem return wert von erase habe ich selbst noch nicht versucht. Daher einfach mal ausprobieren.

http://www.cplusplus.com/reference/stl/vector/erase/

Ist in meinen Augen die beste Quelle wenns um die verwendung der STL geht.
simbad
Establishment
Beiträge: 132
Registriert: 14.12.2011, 14:30

Re: Debug Vector fehler, Release Vector geht?

Beitrag von simbad »

Ha.

Erstmal habe ich deinen Code etwas überarbeitet. Aber das ist nur eine Sache die du dir mal anschauen solltest.

Schlimmer ist, das du in der for-schleife den iterator < vBottles.end() vergleichst. Das sollte man unter lassen. Am besten ist es immer iterator != vBottles.end() zu vergleichen

Code: Alles auswählen

std::vector<CBottles>::iterator i =vBottles.begin ();

while (i!=vBottles.end ())
{
if (Mouse.Get_Y ()-32 >= i->Get_Y ()-8 && Mouse.Get_Y ()-32 <= i->Get_Y ()+32)
    {
        if (Mouse.Get_X ()-32 >= i->Get_X ()-11 && Mouse.Get_X ()-32 <= i->Get_X ()+11)
        {
            i=vBottles.erase (i);
            continue;
        }
    }
    else 
    {
        if (Mouse.Get_Y ()-32 >= i->Get_Y ()-32 && Mouse.Get_Y ()-32 <= i->Get_Y ()-8)
        {
            if (Mouse.Get_X ()-32 >= i->Get_X ()-6 && Mouse.Get_X ()-32 <= i->Get_X ()+6)
            {
                i=vBottles.erase (i);
                continue;
            }
        }
    }
    ++i;
}
Wenn er ein erase gemacht hat, wird der iterator automatisch korrekt ausgerichtet.
Wenn du die Liste immer vollständig abarbeiten musst, dann benutzt man continue, ansonsten break.
Und du solltest Klammern um die logischen Ausdrücke machen. Damit man beim lesen sofort sieht, in welcher Reihenfolge der Ausdruck abgearbeitet werden soll.
Dabei geht es nicht um die Frage, ob der Compiler das versteht, sondern ob jemand anderes es versteht.

Sollen in jedem Fall nur Hinweise sein. Keine Pflicht das auch zu machen.
Antworten