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

NicoWe

Treue Seele

  • »NicoWe« ist der Autor dieses Themas

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

1

18.12.2007, 16:21

[STL] list iterator not dereferencable

so, ich postes mal hier rein.

Ich habe eine std::list<CEnemy>, die ich durchlaufen will um erstens zu prüfen ob eine Position auf dem Bildschirm frei ist und um danach eine "freie" Klasse zu finden. Wenn keine da ist erstelle ich eine.
So, jetzt zum eigentlichen Fehler:

Quellcode

1
2
if(!i->IsAlive())
       continue;

Er(Visual C++ 2005 Express) durchläuft die Funktion einmal fehlerfrei und erstellt ordnungsgemäß eine neue Klasse. och beim 2. Mal kommt wenn er diesen Code durchläuft eine Messagebox "List iterator not dereferencable".
ch habe echt keine Ahnung worans liegen könnte, achso und das ist ein Spiel mit der SDL. Falls das einem hilft, hier die ganze Funktion:

Quellcode

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::SpawnEnemy ()
{
  bool bSpawned=false;
  bool bNoPosFound=false;

  // Muss der Spieler noch Gegner umbringen
  if(m_iEnemysLast == 0)
      return;

  // Wenn der Gegner weit genug vom Spawnpunkt entfernt ist, spawnen,
  // wenn er nicht existiert vorherigen überprüfen,
  // wenn Liste zuende auch spawnen.
  list<CEnemy>::iterator i;
  for(i=m_EnemyList.end(); i!=m_EnemyList.begin(); --i)
  {
          // lebendig?
      if(!i->IsAlive())
          continue;
          // Ja, also unsere Position überprüfen
      if(i->GetX()>70.0f || i->GetY()>70.0f)
      {
          // Freie Klasse zum Spawnen suchen
          for(i=m_EnemyList.begin(); i!=m_EnemyList.end(); ++i)
          {
              if(!i->IsAlive())
              {
                  i->Init(m_pSpriteEnemy, 50.0f, 50.0f);
                  bSpawned=true;
                  bNoPosFound=false;
                  m_iEnemysLast++;
                  break;
              }
          }
          
          break;
      }
      else
          bNoPosFound=true;
  }

  // Etwas gefunden? Wenn nein, dann etwas erstellen!
  if(!bSpawned==!bNoPosFound)
  {
      CEnemy Enemy;
      // Objekt Initialisieren
      Enemy.Init(m_pSpriteEnemy, 50.0f, 50.0f);
      // Objekt einfügen
      m_EnemyList.push_back(Enemy);
      // Der Spieler muss einen Gegner weniger abschiessen
      m_iEnemysLast++;
  }
  

} // SpawnEnemy


Danke im voraus
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

18.12.2007, 16:45

Dafür gibts ReverseIteratoren, dann kannst du dir so einen Unsinn sparen!

C-/C++-Quelltext

1
2
list<CEnemy>::iterator i; 
  for(i=m_EnemyList.end(); i!=m_EnemyList.begin(); --i)
@D13_Dreinig

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

3

18.12.2007, 16:45

C-/C++-Quelltext

1
for(i=m_EnemyList.end(); i!=m_EnemyList.begin(); --i)

End ist kein richtiges Listenelement und kann demnach nicht dereferenziert werden. Um eine Liste rückwärts zu durchlaufen, musst du die reverse Iteratoren benutzen.

Ts, zu langsam...

NicoWe

Treue Seele

  • »NicoWe« ist der Autor dieses Themas

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

4

18.12.2007, 17:37

Ok...

So, hab mal nen bisschen gegoogelt und hab das gefunden

Quellcode

1
2
3
4
5
6
7
8
list<string> lst;
// fill lst with data...
list<string>::iterator it;
for (it = lst.end(), it--;    // Init on last
   it != lst.begin(); --it)   // element
   {cout << *it << endl; // Uh-oh, skipped
                                   // first element!
}


Das heißt, dass sich ein reverse Iterator nur dadurch auszeichnet, dass man im Initialisierungspart der Forschleife noch ein It-- hinzufügt!?
Ich hab das ganze mal ausprobiert, es kommt das gleiche beim Ersten durchlauf

Und warum kommt er denn 1 mal durch die leere Liste durch, wenn ich keine reverseIteratoren nehme?


[edit] Das Codebeispiel funzt wenn die Liste nicht leer ist, danke für den Hinweis auf reverse Iteratoren
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

18.12.2007, 17:49

Das da ist kein revers Iterator!!!

C-/C++-Quelltext

1
for(std::list<Enemy>::reverse_iterator i=m_EnemyList.rbegin(); i!=m_EnemyList.rend(); ++i)

So und nicht anders ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

6

18.12.2007, 23:34

ehm doch geht auch anders:

C-/C++-Quelltext

1
for (std::list<CEnemy>::reverse_iterator i(m_EnemyList.rbegin()); i != m_EnemyList.rend(); ++i)
:P
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

19.12.2007, 15:42

:lol: Schelm. Prinzip bleibt aber unverändert ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

NicoWe

Treue Seele

  • »NicoWe« ist der Autor dieses Themas

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

8

19.12.2007, 15:49

Mh

Nj, ok aber was ist wenn die oben beschriebene Methode trozdem funzt? ist nicht so kompliziert wie mit nem reverse Iterator. Man darf nur keine leere Liste bekommen. Ich nehme aber die normalen reverse Iteratoren, die werden schon Vorteile haben :D

Danke vielmals
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

19.12.2007, 16:09

Ganz einfach:
Das eine ist dafür gedacht, das andere kann nur dazu missbraucht werden. Natürlich kann man sich auch auf eine Rakete setzen und hoffen, dass man in den USA ankommt, aber im Normalfall würde man doch das Flugzeug nehmen ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

19.12.2007, 17:38

Zitat von »"Nox"«

:lol: Schelm. Prinzip bleibt aber unverändert ;)


Deviloper's Code ist sogar exakt der Gleiche wie der Deinige!
@D13_Dreinig

Werbeanzeige