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

1

16.02.2011, 14:47

Problem mit den iteratoren von Listen

Hallo Leute,
nach dem Spiel, welches direkt in dem Buch gezeigt wurde, wollte ich noch einmal ein anderes in C++ umsetzen, was ich früher mal in Python geschrieben habe. Es handelt sich dabei um ein Spiel mit dem unglaubic innovativen Prinzip des Hang herunterfahrens. Man tut dies mit Skiern. Das ganze lässt sich zwar fehlerfrei kompilieren, dennoch erscheint die Fehlermeldung: "Lists iterator is not dereferenceable."

Hier der Code:

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
void CGame::move_trees()
{
    std::list<CTree>::iterator iter = m_lTreeList.begin();

    for (iter;iter!=m_lTreeList.end();++iter)
    {
        if (iter->IsAlive() )
        {
            iter->move();
        }

        else
        {
            m_lTreeList.pop_front();
        }
    }
}

void CGame::show_trees()
{
    for (std::list<CTree>::iterator iter = m_lTreeList.begin();iter!=m_lTreeList.end();++iter)
    {
        iter->show();
    }
}


Mit dem Debugger habe ich herausgefunden, dass die markierten Zeilen die sind, die die Probleme verursachen. Habt ihr Ideen, was ich korrigieren muss? Vielne Dank für alle Ideen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

16.02.2011, 14:50

wieso rufst du pop_front auf? das ergibt garkeinen sinn.
versuchs mal damit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::list<CTree>::iterator iter = m_lTreeList.begin();

    for (;iter!=m_lTreeList.end();)
    {
        if (iter->IsAlive() )
        {
            iter->move();
++iter
        }

        else
        {
            iter = m_lTreeList.erase(iter);
        }
    }


kannst natürlich auch ne whileschleife benutzen xD
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

16.02.2011, 15:07

Hey vielen Dank!
Dieses mal bekomme ich zu lesen, dass die iteratoren von listen nicht inkrementierbar sind und eine Fehlermeldung namens:
"Unbehandelte Ausnahme bei 0x68110367 in NextTry.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xfeeeff06."
Diese hat warscheinlich mit dem Destruktor der Klasse CTree zu tun.

C-/C++-Quelltext

1
2
3
4
CTree::~CTree()
{
    SDL_FreeSurface(m_image);
}


Habt ihr Ideen bezüglich der 1. und der 2. Meldung? Danke!

4

16.02.2011, 15:10

Hier noch mal meine überarbeitete Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CGame::move_trees()
{
    std::list<CTree>::iterator iter = m_lTreeList.begin();

    for (;iter!=m_lTreeList.end();++iter)
    {
        if (iter->IsAlive() )
        {
            iter->move();
        }

        else
        {
            iter = m_lTreeList.erase(iter);
        }
    }

}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

16.02.2011, 15:31

mit dieser schleife überspringst du aber ein tree wenn einer gelöscht wird.

zur zugriffsverletzung im destruktor: das weißt darauf hin, dass dort kein speicher reserviert hast, den zeiger ausversehen geändert oder den speicher schon freieggeben hast.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

19.02.2011, 12:48

Das Problem ist, dass du in der Forschleife ++iter stehen hast. Wenn du einen Iterator inkrementierst, dann gehst du auf das nächste Element. Wenn du jetzt nen Element löschst und dann versuchst den Iterator zu inkrementieren, bekommst du den Fehler. Guck nochmal den Code von NachoMan an. Er geht die Liste durch und erhöht dort den Iterator. Wenn ein Element wird wird der Iterator jedoch nicht verändert. Du darfst das "++iter" einfach nicht in den Kopf der Vorschleife stecken, sondern in den Rumpf. Guck dir einfach den Code den NachoMan gepostet hat nochmal an. Dann siehstes;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige