000
23.09.2006, 13:42 Uhr
fp
|
Hi, ich habe ein merkwürdiges Problem, konnte auch nichts passendes dazu finden:
Ich habe eine Implementierung eines simples Stacks, dessen Elemente lediglich Integerwerte speichern sollen. Was daran nun nicht funktioniert ist mir einfach nur noch ein Rätsel. Es wird nur das oberste Element vom Stack richtig gespeichert. Das Testprogramm soll einfach erst Werte drauflegen und jedesmal schauen, was nun oben auf dem Stapel liegt, danach die Elemente wieder löschen, und nach jedem Löschen wieder prüfen was oben liegt.
Jedes Element hat einen Zeiger auf ein Stackelement, nämlich das darunter liegende. Bei der Initialisierung des ersten Elements ist deshalb dieser Zeiger korrekt auf NULL gesetzt, weil es ja das einzige Element ist und nichts darunter liegt. Sobald allerdings die pop() Funktion aufgerufen wird, ist dieser Zeiger verändert und zeigt irgendetwas anderes, somit sind alle Daten, wenn man mehrere Elemente speichert, eben nicht mehr zugreifbar.
Woran könnte das liegen ? Beim Test wird zuerst nur ein Element dem leeren Stack hinzugefügt und danach sofort wieder gelöscht, sobald pop() zum Löschen aufgerufen wird, ist der next-Zeiger aber nicht mehr NULL, obwohl er das sein sollte. Beim Aufruf von top(), nur zum schauen was auf dem Stack liegt, passiert jedenfalls nichts. Ich habe mir die Speicherreferenzen von dem obersten Objekt, und auf was sein next-Zeiger zeigt, bei jedem Funktionsaufruf ausgeben lassen und der next-Zeiger des obersten Elements geht erst beim Aufruf von pop() kaputt, ohne dass die Funktion irgendwas anstellt. (Diese Testausgaben hab ich bei dem Code unten aber weggelassen).
C++: |
#include <iostream> using namespace std;
class StackElem { private: int value; StackElem* next; public: StackElem(int a) { value = a; next = NULL; } StackElem() {} StackElem* get_next() { return next; } void set_next(StackElem* n) { next = n; } int get_value() { return value; } void set_value(int v) { value = v; } };
class Stack { private: StackElem* head; public: Stack() { head = NULL; } void top() { if(head == NULL) cout<<"\nStack is empty"; else cout<<"\ntop element: "<<(*head).get_value(); } void push(int val) { StackElem new_elem(val); if(head == NULL) head = &new_elem; else { new_elem.set_next(head); head = &new_elem; } } void pop() { if(head == NULL) cout<<"\nStack is empty, nothing to delete"; else { cout<<"\ndeleting top element with value: "<<(*head).get_value(); head = (*head).get_next(); } } };
// stack test
int main() { Stack my_stack; int opt=100; int ins=0;
my_stack.push(2); my_stack.top(); my_stack.pop(); my_stack.top(); my_stack.push(3); my_stack.top(); my_stack.push(4); my_stack.top(); my_stack.push(5); my_stack.top(); my_stack.pop(); my_stack.top(); my_stack.pop(); my_stack.top(); my_stack.pop(); my_stack.top(); }
|
Ich verwende den gcc 3.4.6 Falls mir das jmd erklären könnte wäre das super :/
mfg, fp Dieser Post wurde am 23.09.2006 um 13:52 Uhr von fp editiert. |