Programm bricht sofort wieder ab
-
In Zeile 35 übergibst du erster an erzeugestack. erster ist ein nullptr, zeigt also auf nichts. In Zeile 21 bekommst du diesen nullptr als Parameter anker. Dann dereferenzierst du in Zeile 23 den nullptr und das Programm stürzt ab.
Das ist ganz schlechtes C was du da geschrieben hast. Bevor ich Verbesserungsvorschläge lege dich bitte fest, ob du das in C oder C++ schreiben willst.
-
Abgesehen davon, dass es nicht kompiliert weil die Funktion
erzeugestackzwei Definitionen hat, erzeugt das Programm einen segmentation fault, was normalerweise auf fehlerhaftes Gefrickel mit Zeigern zurückzuführen ist (was ich jetzt nicht suchen werde, dazu hab ich keine Nerven).Verbesserungsbedürftig am Code ist:
- Globale Variablen sind generell schlecht.
- Mehrfachzeiger sind generell schlecht.
- Besitzende Zeiger sind immer schlecht (besser wären Smartpointer).
- So etwas würde man in richtigem C++ in eine schöne Klasse schreiben, die dann alles managed.Wenn du einfach einen Stack haben möchtest, so kannst du auch einfach
std::stack, bzw.std::deque/std::vector, benutzen. Dein Code sieht leider nach C mitnewundcoutaus.
-
- ich fange grad erst mit Informatik an ob das jetzt mit c mehr zu tun hat als c++ hab ich keine Ahnung, mein Dozent behauptet dass er c++ unterrichten würde
- der code ist absichtlich sehr einfach gehalten damit ich da einfach besser durchsteige
- Klassen hatte ich in meinem Informatik-kurs noch nicht
- erzeugestack ist versehentlich zweimal drinn weil ich grade nochmal was ausprobiert habe
- Die Art wie ich die Aufgabe angegangen bin ist schon richtig
-
ich kann es halt einfach nicht besser.
In Zeile 35 übergibst du erster an erzeugestack. erster ist ein nullptr, zeigt also auf nichts. In Zeile 21 bekommst du diesen nullptr als Parameter anker. Dann dereferenzierst du in Zeile 23 den nullptr und das Programm stürzt ab.
Das ist ganz schlechtes C was du da geschrieben hast. Bevor ich Verbesserungsvorschläge lege dich bitte fest, ob du das in C oder C++ schreiben willst.wie kann ich das ändern? soll natürlich in c++ geschrieben werden. Von C hab ich keine Ahnung.
-
Hat das noch niemand gesagt?!
Als allererstes: aktivier den höchten Warnlevel in Deinem Compiler/Deiner IDE.Wenn ich Deinen Source kompiliere bekomme ich an zwei Stellen vom Compiler gesagt, dass da was nicht ganz koscher ist.
-
Der Code ist sehr schwer zu verstehen, u.a. weil
- Die Datenstruktur, die implementiert wird, nicht beschrieben ist: ich muss mir folglich alle Funktionen gleichzeitig anschauen, um ihren Sinn zu verstehen. Die Namensgebung ist auch inkonsistent - soll ein Stack oder eine Liste benutzt werden?
- Die Funktionsargumente/Rückgabewerte sind z.T. unverständlich - in einigen Fällen ist nicht klar, wieso überhaupt etwas zurückgegeben wird.
- ** ... sollte die Ausnahme sein, Rückgabe über Funktionsparameter kann gelegentlich gerechtfertigt sein, aber nicht als Regel.
- einbuchstabige Bezeichner haben keinerlei Aussagekraft. Verwendet Namen, die darstellen, was die jeweilige Variable repräsentiert.Ich empfehle nochmal ganz von vorn anzufangen und erst mal nur einen minimalen Satz an Funktionen zu implementieren und zu testen (push und print müssten theoretisch reichen um in main etwas Interessantes machen zu können). Das kannst du dann auch gerne hier posten und wir können dann Details diskutieren.
Was macht eigentlich erzeugestack, was push nicht kann?
-
ich hab noch einen anderen Quellcode dazu verfasst.
Vielleicht ist der ja verständlicher. Das Problem hier ist dass wenn ich den Quellcode debuggen möchte ausschließlich 3 in Endlosschleife ausgegeben wird.#define anzahlWaggons 4 #include <iostream> #include "Funktionen.h" #include "Strukturen.h" using namespace std; ptr erster=erzeugeStack(), zweiter=erzeugeStack(), dritter=erzeugeStack(); // Stacks f¨¹r Gleis A - C int c; int main (void) { char auswahl = 0; // Kriteriumsaufgabe 3 erster = push( erster, 4 ); erster = push( erster, 1 ); erster = push( erster, 3 ); erster = push( erster, 2 ); cout << "Schritt 1" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; printStack(dritter); pop(erster); zweiter = push( zweiter, 2 ); cout << "Schritt 2" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; pop(erster); zweiter = push( zweiter , 3); cout << "Schritt 3" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; pop(erster); dritter = push( dritter , 1); cout << "Schritt 4" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; pop(zweiter); erster = push( erster , 3); cout << "Schritt 5" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; pop(zweiter); dritter = push( dritter , 2); cout << "Schritt 6" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; pop(erster); dritter = push( dritter , 3); cout << "Schritt 7" << endl; cout << " Gleis 1: "; printStack(erster); cout << " Gleis 2: "; printStack(zweiter); cout << " Gleis 3: "; pop(erster); dritter = push( dritter , 4); cin >> c; return(0); } ptr erzeugeStack() // einen leeren Stack anlegen { ptr neuStack = NULL; return(neuStack); } bool isEmpty( ptr gleis ) // feststellen, ob der Stack leer ist { if(gleis == NULL) { return true; } return false; } ptr push( ptr neuWaggon, int nummer ) // ein Element auf Stack ablegen { ptr p = new struct waggon; p->next = neuWaggon; p->data = nummer; return(p); // neuer Anker } ptr peek( ptr p ) // liefert das oberste Element auf dem Stacks, ohne es zu entfernen { return ( p ); } ptr pop( ptr gleis ) // liefert das oberste Element auf dem Stack und entfernt es { if(isEmpty(gleis)) return 0; // Abbruch wenn Gleis leer ist ptr p = gleis->next; delete gleis; return (p); } int printStack ( ptr gleis ) // Stack ausgeben { ptr p=gleis; if(isEmpty(p)) { cout << "empty stack"; return 1; } while(p!=NULL) { cout << p->data << " "; p=p->next; } return 0; }
-
Mein Dozent wollte halt dass das Problem über 5 Funktionen erzeugestack(),push(),Pop(),peek(),printstack() gelöst wird. Deshalb erzeugestack.
Ein weiteres ganz großes Problem ist halt dass ich als blutiger Anfänger die ganzen Fehler überhaupt nicht finden kann, bzw einfache stumpfe Fehler übersehe weil ich mich auf andere Sachen konzentriere.
-
Diese Funktion scheint nicht zu funktionieren:
ptr pop( ptr gleis ) { if(isEmpty(gleis)) return 0; ptr p = gleis->next; delete gleis; return (p); }
-
ich habs umgeschrieben, jetzt funktionierts

