BigBasti86 Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Hallo zusammen, ich beschaeftige mich seit einiger Zeit mit C++ und habe vorher eigentlich nur Java kennengelernt. Ich habe nun ein kleines Programm geschrieben, welches die Problematik der Hanoi-Tuerme bearbeitet. Also verschieben von A nach C ueber B. Mein Problem ist nun, dass mein Compiler(g++) alles schoen uebersetzt und nicht meckert aber die main() niemals ausgefuehrt wird. Wie gesagt, ich habe noch die Java-Gedanken-Struktur und nach diesem Wissen muesste es laufen. Ich bitte um Hilfe, da ich nichts mehr blicke.. Hier der Code: #include <iostream> #include <vector> using namespace std; typedef vector <int> tower; //tower kann als Schluesselwort //fuer Vector<int> verwendet werden //print_tower gibt den Turm aus. Zuerst die Kennziffer, //welche das erste Element im Vector ist, dann die restlichen Elemente void print_tower(tower& t){ cout << "Turm mit der Kennziffer " << t.at(0) << ":" << endl; for(int i = 1; i<t.size(); i++){ cout << t.at(i) << endl; } } //move fuehrt den geforderten Algorithmus durch. Hierbei wird fuer //k=1 einfach die oberste Scheibe von A nach C verschoben int move(int k, tower& a, tower& b, tower& c){ cout << "Vor dem Verschieben: " << endl; print_tower(a); print_tower(; print_tower(c); if(k == 1){ int z = a.back(); a.pop_back(); c.push_back(z); cout << z << " von A nach C" << endl << "A und C nach dem Versieben: " << endl; print_tower(a); print_tower(c); } //ist k != 1, werden erst die ersten n-1 Scheiben von A nach B verschoben else if(k != 1){ while(a.size() > 2){ // >2 weil die Kennziffer(erstes Element) // und das eigentliche erste // Element bleiben sollen b.push_back(a.back()); cout << a.back() << " von A nach B verschoben" << endl; a.pop_back(); } c.push_back(a.back()); // Letztes Element direkt nach C cout << a.back() << " direkt von A nach C" << endl; a.pop_back(); while(b.size() > 1){ //Hier sollen nun alle bis auf die Kennziffer //von B nach C gehen c.push_back(b.back()); cout << b.back() << " von B nach C verschoben" << endl; b.pop_back(); } cout << "Alle Tuerme nach dem Verschieben: " << endl; print_tower(a); print_tower(; print_tower(c); } } int main(){ //Eingabe vom Nutzer in n gespeichert cout << "Geben Sie eine Ganzzahl ein!"; int n; cin >> n; //Drei Tuerme tower a; tower b; tower c; //A wird mit n Elementen befuellt //Hier ist es ja so dass das Ende des Vektors //ja gerade der Anfang der Stange ist. //Deshalb liegt das kleinste Element am Ende des Vektors //also am Anfang der Stange for(int i = n; i>0; i--){ a.push_back(i); } move(n, a, b, c); print_tower(a); return 0; } [/code] Besten Dank im Vorraus fuer alle die sich die Zeit nehmen Gruss Der Basti Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 In der main fehlt uebrigens, das Einfuegen der Kennziffern. Aber das wird wohl kaum das Prob sein. Wahrscheinlich ist mir da einfach irgendeine C++ Regel nicht gelaeufig und ich uebernehme es falsch aus meinem Java-Verstaendnis Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Wenn main nicht ausgeführt wird, was macht er denn? Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Woraus folgerst du, dass main nicht ausgeführt wird? In der main fehlt uebrigens, das Einfuegen der Kennziffern. Aber das wird wohl kaum das Prob sein.Doch, genau das ist ein massives Problem. Dadurch hast du irgendwann einen Unterlauf in einem der Vectoren, wenn du versuchst, auf das Kennziffer-Element zuzugreifen, das gar nicht da ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 Danke schon mal für die Antworten, also dass die main nicht ausgeführt wird, erkenne ich daran dass ich im ShellTerminal (MacOS) eingebe: ./hanoi (also das prog. ausführe) und nix passiert. Ich habe mal als erste zeile der main, eine einfache ausgabe eingebaut (cout<< "test";) und auch diese wurde nicht angezeigt/ausgegeben. Daraus habe ich geschlossen dass die main gar nicht "betreten" wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 also dass die main nicht ausgeführt wird, erkenne ich daran dass ich im ShellTerminal (MacOS) eingebe: ./hanoi (also das prog. ausführe) und nix passiert. Das liegt aber nicht am Code. Kommt gleich wieder der Eingabeprompt, oder hängt das Programm? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 (bearbeitet) @Klotzkopp: stimmt, aber soweit habe ich noch nicht gedacht. Denn wenn das das einzige Problem wäre, würde ich bestimmt ne Fehlermeldung kriegen (NullPointer oder was auch immer). Aber wie gesagt, wenn ich das Prog laufen lasse, passiert einfach gar nichts. Also im Terminal sieht das dann ca. so aus: <user@bla im richtigen Ordner> ./hanoi <user@bla im richtigen Ordner> wenn ihr jetzt wisst wie ich das meine.. also ersteres(gleich wieder neue eingabe) @Klotzkopp Bearbeitet 22. Juni 2009 von BigBasti86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Versuch bitte mal, ein einfaches Hello-World-Programm zu bauen und laufen zu lassen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 (bearbeitet) Also so etwas habe ich bereits probiert. Habe eine main() geschrieben und darin eine Ausgabe (cout) gemacht. Das hat gefunzt...:confused: Natürlich das Ganze in einer eigenen Datei test.cpp Diese auf die selbe weise compiliert und lief.. Bearbeitet 22. Juni 2009 von BigBasti86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Lass mal den Debugger mitlaufen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 oha.. mit so nem teil hatte ich schon immer Probleme. Die Sache ist, dass uns ein Mac-Rechner zur Verfügung gestellt wird. Und dort arbeiten wir einfach mit Emacs und Terminal. Ich wüsste nicht, wie ich dort mit nem Debugger arbeite. Java habe ich immer zuhause mit eclipse(der ja einen Debug-Modus hat) gemacht. Ich besorg mir jetzt erstmal schnell eclipse für c++.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 ok wenn das so richtig ist: in eclipse -> neues projekt -> neuer source folder -> neue source datei -> in die source datei dann meinen code reinschreiben und als .cpp speichern -> laufen lassen dann zeigt er mir immer "Launch failed. Binary not found" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Versuch's doch erst einmal mit gdb. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 Danke nochmals Klotzkopp! Wie gesagt ich bin ein totaler Neuling in C++. Ich habe nun in eclipse mit einem makefile gearbeitet, und es funktioniert prima. Wieso es nun funzt und vorher nicht kann ich aber auch nicht wirklich begründen. Auf das Problemmit den Kennziffern bin ich dann auch gestoßen und habe das dann noch eingefügt. Eine Frage hätte ich aber noch: Kann ein c++-Quellcode, der von einem Compiler als ok anerkannt wird, von einem anderen Compiler als fehlerhaft anerkannt werden. Spielt es also allein in Bezug auf den Quellcode eine Rolle welchen Compiler man wählt? Gruß Basti Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Juni 2009 Teilen Geschrieben 23. Juni 2009 Kann ein c++-Quellcode, der von einem Compiler als ok anerkannt wird, von einem anderen Compiler als fehlerhaft anerkannt werden. Spielt es also allein in Bezug auf den Quellcode eine Rolle welchen Compiler man wählt? Ja. Auch Compiler sind Software, und können daher Fehler enthalten. Außerdem halten sich die wenigsten Compiler exakt an den Standard. Und schließlich hat noch fast jeder Compiler Erweiterungen, mit denen andere Compiler nichts anfangen können. Mein Visual C++ 2008, das ich benutzt habe, um deinen Code zu testen, hat sich beispielsweise geweigert, deinen Code zu akzeptieren, weil die move-Funktion den Rückgabetyp int hat, aber am Ende keine return-Anweisung steht. Ansonsten sollte dein Code aber von jedem halbwegs aktuellen Compiler richtig übersetzt werden. Ich vermute eher, dass beim Erstellen irgendetwas schiefgelaufen ist, und du immer eine alte Version des Programms ausgeführt hast. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BigBasti86 Geschrieben 24. Juni 2009 Autor Teilen Geschrieben 24. Juni 2009 Vielen Dank nochmals für die Hilfestellungen. Ich habe es wie gesagt zum laufen bekommen. Musste den Code aber nochmals ändern damit auch wirklich der Hanoi-Algo ausgeführt wird. Das war ja vorher Schwachsinn. Hat aber ja nichts mit dem Problem zu tun gehabt. Nur zur Info, damit ein Leser nichts falsches denkt :upps Gruß Basti Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.