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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Dimensionar un vector dentro de un struct
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Dimensionar un vector dentro de un struct  (Leído 7,005 veces)
ShadowA7X

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Dimensionar un vector dentro de un struct
« en: 8 Noviembre 2014, 19:32 pm »

Que tal chicos y chicas,disculpen la pregunta pero me puse ante los diversos casos en el manejo de structs y éste (que creo que es básico) no lo puedo hacer.

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct humano{
  4.  
  5. int *trabajos;
  6.  
  7. }persona;
  8.  
  9. int main(){
  10.  
  11. int cantidad_personas=8;
  12. int cantidad_trabajos=4;
  13. persona *primera;
  14. primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
  15.  
  16. /* Hasta este punto por lo que entiendo hice un arreglo dinamico en donde
  17.   ubicamos a la persona en un espacio del arreglo*/
  18.  
  19. //Ahora bien cada persona tendrá más de un trabajo por lo cual el puntero
  20. //trabajo (*trabajos) debemos convertirlo en un vector.
  21.  
  22. return 0;
  23. }

Mi pregunta es ¿cómo hago eso? el *primera que es de tipo persona lo transformamos en un vector dinámico, pero una vez hecho eso ¿Cómo transformo el puntero que ésta dentro de *primera en otro vector?

De antemano muchas gracias.


« Última modificación: 8 Noviembre 2014, 19:41 pm por ShadowA7X » En línea

kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #1 en: 8 Noviembre 2014, 19:59 pm »

¿Cómo transformo el puntero que ésta dentro de *primera en otro vector?

Simple:

Código
  1. primera -> trabajos = malloc(...);

Saludos


En línea

ShadowA7X

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #2 en: 8 Noviembre 2014, 20:13 pm »

Simple:

Código
  1. primera -> trabajos = malloc(...);

Saludos

Por ahí como que funciona pero con errores. Por ejemplo hice esta cosa que tiene que imprimir por pantalla del 1 al 32, pero sólo imprime los últimos 4 números(29,30,31,32) ocho veces.

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct humano{
  4.  
  5. int *trabajos;
  6.  
  7. }persona;
  8.  
  9. int main(){
  10.  
  11. int i,j,cont=1;
  12. int cantidad_personas=8;
  13. int cantidad_trabajos=4;
  14. persona *primera;
  15. primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
  16.  
  17. primera->trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  18.  
  19.  
  20. for (i = 0; i < cantidad_personas; i++){
  21. for (j = 0; j < cantidad_trabajos; j++){
  22.  
  23. primera->trabajos[j]=cont;
  24. cont++;
  25. }
  26. }
  27.  
  28. for (i = 0; i < cantidad_personas; i++){
  29. for (j = 0; j < cantidad_trabajos; j++){
  30.  
  31. printf("%d ",primera->trabajos[j]);
  32. }
  33. printf("\n");
  34. }
  35.  
  36. return 0;
  37. }

