Rekursive Funktion gibt angegebenen Wert nicht zurück

Lesezeit: 3 Minuten

Ich versuche, eine rekursive Funktion zu debuggen, die verwendet wird, um Benutzereingaben zu validieren und einen Wert zurückzugeben, wenn die Eingabe in Ordnung ist. Die Funktion sieht so aus:

double load_price()
{
    double price;

    Goods * tempGd = new Goods();

    cin >> price;

    while (!cin)
    {
        cin.clear();
#undef max
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << endl;
        cout << "You didn't enter a number. Do so, please: ";
        cin >> price;
    } // endwhile
    if (!tempGd->set_price(price))
    {
        cout << endl;
        cout << "The price " << red << "must not" << white << " be negative." << endl;
        cout << "Please, insert a new price: ";
        load_price();
    }
    else
    {
        delete tempGd;
        return price;
    }
}

Die Methode set_price() von Waren Klasse sieht wie folgt aus

bool Goods::set_price(double price)
{
    if (price> 0)
    {
        priceSingle_ = price;
        priceTotal_ = price* amount_;
        return true;
    }
    return false;
}

Ich habe versucht, das Problem auf Papier zu zeichnen, aber alle meine Diagramme scheinen so auszusehen, wie meine Funktion bereits aussieht. Ich denke, es gibt einige Probleme mit Rücksendungen, aber ich weiß nicht, wo.

Hilfe wäre sehr willkommen.

  • Wo denken Sie das rekursive Ergebnis load_price(); geht?

    – WhozCraig

    29. Dezember 2014 um 15:25 Uhr

  • Nicht, ich wiederhole nichtverwenden Sie Zeiger und new Hier. Es ist völlig bedeutungslos und führt tatsächlich zu einem Speicherleck in Ihrem Code.

    – Konrad Rudolf

    29. Dezember 2014 um 15:26 Uhr

  • @WhozCraig Ich habe ehrlich gesagt keine Ahnung. Es scheint irgendwo in der Funktion selbst vergraben zu sein.

    – Andreas

    29. Dezember 2014 um 15:28 Uhr

  • @KonradRudolph Danke für den Tipp, m8 hat das Warenobjekt auf dem Haufen durch ein Stapelobjekt ersetzt.

    – Andreas

    29. Dezember 2014 um 15:29 Uhr

  • @WhozCraig: Die richtige Antwort lautet: nirgends.

    – Leichtigkeitsrennen im Orbit

    29. Dezember 2014 um 17:11 Uhr

Sie verwenden nicht den Rückgabewert des rekursiven Aufrufs. Sie müssen Folgendes tun:

return load_price();

  • Soll mein Rücksendepreis; durch besagten Code ersetzt werden, Barmar?

    – Andreas

    29. Dezember 2014 um 15:26 Uhr

  • @OndřejŠimon Nein, alle Ihre rekursiven Aufrufe sollten ersetzt werden.

    – Kapitän Giraffe

    29. Dezember 2014 um 15:28 Uhr

  • @CaptainGiraffe Oh, ich verstehe, ersetze den rekursiven Aufruf load_price() durch return load_price(); wie Barmar empfohlen hat funktioniert. Danke Jungs.

    – Andreas

    29. Dezember 2014 um 15:31 Uhr

Rekursive Funktion gibt angegebenen Wert nicht zuruck
Hans Klünder

Wer hat Sie dazu überredet, Rekursion für dieses Problem zu verwenden?

#undef max
double load_price()
{
   for(;;) {
      double price;
      cin >> price;
      if (!cin)
      {
         cin.clear();
         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
         cout << endl;
         cout << "You didn't enter a number. Do so, please: ";
         continue;
      }
      if (!Goods().set_price(price))
      {
         cout << endl;
         cout << "The price " << red << "must not" << white << " be negative." << endl;
         cout << "Please, insert a new price: ";
         continue;
      }
      return price;
   }
}

  • Danke für die iterative Lösung. Um ehrlich zu sein, habe ich versucht, einen zu finden, konnte mich aber nicht darum kümmern. Ich werde deine benutzen, wenn es dir nichts ausmacht. Ich mag Rekursion nicht wirklich, konnte die iterative Lösung einfach nicht herausfinden.

    – Andreas

    29. Dezember 2014 um 15:50 Uhr

  • Natürlich können Sie es gerne verwenden. Ich werde hier nichts posten, wenn ich nicht möchte, dass die Leute es benutzen.

    – Hans Klünder

    29. Dezember 2014 um 15:52 Uhr

  • Nochmals vielen Dank Hans. Ich habe meine anderen 2 rekursiven Methoden mithilfe Ihrer Vorlage geändert, Methoden, mit denen ich die eingefügte ID und die Menge der Waren überprüft habe.

    – Andreas

    29. Dezember 2014 um 16:04 Uhr


998710cookie-checkRekursive Funktion gibt angegebenen Wert nicht zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy