Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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.
Geschrieben

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.

Geschrieben
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?

Geschrieben (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 von BigBasti86
Geschrieben (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 von BigBasti86
Geschrieben

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++..

Geschrieben

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"

Geschrieben

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

Geschrieben
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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...