Y si le pongo un contador a primera (es decir
Código
  1. primera [i] ->
no me compila :( ) qué pasa?
« Última modificación: 8 Noviembre 2014, 20:18 pm por ShadowA7X » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Dimensionar un vector dentro de un struct
« Respuesta #3 en: 8 Noviembre 2014, 20:33 pm »

No sería primera[ i ]->, porque ya no sería puntero. Sería primera[ i ].trabajos (etc)
« Última modificación: 8 Noviembre 2014, 21:32 pm por ivancea96 » En línea

plataplomo2948

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #4 en: 8 Noviembre 2014, 20:36 pm »

1. Estas usando un puntero doble... por que?

2. El tomano del int siempre va a ser 4 bytes. Por cada persona, hay que allocar otro struct. Si no quiere hacer eso, hay que poner mas variables dentro de su struct.

Trata eso, pra mi funciono

Código:
typedef struct Humano
{
    int Trabajos;          
} HUMANO, *PHUMANO;    
    
int main ()
{
      
       PHUMANO Primera = (PHUMANO)malloc(sizeof(HUMANO));

       Primera->Trabajos = (int)malloc(sizeof(int));
      
       // nunca debe hacer eso por que es allocacion dinamica y eso es un valor estatico pero
      // solo es pra mostrar como funciona
       Primera->Trabajos = 248;

       printf("Primera->Trabajos = %i\n", Primera->Trabajos);
      
       free((int*)Primera->Trabajos);
       free(Primera);
       return 0;
}



Acabo de ver eso, y en ese caso no es necesario usar la alocacion dinamica porque en linea 10 "cont" es un valor estatico. Es decir que ya esta en el stack y la memora ya viene allocada del imagen.

modificacion - disculpe - en linea 11 es la declaracion estatica y en linea 23 pongas un valor dinamica a un valor estatica.


Ok, veo porque usa un puntero doble. Quiere hacer un int array dentro de un struct. Debe hacer asi:

Código:
typedef struct Humano
{
    int* Trabajos;         
} HUMANO, *PHUMANO;   
   
int main ()
{
       // eso coresponde al tomano de su array
       int NumeroDeElementos = 30;
       PHUMANO Primera = (PHUMANO)malloc(sizeof(HUMANO));

       Primera->Trabajos = (int*)malloc(sizeof(int) * NumeroDeElementos);
       
       // nunca debe hacer eso por que es allocacion dinamica y eso es un valor estatico pero
      // solo es pra mostrar como funciona
       Primera->Trabajos[15] = 248;

       printf("Primera->Trabajos = %i\n", Primera->Trabajos[15]);
       
       free((int*)Primera->Trabajos);
       free(Primera);
       return 0;
}



modificaion - se me olvido poner un *
« Última modificación: 8 Noviembre 2014, 22:03 pm por Eternal Idol » En línea

ShadowA7X

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #5 en: 8 Noviembre 2014, 21:13 pm »

Ok, veo porque usa un puntero doble. Quiere hacer un int array dentro de un struct. Debe hacer asi:

Código:
typedef struct Humano
{
    int* Trabajos;          
} HUMANO, *PHUMANO;    
    
int main ()
{
       // eso coresponde al tomano de su array
       int NumeroDeElementos = 30;
       PHUMANO Primera = (PHUMANO)malloc(sizeof(HUMANO));

       Primera->Trabajos = (int*)malloc(sizeof(int) * NumeroDeElementos);
      
       // nunca debe hacer eso por que es allocacion dinamica y eso es un valor estatico pero
      // solo es pra mostrar como funciona
       Primera->Trabajos[15] = 248;

       printf("Primera->Trabajos = %i\n", Primera->Trabajos[15]);
      
       free((int*)Primera->Trabajos);
       free(Primera);
       return 0;
}



modificaion - se me olvido poner un *


Primero muchas gracias por darte el tiempo de sacarme esta duda hermano, en verdad te lo agradezco.

1-Porque el vector de tipo  persona es dinámico y contiene otro vector dinámico en su interior.

2- Pero cada persona será representada por la casilla del vector, y esa casilla/persona tiene asignadas muchas tareas (que en este caso es 4 por ej), según el programa y los for que tengo, puedo moverme por las tareas pero no por las personas (pues no puedo agregar un contador "i" a la persona para irla recorriendo (la idea es no agregar variables al struct y usar lo que está).

Este ejemplo de 32 es sumamente improvisado, es sólo para tener la idea, pero ud que cambiaría para que el programa pueda imprimir del 1 al 32 y que no imprima el 29,30,31 y 32 ocho veces?

Así como ejemplo mi programa está así:

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct humano{
  4.  
  5. int *trabajos;
  6.  
  7. }persona;
  8.  
  9. int main(){
  10.  
  11. int i,j,cont=1;
  12. int cantidad_personas=8;
  13. int cantidad_trabajos=4;
  14. persona *primera;
  15. primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
  16.  
  17. primera->trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  18.  
  19.  
  20. for (i = 0; i < cantidad_personas; i++){
  21. for (j = 0; j < cantidad_trabajos; j++){
  22.  
  23. primera->trabajos[j]=cont;
  24. cont++;
  25. }
  26. }
  27.  
  28. for (i = 0; i < cantidad_personas; i++){
  29. for (j = 0; j < cantidad_trabajos; j++){
  30.  
  31. printf("%d ",primera->trabajos[j]);
  32. }
  33. printf("\n");
  34. }
  35.  
  36. return 0;
  37. }

Y en un mundo ideal, lo que yo quiero es que avance por las personas y los trabajos así (aclaro este no compila pero si compilara haría lo que yo quiero(bajo una logica algoritmica)):

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct humano{
  4.  
  5. int *trabajos;
  6.  
  7. }persona;
  8.  
  9. int main(){
  10.  
  11. int i,j,cont=1;
  12. int cantidad_personas=8;
  13. int cantidad_trabajos=4;
  14. persona *primera;
  15. primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
  16.  
  17. primera->trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  18.  
  19.  
  20. for (i = 0; i < cantidad_personas; i++){
  21. for (j = 0; j < cantidad_trabajos; j++){
  22.  
  23. primera[i]->trabajos[j]=cont;
  24. cont++;
  25. }
  26. }
  27.  
  28. for (i = 0; i < cantidad_personas; i++){
  29. for (j = 0; j < cantidad_trabajos; j++){
  30.  
  31. printf("%d ",primera[i]->trabajos[j]);
  32. }
  33. printf("\n");
  34. }
  35.  
  36. return 0;
  37. }


Ud cómo le haría/modificaría tomando en cuenta el mismo ejemplo que le muestro?
En línea

plataplomo2948

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #6 en: 8 Noviembre 2014, 21:54 pm »

Bueno, me parece que usted sabe de lo que habla aun que no entiendo exactamente cual es su objectivo final, pero eso es como hacer el codigo para que compila bien. Eso imprima hasta 32.

La proxima vez, deberia poner su error de compilicaion y decir que quiere hacer "un array de int dentro de un array de struct" : ) suerte

Código:
typedef struct Humano
{
    int* Trabajos;          
} HUMANO, *PHUMANO;    
    
int main ()
{
       int CantidadDeTrabajos = 4; //
       int CantidadDePersonas = 8;    // personas
       int Cont = 0;
      
       // declarar espacio por un array de struct
       PHUMANO Primera = (PHUMANO)malloc(sizeof(HUMANO) * CantidadDePersonas);
      
       // por cada persona, declara un array dentro el struct
       for (int i = 0; i < CantidadDePersonas; i++)
           Primera[i].Trabajos = (int*)malloc(sizeof(int) * CantidadDeTrabajos);
      
       for (int i = 0; i < CantidadDePersonas; i++)
       {
           for (int j = 0; j < CantidadDeTrabajos; j++)
           {
               Cont += 1;
                  
               Primera[i].Trabajos[j] = Cont;
           }    
       }
      
       for (int i = 0; i < CantidadDePersonas; i++)
           for (int j = 0; j < CantidadDeTrabajos; j++)
               printf("Trabajo#%i\n", Primera[i].Trabajos[j]);
              
              
       //Primera[0].Trabajos[0] = 248;

       //printf("Primera->Trabajos = %i\n", Primera[0].Trabajos[0]);
      
      
       for (int i = 0; i < CantidadDePersonas; i++)
           free((int*)Primera[i].Trabajos);
      
       free(Primera);
       _getch ();
       return 0;
}


Modificacion - Al respecto a 1 - no estamos trabajando con los vectores, estos son arrayes (son parecidos pero hay diferencias). Todavia si estariamos trabajando con vectores, la alocacion dinamica no seria necesario por ese codigo. Tambien, los vectores son de C++, asi que si quiere usar vectores - seria mejor usar new/delete en vez de malloc/free (eso no va a cambiar el comportamiento de su programa, solo para notar la diferencia entre C y C++ y por que no es mejor practica a mezclarlos).

Generalmente, la alocacion dinamica es necesario solo cuando acepta algun tipo de input, sea de un archivo, stdin, socket, etc. Cuando hace un inicilizacion estatica (int i = 0), esa secion de memoria (los 4 bytes) SIEMPRE va a ser libre para manipular, si o si. 
« Última modificación: 8 Noviembre 2014, 22:12 pm por plataplomo2948 » En línea

ShadowA7X

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #7 en: 8 Noviembre 2014, 23:18 pm »

Bueno, me parece que usted sabe de lo que habla aun que no entiendo exactamente cual es su objectivo final, pero eso es como hacer el codigo para que compila bien. Eso imprima hasta 32.

La proxima vez, deberia poner su error de compilicaion y decir que quiere hacer "un array de int dentro de un array de struct" : ) suerte

