Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: evilraziel en 2 Abril 2014, 16:32 pm



Título: puntero, funcion recursiva y segmentation fault
Publicado por: evilraziel en 2 Abril 2014, 16:32 pm
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);
      
}


Título: Re: puntero, funcion recursiva y segmentation fault
Publicado por: eferion en 2 Abril 2014, 16:45 pm
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.

Código
  1. rfib(fib++,x++,last);

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

Código
  1. rfib( fib, x, last );
  2. fib++;
  3. x++;

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

Además, en tu ejemplo pasas:

Código
  1. rfib(s,0,s);

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

Código
  1. if( fib+1 != last )

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

Código
  1. if ( fib != last )

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


Título: Re: puntero, funcion recursiva y segmentation fault
Publicado por: evilraziel en 2 Abril 2014, 18:53 pm
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!


Título: Re: puntero, funcion recursiva y segmentation fault
Publicado por: noele1995 en 2 Abril 2014, 20:28 pm
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
  1. int main()
  2. {
  3. int x = 10;
  4.                     //Imprime:
  5. func(x);     // 10
  6. cout << endl;
  7.  
  8. func(x++);   // 10
  9. func(x);     // 11
  10. cout << endl;
  11.  
  12. func(++x);   // 12
  13. func(x);     // 12
  14. cout << endl;
  15.        return 0;
  16. }
  17.  
  18. void func(int x)
  19. {
  20. cout << x << endl;
  21. }

Saludos


Título: Re: puntero, funcion recursiva y segmentation fault
Publicado por: amchacon en 3 Abril 2014, 02:13 am
En las llamadas a función es mejor poner +1

Asi te quitas de ambiguedades y errores tontos. Además escribes lo mismo.