Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.

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.

@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

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

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

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"

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

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.