Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Miky Gonzalez en 12 Noviembre 2014, 20:54 pm



Título: [Ayuda-C] Vectores y punteros (inicialización dinámica)
Publicado por: Miky Gonzalez en 12 Noviembre 2014, 20:54 pm
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:

Código
  1. typedef struct _vectf {
  2. float *data;
  3. int cap;
  4. } vectf;

Entonces para la creación del vector uso:

Código
  1. vectf v;

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

Código
  1. int init_vectorf(vectf *vectorf, int capacity) {
  2. vectorf->data = malloc(capacity * sizeof(float));
  3. if(!vectorf->data)
  4. return 0;
  5.  
  6. vectorf->cap = sizeof(vectorf->data) / sizeof(vectorf->data[0]);
  7. //vectorf->cap = capacity;
  8. printf("sizeof(float) = %ld\n", sizeof(float));
  9. printf("Inicializado vectorf de tamano: %d (%d elementos).", (int)sizeof(vectorf->data), sizeof(vectorf->data) / sizeof(vectorf->data[0]));
  10.  
  11. return 1;
  12. }

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:

Código
  1. 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:
Código
  1. 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
  1. 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


Título: Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
Publicado por: ivancea96 en 12 Noviembre 2014, 21:08 pm
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.


Título: Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
Publicado por: Miky Gonzalez en 12 Noviembre 2014, 21:24 pm
@ivancea96:

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

Código
  1. typedef struct _vectf {
  2. float *data;
  3. int size;
  4. } vectf;
  5.  
  6. int init_vectorf(vectf *vectorf, int capacity) {
  7. vectorf->size = capacity * sizeof(float);
  8. vectorf->data = malloc(vectorf->size);
  9. if(!vectorf->data)
  10. return 0;
  11.  
  12. printf("[*] Inicializado vectorf de tamano: %d (%d elementos).", vectorf->size, vectorf->size / (int)sizeof(float));
  13.  
  14. return 1;
  15. }

O ahorrando a la larga algunas operaciones:

Código
  1. typedef struct _vectf {
  2. float *data;
  3. int capacity;
  4. int size;
  5. } vectf;
  6.  
  7. int init_vectorf(vectf *vectorf, int capacity) {
  8. vectorf->capacity = capacity;
  9. vectorf->size = capacity * sizeof(float);
  10. vectorf->data = malloc(vectorf->size);
  11. if(!vectorf->data)
  12. return 0;
  13.  
  14. printf("[*] Inicializado vectorf de tamano: %d (%d elementos).", vectorf->size, capacity);
  15.  
  16. return 1;
  17. }


Título: Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
Publicado por: ivancea96 en 12 Noviembre 2014, 21:25 pm
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.


Título: Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
Publicado por: Miky Gonzalez en 12 Noviembre 2014, 21:32 pm
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.