GGT Berechnung scheitert in Schleife.



  • Wenn du bei deinem Compiler die Warnstufen hoch drehst, wird er dir sagen, dass in deinen Funktionen kein Wert zurückgegeben wird (es fehlt eben ein return).

    Die Funktion sollte selber natürlich auch nichts ausgeben.



  • huwul schrieb:

    okay soweit so gut, das Problem was ich dabei aber habe ist in folgendem Quelltext:

    Du hast das return vergessen.

    Das ist ein Thema, was grundlegend für die Arbeit mit Funktionen ist. Du arbeitest gerade mit Rekursion, was schon fortgeschritten ist. Mit anderen Worten, du schleppst ein ziemliches Defizit mit dir herum!

    Ich korrigiere deinen Code mal:

    int fak(int zahl)
    {
        //int ergebnis;  -- Brauchen wir nicht
    
        if(zahl==0)
        {
            // Ausgabe wozu?
            // cout << " Ergebnis ist : " << 1 << endl;
            return 1;
        }
        else
        {
            return zahl * fak(zahl-1);
        }
    }
    


  • Deine beiden "Berechnungsfunktionen" geben keinen Wert zurück - Stichwort: return



  • Ja das mit dem return ist mir nebenbei auch aufgefallen, woraufhin ich es auch korrigiert habe, die Variable ergebnis war von einem vorherigen Fehlversuch, die st ebenfalls raus.

    Ist alles auskorrigiert, keine Sorge ich habe kein Defizit was return angeht, ich habs nur grade total übersehen :o

    Nunja beide sowohl GGT und Fakultät funktionieren soweit, jetzt muss ich mich nur noch an den Debugger geben. 👍



  • Wie lässt sich denn der Fakultätsbereich erweitern, sodass ich auch eine Fakultät von 15 berechnen kann?

    der Wertebereich hört nämlich dabei bei 2004310016 auf.
    Und bei einem Unsigned int ist dort auch Ende.
    Double wollte ich eigentlich nicht zulassen, da ja nur natürliche Zahl verwendet werden sollten, weshalb ich auch die if's noch abändern muss.



  • Ohne eine externe Lib (z.B. BigNum) kannst du als Datentyp nur "unsigned long long" verwenden (aber auch dann geht die Fakultät nur bis ca. 21 [bei 64bit])).

    Schau auch mal in http://www.c-plusplus.net/forum/259339 rein (geht auch um Fakultät).



  • Habt ihr vielleicht noch eine Idee wie ich im Debugger für jede Rekursion den Backtrace ausgeben kann?

    ich weiß, dass backtrace im gdb ein befehl ist, allerdings zeigt er mir immer an "No Stack" und hab mir grade schon ein paar Tutorials angeschaut, die mich aber bezüglich des Backtrace nicht schlauer machen.

    Ich muss quasi bei jedem Aufruf den Stack ausgeben.



  • Wenn das Programm im Debugger läuft und an einem Breakpoint angehalten hat, solltest du auch einen Baktrace erhalten.



  • Das Problem ist, dass kein Breakpoint da ist, ich kann das Programm starten, dann läuft es halt durch und danach kann ich keinen Backtrace mehr erhalten " NO Stack"

    Und Breakpoint setzen kann ich z.b. für die Fakultätsfunktion warum auch immer nicht.



  • huwul schrieb:

    Das Problem ist, dass kein Breakpoint da ist, ich kann das Programm starten, dann läuft es halt durch und danach kann ich keinen Backtrace mehr erhalten " NO Stack"

    backtrace gibt den Stack von der aktuellen Stelle aus. Wenn du das Programm bis zum Ende durchlaufen lassen hast, ist er natürlich leer.

    Und Breakpoint setzen kann ich z.b. für die Fakultätsfunktion warum auch immer nicht.

    break fak
    Falls das nicht geht, hast du vielleicht ohne Debugsymbole gebaut? gcc -g



  • das geht b fak.

    Habe mit g++ und ohne -g gearbeitet. Allerdings ist die Aufgabenstellung dass Quasi jedesmal wo die Fakultät einen Schritt macht der Backtrace angegeben werden sollte.



  • huwul schrieb:

    das geht b fak.

    Habe mit g++ und ohne -g gearbeitet. Allerdings ist die Aufgabenstellung dass Quasi jedesmal wo die Fakultät einen Schritt macht der Backtrace angegeben werden sollte.

    Die Aufgabenstellung hat zum Ziel, dass du dich mit dem gdb vertraut machst. Das solltest du dann auch tun.


Anmelden zum Antworten