Código:
typedef struct Humano
{
    int* Trabajos;          
} HUMANO, *PHUMANO;    
    
int main ()
{
       int CantidadDeTrabajos = 4; //
       int CantidadDePersonas = 8;    // personas
       int Cont = 0;
      
       // declarar espacio por un array de struct
       PHUMANO Primera = (PHUMANO)malloc(sizeof(HUMANO) * CantidadDePersonas);
      
       // por cada persona, declara un array dentro el struct
       for (int i = 0; i < CantidadDePersonas; i++)
           Primera[i].Trabajos = (int*)malloc(sizeof(int) * CantidadDeTrabajos);
      
       for (int i = 0; i < CantidadDePersonas; i++)
       {
           for (int j = 0; j < CantidadDeTrabajos; j++)
           {
               Cont += 1;
                  
               Primera[i].Trabajos[j] = Cont;
           }    
       }
      
       for (int i = 0; i < CantidadDePersonas; i++)
           for (int j = 0; j < CantidadDeTrabajos; j++)
               printf("Trabajo#%i\n", Primera[i].Trabajos[j]);
              
              
       //Primera[0].Trabajos[0] = 248;

       //printf("Primera->Trabajos = %i\n", Primera[0].Trabajos[0]);
      
      
       for (int i = 0; i < CantidadDePersonas; i++)
           free((int*)Primera[i].Trabajos);
      
       free(Primera);
       _getch ();
       return 0;
}


