[Gelöst] Hinzufügen eines Eintrages zu einer verketteten Liste
-
Hey Community.
Ich arbeite schon seit einiger Zeit an einer Modifikation für einen 2D-Shooter namens Teeworlds. In dieser soll dem Spieler ein Inventar zur Verfügung gestellt werden. Dieses programmiere ich derzeit. Es besteht aus zwei Klassen, welche ungefähr so aussehen (unwichtige Teile habe ich weggelassen):
class INVENTORY { class INVENTORYITEM *item_first; class INVENTORYITEM* lastItem(); }; class INVENTORYITEM { class INVENTORYITEM *item_next; }; INVENTORYITEM* INVENTORY::lastItem() { INVENTORYITEM *item = this->item_first; while (item != NULL) { // Hier tritt der unten gepostete Fehler auf item = item->item_next; } return item; }So rufe ich die lastItem()-Methode auf:
INVENTORYITEM *new_item = new INVENTORYITEM; new_item->... = ... // Einige Eigenschaften definieren inventory.lastItem()->item_next = new_item;Irgendwo liegt hier der Hund begraben, aber ich finde ihn einfach nicht. Die genaue Fehlermeldung lautet:
Zugriffsverletzung beim Lesen an Position 0x...
Weiß jemand von euch näheres dazu bzw. hat jemand einen Lösungsansatz?
Würde mich über Antworten freuen.
Lg,
-haiyyu
-
Warum benutzt du nicht einfach std::list? Und du benutzt extrem häßliche Bezeichnet... aber das ist wohl Geschmackssache.
-
Reine Großschreibung von Bezeichnern nehmen die meisten nur für Macros und Konstanten. Bei Klassen eher unüblich.
Das Problem: Du brauchst einen Konstruktor! In dem setzt du item_first auf NULL.
Oder du initialisierst es gleich korrekt.Kann es sein dass du von C her kommst? Die ganzen "class" vor den Typen der Member oder Rückgabetypen braucht es nicht. Im Prinzip würde das reichen:
class Inventory { InventoryItem* item_first; InventoryItem* lastItem(); }; class Inventory { InventoryItem* item_next; };Aber prinzipiell sollte ein Blick in Richtung std::list nicht schaden, wie Janjan schon geschrieben hat.
-
Hey.
Vielen Dank für die schnelle Hilfe.

Ich ging davon aus, dass Zeigern, denen nichts zugewiesen wurde, gleich NULL sind.
Aber das war dann ja wohl Quatsch.std::list werde ich mir mal anschauen und bei der nächsten Gelegenheit ausprobieren/mein Inventar-System umbauen.
Und ja, ich habe mit C angefangen. -
#edit
@ Janjan: War das mit den Bezeichnern auf die Großschreibung von Klassennamen bezogen oder meintest du etwas anderes damit?
-
haiyyu schrieb:
#edit
@ Janjan: War das mit den Bezeichnern auf die Großschreibung von Klassennamen bezogen oder meintest du etwas anderes damit?Ja, das wird er damit gemeint haben. Nenn deine Klasse anstatt INVENTORY lieber Inventory.
Großschreibung wird nur für Makros und Konstanten eingesetzt:
// Konstante const FLOAT PI = 3.1415; // Makro #define ADD2(x, y) (x + y)
-
ghjghj schrieb:
haiyyu schrieb:
#edit
@ Janjan: War das mit den Bezeichnern auf die Großschreibung von Klassennamen bezogen oder meintest du etwas anderes damit?Ja, das wird er damit gemeint haben. Nenn deine Klasse anstatt INVENTORY lieber Inventory.
Großschreibung wird nur für Makros und Konstanten eingesetzt:
// Konstante const FLOAT PI = 3.1415; // Makro #define ADD2(x, y) (x + y)float natürlich klein, sorry.
-
haiyyu schrieb:
INVENTORYITEM* INVENTORY::lastItem() { INVENTORYITEM *item = this->item_first; while (item != NULL) { // Hier tritt der unten gepostete Fehler auf item = item->item_next; } return item; }Hier ist der Rückgabewert immer NULL. Die korrekte Schleifenbedingung wäre while(item->item_next != NULL), dabei muss man nur vorher noch prüfen, ob item_first ungleich NULL ist.
-
Hey.
@ghjghj: Okay, werde mir die andere Schreibweise angewöhnen. Danke.

@ipsec: Stimmt, kleiner Denkfehler meinerseits. :3