/ / Recibo "Falla de segmentación" sin utilizar punteros. ¿Qué está pasando? - c ++, recursividad, falla de segmentación

Estoy recibiendo "Falla de segmentación" sin usar punteros. ¿Que esta pasando? - C ++, recursión, falla de segmentación.

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 № 1

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