Discussion:
Struct y Realloc
(demasiado antiguo para responder)
Evilgirl
2006-10-15 19:43:30 UTC
Permalink
Hola a todos, tengo un problema con estructuras y el asignarles memoria
dinamicamente, el programa funciona asi:

Yo declaro este tipo de estructura:

typedef struct tabla{
int a;
int b;
}tabla;


Y tengo una funcion que me sirve para agregar nuevos elementos a esta
tabla:

void agregar(tabla **apunt,int *tam,int e1,int e2){

*tam=*tam+1;
apunt=(tabla **)realloc(apunt,((*tam)+1)*sizeof(tabla));

(*apunt)->a=e1;
(*apunt)->b=e2;
*tam=*tam+1;
}

En main yo declaro la variable
tabla *t;
la inicializo mas delante
t=(tabla *)malloc(sizeof(tabla));

llamo a la funcion agregar
agregar(&t,&tam,1,2);

El problema es que la funcion en vez de agregar los datos a la
estructura, solo reescribe el dato anterior, asi que no importa cuantas
veces mande llamar a la funcion, la estructura siempre tiene el ultimo
valor agregado :(
Se que es problema del apuntador, tengo que moverlo, pero creo que ya
me estoy bloqueando y no puedo verlo, podria alguien ayudarme??? Se los
agradecere mucho.

Buen Dia!
Luis Angel Fdez. Fdez.
2006-10-15 20:36:14 UTC
Permalink
A las 19:43 del domingo 15 de octubre,
Evilgirl <***@gmail.com>
hablando de Struct y Realloc
en es.comp.lenguajes.c dijo...
Post by Evilgirl
Hola a todos, tengo un problema con estructuras y el asignarles
typedef struct tabla{
int a;
int b;
}tabla;
Y tengo una funcion que me sirve para agregar nuevos elementos
Voy a obviar el tratamiento de errores, pero ten en cuenta que
deberías (como poco :)) controlar que malloc y realloc
devuelven lo que esperas que devuelvan.
Post by Evilgirl
void agregar(tabla **apunt,int *tam,int e1,int e2){
*tam=*tam+1;
apunt=(tabla **)realloc(apunt,((*tam)+1)*sizeof(tabla));
Si no me equivoco, debería ser:

*apunt = (tabla **)realloc(*apunt, ((*tam)*sizeof(tabla));
Post by Evilgirl
(*apunt)->a=e1;
(*apunt)->b=e2;
Es normal que reescribas el primer dato, ya que con esas líneas
es lo que estás haciendo;

Es posible que con (*apunt+tam-1)->a = e1; y
(*apunt+tam-1)->b=e2; quede mejor aunque ahora mismo no estoy
seguro :( (con tanto asterisco me lio :-P).
Post by Evilgirl
*tam=*tam+1;
¿Te gusta sumar uno, no? ;-) Si lo sumas al entrar en la
función ya no necesitas sumarlo aquí.
Post by Evilgirl
}
En main yo declaro la variable
tabla *t;
la inicializo mas delante
t=(tabla *)malloc(sizeof(tabla));
llamo a la funcion agregar
agregar(&t,&tam,1,2);
El problema es que la funcion en vez de agregar los datos a la
estructura, solo reescribe el dato anterior, asi que no importa cuantas
veces mande llamar a la funcion, la estructura siempre tiene el ultimo
valor agregado :(
Se que es problema del apuntador, tengo que moverlo, pero creo que ya
me estoy bloqueando y no puedo verlo, podria alguien ayudarme??? Se los
agradecere mucho.
Bueno, espero que sirva de algo (y que no me haya equivocado).

Hala, a seguir viendo House :)

Ta llueu
--
Slackware 11.0.0 (x86_64) (kernel 2.6.18 x86_64)
AMD Athlon(tm) 64 Processor 3200+ (2200.143 MHz) up 12:00, 8 users
HT: C.D. Arrancatapinos (488047) VI.759 # http://muxin.no-ip.org/
SK: C.D. Arrancatapinos (18088) IV.57 # http://muxin.yi.org/
Evilgirl
2006-10-15 21:26:45 UTC
Permalink
Hola, muchas gracias por responder, hice los cambios que me sugeriste
pero sigue ocurriendo lo mismo, es necesario recorrer ese apuntador y
no es valido hacer esto:
(*apunt+tam-1)->a = e1;

Alguna otra idea?
Post by Luis Angel Fdez. Fdez.
A las 19:43 del domingo 15 de octubre,
hablando de Struct y Realloc
en es.comp.lenguajes.c dijo...
Post by Evilgirl
Hola a todos, tengo un problema con estructuras y el asignarles
typedef struct tabla{
int a;
int b;
}tabla;
Y tengo una funcion que me sirve para agregar nuevos elementos
Voy a obviar el tratamiento de errores, pero ten en cuenta que
deberías (como poco :)) controlar que malloc y realloc
devuelven lo que esperas que devuelvan.
Post by Evilgirl
void agregar(tabla **apunt,int *tam,int e1,int e2){
*tam=*tam+1;
apunt=(tabla **)realloc(apunt,((*tam)+1)*sizeof(tabla));
*apunt = (tabla **)realloc(*apunt, ((*tam)*sizeof(tabla));
Post by Evilgirl
(*apunt)->a=e1;
(*apunt)->b=e2;
Es normal que reescribas el primer dato, ya que con esas líneas
es lo que estás haciendo;
Es posible que con (*apunt+tam-1)->a = e1; y
(*apunt+tam-1)->b=e2; quede mejor aunque ahora mismo no estoy
seguro :( (con tanto asterisco me lio :-P).
Post by Evilgirl
*tam=*tam+1;
¿Te gusta sumar uno, no? ;-) Si lo sumas al entrar en la
función ya no necesitas sumarlo aquí.
Post by Evilgirl
}
En main yo declaro la variable
tabla *t;
la inicializo mas delante
t=(tabla *)malloc(sizeof(tabla));
llamo a la funcion agregar
agregar(&t,&tam,1,2);
El problema es que la funcion en vez de agregar los datos a la
estructura, solo reescribe el dato anterior, asi que no importa cuantas
veces mande llamar a la funcion, la estructura siempre tiene el ultimo
valor agregado :(
Se que es problema del apuntador, tengo que moverlo, pero creo que ya
me estoy bloqueando y no puedo verlo, podria alguien ayudarme??? Se los
agradecere mucho.
Bueno, espero que sirva de algo (y que no me haya equivocado).
Hala, a seguir viendo House :)
Ta llueu
--
Slackware 11.0.0 (x86_64) (kernel 2.6.18 x86_64)
AMD Athlon(tm) 64 Processor 3200+ (2200.143 MHz) up 12:00, 8 users
HT: C.D. Arrancatapinos (488047) VI.759 # http://muxin.no-ip.org/
SK: C.D. Arrancatapinos (18088) IV.57 # http://muxin.yi.org/
Luis Angel Fdez. Fdez.
2006-10-16 07:52:43 UTC
Permalink
A las 21:26 del domingo 15 de octubre,
Evilgirl <***@gmail.com>
hablando de Re: Struct y Realloc
en es.comp.lenguajes.c dijo...
Post by Evilgirl
Hola, muchas gracias por responder, hice los cambios que me sugeriste
pero sigue ocurriendo lo mismo, es necesario recorrer ese apuntador y
(*apunt+tam-1)->a = e1;
Vale, ahí me colé... sería (*apunt+*tam-1)->a = e1;

Bueno, estuve probando y debería ser (*apunt+*tam-2)->a = e1
por el orden de las instrucciones. Está claro que debería estar
programado de otra manera, pero a modo de ejemplo supongo que
puede servir.

¿Que quieres decir con que es necesario recorrer el apuntador?
Con (*apunt+*tam-2)->a = e1 estarías, en principio, modificando
la última posición libre de la tabla.

Ta llueu
--
Slackware 11.0.0 (x86_64) (kernel 2.6.18 x86_64)
AMD Athlon(tm) 64 Processor 3200+ (2200.143 MHz) up 23:16, 7 users
HT: C.D. Arrancatapinos (488047) VI.759 # http://muxin.no-ip.org/
SK: C.D. Arrancatapinos (18088) IV.57 # http://muxin.yi.org/
Evilgirl
2006-10-16 19:25:54 UTC
Permalink
Muchas gracias por la ayuda, corregi el error de como moverse con el
apuntador, aqui esta el codigo final que ya funciona:

void agregar(tabla **apunt,int *tam,int e1,int e2){


*apunt=(tabla **)realloc(*apunt,((*tam)+1)*sizeof(tabla));

(*apunt+*tam-1)->ei=e1;
(*apunt+*tam-1)->ef=e2;

*tam=*tam+1;

}

Saludos
Post by Luis Angel Fdez. Fdez.
A las 21:26 del domingo 15 de octubre,
hablando de Re: Struct y Realloc
en es.comp.lenguajes.c dijo...
Post by Evilgirl
Hola, muchas gracias por responder, hice los cambios que me sugeriste
pero sigue ocurriendo lo mismo, es necesario recorrer ese apuntador y
(*apunt+tam-1)->a = e1;
Vale, ahí me colé... sería (*apunt+*tam-1)->a = e1;
Bueno, estuve probando y debería ser (*apunt+*tam-2)->a = e1
por el orden de las instrucciones. Está claro que debería estar
programado de otra manera, pero a modo de ejemplo supongo que
puede servir.
¿Que quieres decir con que es necesario recorrer el apuntador?
Con (*apunt+*tam-2)->a = e1 estarías, en principio, modificando
la última posición libre de la tabla.
Ta llueu
--
Slackware 11.0.0 (x86_64) (kernel 2.6.18 x86_64)
AMD Athlon(tm) 64 Processor 3200+ (2200.143 MHz) up 23:16, 7 users
HT: C.D. Arrancatapinos (488047) VI.759 # http://muxin.no-ip.org/
SK: C.D. Arrancatapinos (18088) IV.57 # http://muxin.yi.org/
Loading...