Modificacion - Al respecto a 1 - no estamos trabajando con los vectores, estos son arrayes (son parecidos pero hay diferencias). Todavia si estariamos trabajando con vectores, la alocacion dinamica no seria necesario por ese codigo. Tambien, los vectores son de C++, asi que si quiere usar vectores - seria mejor usar new/delete en vez de malloc/free (eso no va a cambiar el comportamiento de su programa, solo para notar la diferencia entre C y C++ y por que no es mejor practica a mezclarlos).

Generalmente, la alocacion dinamica es necesario solo cuando acepta algun tipo de input, sea de un archivo, stdin, socket, etc. Cuando hace un inicilizacion estatica (int i = 0), esa secion de memoria (los 4 bytes) SIEMPRE va a ser libre para manipular, si o si. 

Hermano, no sabes como te lo hipermegacontramuchoAGRADESCO!!! gracias a lo que hiciste entendí perfectamente que era lo que me hacía falta. Adapte lo que tu hiciste a mi código y mi error fundamental salió a la luz!! lo dejo aquí para que quien tenga éste problema pueda solucinarlo:

Mi código modificado según las apreciaciones de plataplomo2948 es éste:

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct humano{
  4.  
  5. int *trabajos;
  6.  
  7. }persona;
  8.  
  9. int main(){
  10.  
  11. int i,j,cont=1;
  12. int cantidad_personas=8;
  13. int cantidad_trabajos=4;
  14. persona *primera;
  15. primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
  16.  
  17.  
  18. for (i=0; i < cantidad_personas; i++){
  19. primera[i].trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  20. }
  21.  
  22.  
  23. for (i = 0; i < cantidad_personas; i++){
  24. for (j = 0; j < cantidad_trabajos; j++){
  25.  
  26. primera[i].trabajos[j]=cont;
  27. cont++;
  28. }
  29. }
  30.  
  31. for (i = 0; i < cantidad_personas; i++){
  32. for (j = 0; j < cantidad_trabajos; j++){
  33.  
  34. printf("%d ",primera[i].trabajos[j]);
  35. }
  36. printf("\n");
  37. }
  38.  
  39. for (i = 0; i < cantidad_personas; i++){
  40.  
  41. free((int *) primera[i].trabajos);
  42. }
  43.  
  44. free(primera);
  45.  
  46. return 0;
  47. }

