La función recursiva no devuelve el valor especificado

3 minutos de lectura

Estoy tratando de depurar una función recursiva utilizada para validar la entrada del usuario y devolver un valor cuando la entrada está bien. La función se ve así:

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;
    }
}

El método set_price() de Bienes la clase se ve de la siguiente manera

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

Intenté dibujar el problema en un papel, pero todos mis diagramas parecen tener el aspecto que ya tiene mi función. Creo que hay algunos problemas con las devoluciones, pero no sé dónde.

La ayuda sería muy apreciada.

  • ¿Dónde crees que está el resultado recurrente de load_price(); ¿va?

    – WhozCraig

    29 de diciembre de 2014 a las 15:25

  • no, repito noutilice punteros y new aquí. No tiene ningún sentido y en realidad introduce una fuga de memoria en su código.

    – Konrad Rodolfo

    29 de diciembre de 2014 a las 15:26

  • @WhozCraig Sinceramente, no tengo ni idea. Parece estar enterrado en algún lugar dentro de la función misma.

    – Andrés

    29 de diciembre de 2014 a las 15:28

  • @KonradRudolph Gracias por la sugerencia, m8, reemplazó el objeto Bienes en el montón con un objeto de pila.

    – Andrés

    29 de diciembre de 2014 a las 15:29

  • @WhozCraig: La respuesta correcta es: en ningún lugar.

    – Carreras de ligereza en órbita

    29 de diciembre de 2014 a las 17:11

No está utilizando el valor de retorno de la llamada recursiva. Necesitas hacer:

return load_price();

  • Será mi precio de devolución; ser reemplazado con dicho código, Barmar?

    – Andrés

    29 de diciembre de 2014 a las 15:26

  • @OndřejŠimon No, todas sus llamadas recursivas deben reemplazarse.

    – Capitán Jirafa

    29 de diciembre de 2014 a las 15:28

  • @CaptainGiraffe Oh, ya veo, reemplazando la llamada recursiva load_price() con return load_price(); como Barmar recomendó funcionó. Gracias chicos.

    – Andrés

    29 de diciembre de 2014 a las 15:31

La funcion recursiva no devuelve el valor especificado
Hans Klünder

¿Quién te convenció de usar la recursividad para ese problema?

#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;
   }
}

  • Gracias por la solución iterativa. Para ser honesto, estaba tratando de encontrar uno, pero no podía entenderlo. Usaré el tuyo, si no te importa. Realmente no me gusta la recursividad, simplemente no pude encontrar la solución iterativa.

    – Andrés

    29 de diciembre de 2014 a las 15:50

  • Por supuesto, siéntete libre de usarlo. No publicaré nada aquí si no quiero que la gente lo use.

    – Hans Klünder

    29 de diciembre de 2014 a las 15:52

  • Gracias una vez más, Hans. Modifiqué mis otros 2 métodos recursivos usando su plantilla, métodos que usé para verificar la ID insertada y la cantidad de Bienes.

    – Andrés

    29 de diciembre de 2014 a las 16:04


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad