Mir ist leider nicht ganz klar, was mir diese Fehlermeldung sagen möchte.
Expression: list iterator not dereferencable
Ich hab ein bisschen gegoogelt und glaube die Bedeutung herrausgefunden zu haben, dass es sich hier darum handelt, das man eine leere Liste nicht durchlaufen lassen kann.
Jedoch habe ich meiner Meinung nach die Möglichkeit ausgeschlossen, dass leere Listen durchlaufen werden, indem ich eine while-Schleife davorgesetzt habe, wie es mir schon beim Rendern der Schüsse vorgemacht wurde.
Trotzdem erscheint weiterhin diese Fehlermeldung.
Hier ein paar Codeausschnitte:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
void CGame::RenderExplosions ()
{
//Iterator für Explosionsliste
list<CExplosion>::iterator It = m_ExplosionList.begin ();
while (It != m_ExplosionList.end ())
{
//Explosion updaten
It->Update ();
//Ist der Schuss noch aktiv?
if (It->IsAlive ())
{
//Ja,dann rendern
It->Render ();
It++;
}
else
{
//Nein, dann aus der Liste entfernen
It = m_ExplosionList.erase (It);
}
}
}//RenderExplosions
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
void CGame::CheckCollisions ()
{
//Schussliste des Spielers holen
list<CShot> *ShotList = m_pPlayer->GetShotList ();
//Iteratoren für Asteroiden-, Explosions- und Schussliste
list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
list<CExplosion>::iterator ItExplosion;
list<CShot>::iterator ItShot;
//Rects für Asteroiden und schüsse
SDL_Rect RectAsteroid;
SDL_Rect RectShot;
//Alle Asteroiden durchlaufen
while (ItAsteroid != m_AsteroidList.end ())
{
//Rect des Asteroiden holen
RectAsteroid = ItAsteroid->GetRect ();
//Alle Schüsse durchlaufen
for (ItShot = ShotList->begin ();
ItShot != ShotList->end ();
++ItShot)
{
//Rect der Schüsse holen
RectShot = ItShot->GetRect ();
//Überschneiden sich die Rects?
if (RectShot.y < RectAsteroid.y + RectAsteroid.h - 15.0f &&
RectShot.y + RectShot.h - 15.0f > RectAsteroid.y &&
RectShot.x < RectAsteroid.x + RectAsteroid.w - 15.0f &&
RectShot.x + RectShot.w - 15.0f > RectAsteroid.x)
{
//Ja, also gab es eine Kollision.
//Neue Explosion erstellen
CExplosion Explosion;
//Explosion ersetzt Asteroiden
ItExplosion->Init (m_pSpriteExplosion, ItAsteroid->GetXPos (), ItAsteroid->GetYPos ());
//Explosion in Liste einordnen
m_ExplosionList.push_back (Explosion);
//Schuss und Asteroiden deaktivieren
ItAsteroid->SetAlive (false);
ItShot->SetAlive (false);
}
}
//Asteroid löschen, falls deaktiviert
if (ItAsteroid->IsAlive ())
ItAsteroid++;
else
ItAsteroid = m_AsteroidList.erase (ItAsteroid);
}
} //CheckCollision
|
Bedanke mich schonmal für die Hilfe