[Ayuda-C] Vectores y punteros (inicialización dinámica)

Iniciado por Miky Gonzalez, 12 Noviembre 2014, 20:54 PM

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

Miky Gonzalez

Para el uso más cómodo de un programa en la creación de un simulador físico que requiere el uso de muchos vectores se me ha ocurrido crear una libreria para el manejo de los vectores. Comienzo definiendo la siguiente estructura:

typedef struct _vectf {
float *data;
int cap;
} vectf;


Entonces para la creación del vector uso:

vectf v;

Y creo una función que inicialice el vector (reservar memoria y ajustar elementos):

int init_vectorf(vectf *vectorf, int capacity) {
vectorf->data = malloc(capacity * sizeof(float));
if(!vectorf->data)
return 0;

vectorf->cap = sizeof(vectorf->data) / sizeof(vectorf->data[0]);
//vectorf->cap = capacity;
printf("sizeof(float) = %ld\n", sizeof(float));
printf("Inicializado vectorf de tamano: %d (%d elementos).", (int)sizeof(vectorf->data), sizeof(vectorf->data) / sizeof(vectorf->data[0]));

return 1;
}


En este paso se encuentra mi problema. Explicaré la idea del código para un mejor entendimiento:
1. Se reserva memoria para (n_elementos * tamaño_dato), esto es, si yo declaro:

init_vectorf(&vectorf, 3);

el cálculo sería: (3 * sizeof(float)), es decir, 3 elementos * 4 bytes = 12 bytes.

Cuando se hace la operación: vectorf->cap = sizeof(vectorf->data) / sizeof(vectorf->data[0]); la capacidad se establece a 3, como debería: memoria_total / tamaño_dato = 12 bytes / 4 bytes = 3 elementos.

El error viene que justamente despues al mostrarse la información de inicialización del vector escribe el siguiente mensaje en pantalla:

Código (bash) [Seleccionar]
mikygonzalez@public_gpg ~/ $ Inicializado vectorf de tamano: 8 (2 elementos).

¿Alguien puede explicar porqué no me devuelve tamaño 12, 3 elementos?. Seguramente sea un error con los punteros ó el tamaño de datos, pero no soy capaz de localizarlo.

Saludos,
MikyGonzalez
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

ivancea96

data no es una matriz, es un puntero. Sizeof sólo se puede hacer en matrices (Ej. int var[5];, y en otros tipos claro.

Hacerlo sobre un puntero, retornará el tamaño del puntero.

Para hacerlo con memoria dinámica, tendrás que guardar, como ya tienes comentado, el tamaño.

Miky Gonzalez

@ivancea96:

Entonces, una posible solución podría ser (no explicada, pero se entiende bien):

typedef struct _vectf {
float *data;
int size;
} vectf;

int init_vectorf(vectf *vectorf, int capacity) {
vectorf->size = capacity * sizeof(float);
vectorf->data = malloc(vectorf->size);
if(!vectorf->data)
return 0;

printf("[*] Inicializado vectorf de tamano: %d (%d elementos).", vectorf->size, vectorf->size / (int)sizeof(float));

return 1;
}


O ahorrando a la larga algunas operaciones:

typedef struct _vectf {
float *data;
int capacity;
int size;
} vectf;

int init_vectorf(vectf *vectorf, int capacity) {
vectorf->capacity = capacity;
vectorf->size = capacity * sizeof(float);
vectorf->data = malloc(vectorf->size);
if(!vectorf->data)
return 0;

printf("[*] Inicializado vectorf de tamano: %d (%d elementos).", vectorf->size, capacity);

return 1;
}
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

ivancea96

Posible, y única solución. Bueno, con guardar el numero de elementos llega. Tener 2 variables podría hacer menos estable la estructura (por ejemplo, si te olvidas de cambiar uno de los valores)

Pero bueno, el tema en sí es ese.

Miky Gonzalez

Muchas gracias por la ayuda, alfinal el pensar si decidir sobre el rendimiento sobre la estabilidad es cosa del programador.

Marco el tema como resuelto.

Saludos.
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN