puntero, funcion recursiva y segmentation fault

Iniciado por evilraziel, 2 Abril 2014, 16:32 PM

0 Miembros y 1 Visitante están viendo este tema.

evilraziel

Hola a todos, este es mi primer post asi que mucho gusto de participar en esta comunidad! :D :laugh: ;-)

Bueno al grano, tengo un codigo en c que me devuelve un segmentation fault. Se que es problema de reservar memoria pero no sé cuando ni como. Agradeceria mucho que alguien me explicara por que pasa:

el codigo calcula fibonacci recursivamente, no hagais caso de la llamada, pensad que los valores se entran correctamente.
llamada  del main:
.
.
.
int *s
rfib(s,0,s);

void rfib(int *fib, int x, int *last)
{
   if (x==0){
      *fib=0;
   }
   if (x==1)
      *fib=1;
   else if (x>1)
         *fib=fib[-1]+fib[-2];
   
   if (fib+1!=last)
      rfib(fib++,x++,last);
      
}

eferion

#1
Bienvenido al foro.

Primera lección: El código etiquétalo con las etiquetas GeSHi correspondientes... así aparecerá coloreado y con un formato más legible.

rfib(fib++,x++,last);

Eso son postincrementos... es decir, es equivalente a:


rfib( fib, x, last );
fib++;
x++;


Vamos que estás haciendo la misma llamada todo el tiempo.

Además, en tu ejemplo pasas:

rfib(s,0,s);

Es decir, fib == last, luego...

if( fib+1 != last )

va a ser siempre cierto... más bien debería ser

if ( fib != last )

PD.: parto de la base de que *s está debidamente inicializado.
Un saludo.

evilraziel

Muchas gracias! no sabes las vueltas que le he dado al codigo y no me había fijado en que no se pueden pasar parametros tipo x++ a una funcion  ;D ;D

Repito muchisimas gracias!


nos vemos pronto, 1 saludo!

noele1995

Bueno x++ lo que va a hacer es incrementar despues de la llamada a la funcion, pero podrias llamar a la funcion con ++x, que incrementaria antes de la llamada.
Código (cpp) [Seleccionar]
int main()
{
int x = 10;
                     //Imprime:
func(x);     // 10
cout << endl;

func(x++);   // 10
func(x);     // 11
cout << endl;

func(++x);   // 12
func(x);     // 12
cout << endl;
        return 0;
}

void func(int x)
{
cout << x << endl;
}


Saludos

amchacon

En las llamadas a función es mejor poner +1

Asi te quitas de ambiguedades y errores tontos. Además escribes lo mismo.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar