RESUELTO: El segfault fue causado por infinito (bueno, no actualmente infinito) recursividad. La recursión infinita tuvo lugar en mi uint pow(uint a, uint b)
función y su función auxiliar cuando olvidé dar cuenta del caso b = 0
. Cuando b = 0
, b
disminuirá, envolviéndolo alrededor del unsigned int
limitar, y luego seguir agregando pilas hasta b
vuelve a 1.
Gracias @chris por ayudar con la depuración, y @vsoftco por sugerir una recursión infinita.
Soy bastante nuevo en C ++. Estoy escribiendo un programa que tiene 4 funciones y 3 de ellas son recursivas (sospecho que las funciones recursivas pertenecen a este problema).
Esencialmente, sé que me encuentro con un segfault cuando llego a la siguiente línea de código:
uint right = (n % pow(10, i)) / pow(10, i - 1);
Este código está dentro del bucle for de mi bool isPalindrome(uint)
función. Esta es la única información que tengo relativa a la segfault.
He intentado buscar ejemplos por defecto en stackoverflow y google, pero no encuentro ninguno que no lo hagas pertenecen a punteros y cosas por el estilo.
¿Qué está pasando mal aquí? Cualquier ayuda será muy apreciada. Además, explique cualquier sugerencia que haga, ya que soy bastante nuevo en C ++ y tengo la intención de aprender todo lo que pueda. Sigue todo el código fuente, que supongo es invaluable para este problema.
/*
* AUTHORS: Thomas D. Fischer (a.k.a. gragas)
* CREATION DATE: ----:--:-- (YY:MM:DD)
*/
#include <iostream>
#include <time.h>
using namespace std;
typedef unsigned int uint;
bool isPalindrome(uint);
uint length(uint, uint count = 0);
uint pow(uint, uint);
uint powhelper(uint, uint, uint);
int main()
{
clock_t start_time = clock();
cout << "Running program..." << endl;
cout << isPalindrome(12) << endl;
cout << "Execution Time: " << double(clock() - start_time)/CLOCKS_PER_SEC;
}
bool isPalindrome(uint n)
{
for(uint i = 1; i <= length(n)/2; i++)
{
uint left = (n / pow(10, length(n) - i)) % 10;
uint right = (n % pow(10, i)) / pow(10, i - 1);
if( left != right )
return false;
}
return true;
}
uint length(uint n, uint count)
{
if(n != 0)
return length(n /= 10, ++count);
else
return count;
}
uint pow(uint a, uint b)
{
if(b != 1)
return powhelper(a*a, --b, a);
else
return a;
}
uint powhelper(uint a, uint b, uint multiplier)
{
if(b != 1)
return powhelper(a*multiplier, --b, multiplier);
else
return a;
}
Respuestas
3 para la respuesta № 1Su función pow () no maneja el caso donde b = 0. Esto ocurre en la primera iteración del bucle (encontré insertando un par de impresiones de depuración).
En ese caso, --b se desborda y se convierte en un número muy grande, lo que hace que la recursión desborde la pila.
El segfault proviene del desbordamiento de la pila del programa.
2 para la respuesta № 2
Tu pow
la función no maneja correctamente un exponente de 0
, que pasa en la línea en cuestión durante la primera iteración del bucle. ¿Ha considerado usar std::pow
?
Para elaborar más, decrementa el exponente de cero cuando llama a powhelper
. Esto está bien definido como módulo aritmético, por lo que terminará con un número muy grande, lo que casi con seguridad causará un desbordamiento de la pila.