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

27.08.2010, 18:29

[gelöst] STL List Problem

Hallo,

zur Zeit sitze ich vor einem Problem mit einer STL List. Mein Problem wird in diesem Thread bereits von Dofter angesprochen, allerdings löst es sich bei ihm "auf magische Weise in Luft auf" - bei mir nicht. ^^

Zunächst ein Quellcode-Ausschnitt:

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
// Struktur für Menüeinträge
struct MenuEntry
{
    unsigned int    Id;
    sf::String*     String;
};


// Klasse
class CMenu
{
public:
    // ...

private:

    list<MenuEntry>     m_listMenuEntries;                          // Liste aller Menüeinträge
};


// Bereich des Fehlers, innerhalb einer öffentlichen Memberfunktion der Klasse CMenu

// Neuer Menüeintrag
MenuEntry   MenuStartGame;

MenuStartGame.Id = 0;
MenuStartGame.String = new sf::String("Start Game", *m_pFont, 24.0f);
MenuStartGame.String->SetPosition(133.7f, 123.4f);

// Menüeintrag der Liste hinzufügen
m_listMenuEntries.push_back(MenuStartGame);    // <-- Genau hier (beim ersten Vorkommen der Liste kommt es zum Fehler!



Fehlermeldung:

(Link)



Bisherige Lösungsversuche des Problems:
  • Statt push_back einfach insert benutzt
  • Speicher bereits im voraus allokiert mit resize
  • Vector statt List, wobei sich in meinem Fall eine List eher eignet.
  • Vor das push_back eine erneute Deklaration der Liste mit gleichem Namen list<MenuEntry> m_listMenuEntries. Kein "bereits deklariert" Fehler, ansonsten läuft auch alles normal, nur steht die Liste dann eben lediglich innerhalb dieser einen Memberfunktion und nicht klassenweit zur Verfügung.
Hab momentan keine Idee woran es liegt. Würde mich über eure Lösungsvorschläge freuen.

Gruß
SaRu_

PS: Irgendwie etwas schade, dass man Grafiken nicht als Dateianhang hochladen und dann in den Post einbinden kann. :(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SaRu« (28.08.2010, 01:32)


Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

2

27.08.2010, 19:50

Des kann doch gar net sein...bist du dir ganz sicher, dass er bei der push_back Zeile hängen bleibt oder irgendwo anderst?
Bei der Fehlermeldung steht ja auch, dass er bei insert hängen bleibt und dort der Iterator außer range ist.
New Project: Operation CityRacer

3

27.08.2010, 20:22

Des kann doch gar net sein...bist du dir ganz sicher, dass er bei der push_back Zeile hängen bleibt oder irgendwo anderst?
Bei der Fehlermeldung steht ja auch, dass er bei insert hängen bleibt und dort der Iterator außer range ist.
Hallo Nexxtron,

ja ich mir mir ziemlich sicher! Habe beim Debugging zwei Haltepunkte gesetzt, einen unmittelbar vor und einen direkt nach dem ersten push_back() und der erste wird erreicht (das Programm pausiert), der zweite nicht, vorher stürzt das Programm ab.

Außerdem ist die Funktion push_back() nichts anderes als ein Aufruf der Funktion insert() mit der Position end().

C-/C++-Quelltext

1
2
3
4
5
// STL List 
void push_back(const _Ty& _Val)
        {   // insert element at end
        _Insert(end(), _Val);
        }


Gruß
SaRu_

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

4

27.08.2010, 20:41


Außerdem ist die Funktion push_back() nichts anderes als ein Aufruf der Funktion insert() mit der Position end().

Und da die STL keine Fehler macht, liegts eindeutig an deinem Programm.
Vermutlich irgend ein Fehler in der Menu-Klasse.

5

27.08.2010, 20:53

Und da die STL keine Fehler macht, liegts eindeutig an deinem Programm.
Vermutlich irgend ein Fehler in der Menu-Klasse.
Ja diese Vermutung hatte ich irgendwie auch schon. :huh:

Dieser Aufruf der push_back() Funktion ist das erste Vorkommen der Liste und anscheinend liefert end() keinen gültigen iterator. Die Frage ist also, was muss ich (vorher) tun, damit meine Liste einen gültigen iterator mit end() zurückliefert.

Gruß
SaRu_

jokester

Treue Seele

Beiträge: 125

Wohnort: Mainz

  • Private Nachricht senden

6

27.08.2010, 20:59

Wie erzeugst du denn das CMenu-Objekt? Könnte ja sein, dass da irgendwas schief läuft und deshalb der Konstruktor der list nie aufgerufen wird. Warum auch immer.
"There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened" -- Douglas Adams.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

27.08.2010, 21:03

end() gibt niemals einen gültigen iterator zurück. --It zeigt immer auf das letzte element. deswegen kannst du bei einer schleifenbedingung auch "It != liste.end()" schreiben.

edit: dein code dürfte gar nicht kompiliert werden. du übergibst deiner liste, die nicht für zeiger deklariert wurde, einen zeiger... da fehlt ein * bei der deklarierung oder beim push_back ;)
"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?

8

27.08.2010, 21:13

Hallo NachoMan,

meine Liste wurde für eine Struktur (siehe Quellcode in meinem ersten Post) deklariert. Diese Struktur nimmt einen Zeiger auf. Solch eine Struktur lege ich an und übergebe sie mit push_back() an die Liste.

Folgender Quellcode funktioniert:

C-/C++-Quelltext

1
2
list<MenuEntry> m_listMenuEntries;  // gleiche Zeile wie im private-Bereich der Klasse, im Grunde eine Redeklaration oder?!
m_listMenuEntries.push_back(MenuStartGame);


Programm läuft und der Debugger zeigt mir auch, dass die Liste die angefügten Struktur enthält. Zumindest bis zum Ende der Funktion Load() in der sich das alles abspielt. In der Funktion Render() zum Beispiel ist die Liste wieder leer. Das soll ja auch im Grunde so sein. Nur wie kann ich die Liste als Membervariable der Klasse nutzen, sodass die Liste allen Funktionen meiner Klasse zur Verfügung steht?

Gruß
SaRu_

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

27.08.2010, 21:19

ahh sorry <.<
wieso programmierst du in einer objektorientierten sprache wenn du die möglichkeiten nicht nutzt?
schreib die struktur in eine klasse um(private variablen), schreib einen kopierkonstruktor der neuen speicher für string deklariert und einen destruktor der den speicher freigibt. das dürfte dir ne menge probleme ersparen.

edit: bevor jetzt jemand meckert. mir ist klar das c++ eine multiparadigmen-sprache ist und man nicht immer alle regeln der objektorientierten programmierung einhalten muss. in diesem fall ist es aber eine eher schlechte idee...(sieht man ja an dem fehler)
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (27.08.2010, 21:32)


10

27.08.2010, 21:54

Hallo NachoMan,

ansich wollte ich nicht umbedingt für die string Klasse eine neue Klasse schreiben, sie also kapseln, nur weil ein unsigned int dazukommt. Aber ich werds mal probieren, danke für den Vorschlag.

Gruß
SaRu_

Werbeanzeige