Test Foro de elhacker.net SMF 2.1

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.

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