Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 05.02.2006, 20:05 Titel: Element aus einer Liste löschen |
|
|
Hi
Ich habe ein Problem. Ich habe ein Liste erstellet in dem die ganzen Schüsse eines Spiels verwaltet werden. Wenn der Schuss nun die Bildschirmgrenze überschritten hat soll er gelöscht werden. Hier ist mal mein code:
CPP: | for(its = shots.begin(); its != shots.end(); its++)
{
if(its->x > 1024 || its->x < 0 || its->y > 768 || its->y < 0)
{
shots.erase(its);
}
else
{
shot.SetPosition(its->x, its->y);
shot.SetRotation(its->rotation);
shot.Draw();
shot.Animate(Framerate);
its->x += its->xspeed/Framerate;
its->y += its->yspeed/Framerate;
}
} |
Wenn ein ein Schuss nun die Bildschirmgrenze überschreitet dann kriege ich den Fehler: list iterator not incrementable
woran liegt es? _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.02.2006, 20:11 Titel: |
|
|
its = shots.erase(its); _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 05.02.2006, 20:21 Titel: |
|
|
hm..es klappt jetzt aber nur wenn dies nicht das letzte Element war.
hat irgendwer eine Ahnung wieso?
@FH hab den Banner jetzt ma komplett rausgemacht weil ich das eh was falsch verstanden hab _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 05.02.2006, 20:39 Titel: |
|
|
Es ist ja schon komisch, dass du in deiner for-Schleife den iterator inkrementieren kannst, aber er bei erase nen Fehler ausspuckt, wenn du das versuchst...
Entweder is in der STL was ganz gewaltig falsch, oder du hast deinen iterator irgendwie komisch definiert...
Was liefert er denn jetzt für nen Fehler beim löschen des letzten Elements?
Wegen Sig: Wie du meinst...
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 05.02.2006, 20:50 Titel: |
|
|
Könntest du mal die genau Zeile geben in der das crasht? Ist das der Kopf der FOR-Schleife? Oder der erase-Aufruf? Wenn das der Kopf ist, hat mir jemand gerade die Lösung gesagt...
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 05.02.2006, 20:54 Titel: |
|
|
Es ist doch keine Zeilenangabe angegeben nur die Zeile in list in der STL... _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.02.2006, 21:02 Titel: |
|
|
http://www.jliforum.de/board/viewtopic.php?p=40336#40336 _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 05.02.2006, 21:09 Titel: |
|
|
k thx FH
hat alles geklappt
Danke an alle _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 05.02.2006, 21:17 Titel: |
|
|
Ich dachte eigentlich du nimmst Fallens Lösung, da hab ich meine gelöscht... Also hier nochmal:
FH hat Folgendes geschrieben: | Hmm... Debuggen???
Also egal... Versuchen wir es so, wie mein "Tipp" es gesagt hat...
Du darfst net im Kopf der Schleife inkrementieren. Warum?
Du löscht ein Objekt. Dann zeigt der iterator auf das Ende der List. Dann wird er inkrementiert (was nicht geht, da er jetzt aus der Liste rausläuft). Erst dann wird getestet, ob die Liste zu Ende ist. (Hoffe mal, das stimmt).
So oder so ähnlich...
Probier mal folgende while-Schleife:
CPP: | its=shots.begin();
while(its!=shots.end())
{
if(its->x > 1024 || its->x < 0 || its->y > 768 || its->y < 0)
{
its=shots.erase(its);
if(its==shots.end())
{ break; }
}
else
{
shot.SetPosition(its->x, its->y);
shot.SetRotation(its->rotation);
shot.Draw();
shot.Animate(Framerate);
its->x += its->xspeed/Framerate;
its->y += its->yspeed/Framerate;
}
its++;
} |
Ist wahrscheinlich nicht das beste und effektivste, aber Versuch es mal.
Gruß und dank an den Tippgeber
FH |
So. Der Vollständigkeit halber.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 05.02.2006, 21:18 Titel: |
|
|
ups hab Fallens Antwort ganz übersehen _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
|