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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

03.02.2009, 15:43

list iterator not incrementable

Hallo ,
hab mal wieder ein Porblem.
Bekomme bei folgendem Code einen Laufzeitfehler namens "list iterator not incrementable" und da ich keine übersetzung des Wortes "incrementable" gefunden habe (Was heißt das?) hab ich mit meinem solala Englisch ja paar englische Threads durchgelesen und hab nur rausgefunden das es sich dabei um einen ungültigen iterator handelt.

Aber wie und weshalb weiss ich leider nicht.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    list <CKunde*>::iterator i;
    list <CKunde_Normal*>::iterator a;

    i=m_lKundenDaten.begin ();
    a=m_lKundenNormal.begin ();

    for (int t=0;t != ID;i++ ) //Position festlegen

    {
    }

    for (int t=0;t != ID;a++) //Position festlegen

    {
    }

    m_lKundenDaten.erase (i);
    m_lKundenNormal.erase (a);

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.02.2009, 15:49

Was ist ID?
Warum benutzt du nicht find?

3

03.02.2009, 16:12

Hm, was könnte "incrementable" wohl bedeuten... "Inkrementierbar" wirds ja kaum sein... :roll:

Normalerweise wird bei so einer Assertion der Debugger gestartet. Dann kannst du auch schauen, was nicht stimmt.

Aber schau dir mal std::advance() oder std::find() an. Wobei es bei einer Liste nicht empfehlenswert ist, Random Access hinzubiegen. Wenn du per Index ein Element löschen willst, solltest du dir vielleicht einen Random Access-Container überlegen, wie zum Beispiel std::vector oder std::deque. Dann kannst du auch den operator+ benutzen.

4

03.02.2009, 16:16

Zitat von »"Nexus"«

Hm, was könnte "incrementable" wohl bedeuten... "Inkrementierbar" wirds ja kaum sein... :roll:

Ja super, inkrementieren ist ein deutsches Wort bloß weiß man deshalb noch lange nicht, was das eigentlich bedeuten soll.
Aber mein englisch Wörterbuch liefert mir zu "increment" ein paar sinnige Bedeutungen, z.B. "erhöhen".
Lieber dumm fragen, als dumm bleiben!

5

03.02.2009, 16:22

Zitat von »"Jonathan_Klein"«

Ja super, inkrementieren ist ein deutsches Wort bloß weiß man deshalb noch lange nicht, was das eigentlich bedeuten soll.
Ähem... Wenn man C++ programmiert, erfährt man die Bedeutung spätestens beim ++-Operator. Den Begriff "Iterator" kannten wohl auch die wenigsten vorher... :roll:

Zitat von »"Jonathan_Klein"«

Aber mein englisch Wörterbuch liefert mir zu "increment" ein paar sinnige Bedeutungen, z.B. "erhöhen".
Stimmt. Viel sinnvoller als "inkrementieren", da ja auch etwas ganz anderes gemeint ist. Naja...

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

6

03.02.2009, 16:27

kann es sein das du t in der schleife nicht um eins erhöchst?
ka wie der dann rauskommt, da das ja ne endlosschleife geben sollte.

is mir nur grade so aufgefallen
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

7

03.02.2009, 21:37

Da Gotbread ja schon den Fehler gefunden hat noch ein kleiner Tipp: Benutze std::list nicht für so 4 Bytes kleine Datentypen. Das ist einfach nur ineffizient. Allein schon die Next und Prev Pointer verbrauchen das doppelte, und der Overhead durch die Heapallokierung dürfte mindestens einen Faktor 10 an Speicherverschwendung verursachen.. Mal ganz davon abgesehen, dass du offensichtlich Random-Access willst ;)

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

8

04.02.2009, 18:21

Ja, ein vector wäre hier vermutlich angebrachter. Elemente hinzufügen ist zwar etwas langsamer wie bei listen, dafür hast du wesentlich schnelleren zugriff, da du ja sowieso über nen index ran willst. Und bei Zeigern spielt auch das bissl vergrößerungszeit das du alle 10 Kunden hast keine Rolle mehr. Der Hauptgrund sollte für dich sein:
vectors sind in deinem fall einfacher zu handhaben oder hast du einen konkreten grund, warum du grade auf listen setzt?

Socke

9

04.02.2009, 22:44

Zitat von »"Faule Socke"«

Ja, ein vector wäre hier vermutlich angebrachter. Elemente hinzufügen ist zwar etwas langsamer wie bei listen [...]
Nur, wenn die Sequenz reallokiert werden muss. Wenn die Kapazität ausreicht, ist ein push_back() wohl einiges schneller, da nur ein Wert kopiert werden muss. Mit reserve() kann man sich auch im Voraus genügend Speicher beschaffen, um spätere Reallokationen zu verhindern.

Werbeanzeige