Y él error fundamental que me permite ver toda la lógica de ésto era en ésta parte:

Código
  1. for (i=0; i < cantidad_personas; i++){
  2. primera[i].trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
  3. }

Al momento de dimensionar esa parte nunca se me ocurrió hacerlo dentro de un for, y bajo lo que ahora al fin entendí (corrijame plataplomo2948 si estoy equivocado) es obligación dimensionar cada espacio de primera en consideración a la cantidad de trabajos que haya.

El código compila perfectamente y puedo dar por solucionada mi duda. Enserio  plataplomo2948 infinitas gracias, ahora puedo hacer lo que realmente quiero :).

Por último si me permites molestarte, en la parte donde liberas memoria:

Código
  1. for (int i = 0; i < CantidadDePersonas; i++)
  2.           free((int*)Primera[i].Trabajos);

por qué se pone (int *) dentro del free y no sólo
Código
  1. free(Primera[i].trabajos)?

Sólo esa pequeña duda me quedó, pero de antemano muchas gracias por todo bro, eres un crack!
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Dimensionar un vector dentro de un struct
« Respuesta #8 en: 9 Noviembre 2014, 00:16 am »

No hay que poner (int*) dentro del free. free() recibe un parámetro void*. El haber puesto (int*) habrá sido una equivocación. (El tipo ya es int* de por sí)
En línea

plataplomo2948

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Dimensionar un vector dentro de un struct
« Respuesta #9 en: 9 Noviembre 2014, 00:38 am »

Es cuestion de preferencia y estilo (pra mi es mas facil leer) - no hace diferencia en el ASM que compila. Cosas asi no van a afectar el comprtamiento del programa y en ese caso solo es estitica.

tambem se me olvido hacer el checkeo de errores en el malloc(). tiene que hacer algo asi despues de cada llamada a malloc()

if Primera.Trabajos o Primera == NULL
    goto FINAL;

tambien, despues de liberarlos, tiene que poner el valor a cada variable a NULL. es buena practica para evitar la explotacion "use after free"
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con struct dentro de libreria « 1 2 »
Programación C/C++
dkmarley 10 9,266 Último mensaje 23 Julio 2010, 16:51 pm
por dkmarley
[SOLUCIONADO]¿Como printear un valor de un struct dentro de otro struct?
Programación C/C++
Firos 0 5,004 Último mensaje 24 Marzo 2011, 13:47 pm
por Firos
Un struct dentro de una matriz
Programación C/C++
freakx 2 6,165 Último mensaje 23 Enero 2012, 02:16 am
por freakx
Ejercicio en C ayuda struct,tabla,vector datos
Programación C/C++
banguu 2 2,465 Último mensaje 10 Noviembre 2015, 01:09 am
por banguu
Duda con respecto a struct dentro de struct
Programación C/C++
Naimaderis 1 3,239 Último mensaje 2 Abril 2017, 00:10 am
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines