elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda-C] Vectores y punteros (inicialización dinámica)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda-C] Vectores y punteros (inicialización dinámica)  (Leído 2,136 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
[Ayuda-C] Vectores y punteros (inicialización dinámica)
« 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


« Última modificación: 12 Noviembre 2014, 21:33 pm por Miky Gonzalez » En línea

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


EN CONSTRUCCIÓN
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
« Respuesta #1 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.


En línea

Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
« Respuesta #2 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. }
En línea

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


EN CONSTRUCCIÓN
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
« Respuesta #3 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.
En línea

Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: [Ayuda-C] Vectores y punteros (inicialización dinámica)
« Respuesta #4 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.
En línea

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


EN CONSTRUCCIÓN
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda en búsqueda en vectores de punteros en C
Programación C/C++
megamole 4 3,080 Último mensaje 26 Julio 2010, 18:50 pm
por megamole
Uso de matrices o vectores de punteros
Programación C/C++
novalida 1 12,150 Último mensaje 16 Marzo 2011, 01:19 am
por Don Pollo
Crear dos vectores de punteros en java
Java
Cooltan 5 8,017 Último mensaje 12 Abril 2011, 16:52 pm
por zepheon
Diferencia entre usar aritmetica de punteros y corchetes en vectores en C
Programación C/C++
xoker 4 3,089 Último mensaje 26 Diciembre 2013, 13:27 pm
por ivancea96
Array de estructura (struct) typedef y punteros[C]. « 1 2 »
Programación C/C++
DanielPy 17 11,589 Último mensaje 26 Mayo 2015, 01:00 am
por normaaaaaaaa
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines