Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SARGE553413 en 7 Agosto 2012, 19:51 pm



Título: Pequeña duda con "realloc" (SOLUCIONADO)
Publicado por: SARGE553413 en 7 Agosto 2012, 19:51 pm
Hola a todos, tengo un problema con la función realloc.

El problema es que al redimensionar un vector de tamaño 3 o más con esta función, los datos que tenía en las componentes 0 y 1 pierden su valor y se convierten en numeros aleatorios raros.

(no estoy seguro de si el problema está en hacer el vector de tamaño>2, o el problema es usar repetidas veces esta función, porque la tengo dentro de un "while")

He probado escribiendolo así:(siendo c el puntero a vector y n un número entero cualquiera).

realloc(c,n*sizeof(int));
(int *) realloc(c,n*sizeof(int));
realloc((int *)  c,n*sizeof(int));

Ninguna de estas formas funciona.
¿Me ayuda alguien por favor?Muchas Gracias.


Título: Re: Pequeña duda con "realloc"
Publicado por: durasno en 7 Agosto 2012, 20:07 pm
Hola! es raro que no te funcione, cualquiera de las 3 formas deberia andar. Seguro estas cometiendo otro error, subi todo el codigo


Saludos

PD: al redimensionar un vector, si este ya tiene datos, no deberia perderse dichos datos


Título: Re: Pequeña duda con "realloc"
Publicado por: SARGE553413 en 7 Agosto 2012, 20:37 pm
Ok, ahí val el código: (está en C a pelo, no C++)

/*********************************
*********************************/
void mini_aleatorio(int **f,int **c,int *tam,int *fila,int *columna)
{
    const int MAX=4;
    int i;
    i=0;
    *fila=rand() % MAX;
    *columna=rand() % MAX;
    while(i<*tam)
    {
        if(((*f)==*fila)&&((*c)==*columna))
        {
            *fila=rand() % MAX;
            *columna=rand() % MAX;
            i=-1;
        }
        i++;
        
    }
    *tam=(*tam)+1;
    realloc((int *) (*f),(*tam)*sizeof(int));
    realloc((int *) (*c),(*tam)*sizeof(int));
    (*f)[(*tam)-1]=*fila;
    (*c)[(*tam)-1]=*columna;
}

bueno ese algoritmo es llamado por otro mas grande, no creo que tenga importancia, lo importante es saber que este algoritmo está metido en un while, por tanto será llamado varias veces.

Gracias de antemano.


Título: Re: Pequeña duda con "realloc"
Publicado por: do-while en 7 Agosto 2012, 22:48 pm
¡Buenas!

Realloc devuelve un puentero al nuevo espacio de memoria asignado, que no tiene porque empezar en la misma posicion de memoria que el puntero original. Si no pudiese reasignar la memoria devolvera NULL y mantendra el puntero original intacto. Por lo tanto tendras que comprobar (como siempre) que la asignacion se ha hecho correctamente:

Código
  1.  
  2. int *ptro,*aux;
  3.  
  4. if(!(ptro = malloc(10 * sizeof(int))))
  5.    printf("Error");
  6. else
  7. {
  8.    if(!(aux = realloc(ptro,20 * sizeof(int)))) //nos aseguramos de que se reasigna la memoria
  9.        printf("Error");
  10.    else
  11.        ptro = aux; //y asignamos al puntero anterior la nueva direccion de memoria
  12. }
  13.  

¡Saludos!


Título: Re: Pequeña duda con "realloc"
Publicado por: SARGE553413 en 8 Agosto 2012, 12:02 pm
Ok gracias por la respuesta, lo intentaré así. :D


Título: Re: Pequeña duda con "realloc"
Publicado por: BlackZeroX en 8 Agosto 2012, 15:15 pm
Para marcar errores tienen el buffer de salida stderr no usen el stdout.

Dulces Lunas!¡.


Título: Re: Pequeña duda con "realloc"
Publicado por: SARGE553413 en 8 Agosto 2012, 22:09 pm
Genial ya funciona muchas gracias por las respuestas, y gracias por el apunte del "stderr", lo he utilizado con fprintf.

Saludos.