ptr pop(ptr gleis) { if(isEmpty(gleis)) return 0; ptr p=gleis; gleis = gleis->next; erster=erster->next; delete p; return gleis; }
-
ok es funktioniert doch nicht. Da hat sich wieder irgendeine Zeile eingeschlichen die da eigentlich nicht hingehört.
ptr pop(ptr gleis) { if(isEmpty(gleis)) return 0; ptr p=gleis; gleis = gleis->next; erster=erster->next; delete p; return gleis; }Zeile 5 gehört da nicht rein...
ptr erster=erzeugeStack(),hier wird die Struktur "erster" definiert und initialisiert.
pop(erster);hier erfolgt die Parameterübergabe.
lösche ich jetzt Zeile 5 sieht die Funktion so aus
ptr pop(ptr gleis) { if(isEmpty(gleis)) return 0; ptr p=gleis; gleis = gleis->next; delete p; return gleis; }gleis müsste in diesem Fall erster ersetzen.
entferne ich Zeile 5 aus der Funktion funktioniert das ganze Programm nicht mehr.
ich verstehs einfach nicht
-
Mal es dir auf. Wenn du ein Kästchen "erster" mit Pfeilen zu anderen Kästchen hast, dann sollte auf dem Papier leicht zu sehen sein welche Pfeile wie umgebogen werden müssen, damit das richtige raus kommt. Das kannst du dann sicher auch in Code umsetzen.