C/Visual C - Dimensionar un vector dentro de un struct

 
Vista:
sin imagen de perfil

Dimensionar un vector dentro de un struct

Publicado por Jason (1 intervención) el 08/11/2014 20:36:15
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.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
 
typedef struct humano{
 
	int *trabajos;
 
}persona;
 
int main(){
 
	int i,j,cont=1;
	int cantidad_personas=8;
	int cantidad_trabajos=4;
	persona *primera;
	primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
 
/* Hasta este punto por lo que entiendo hice un arreglo dinamico en donde
	   ubicamos a la persona en un espacio del arreglo*/
 
	//Ahora bien cada persona tendrá más de un trabajo por lo cual el puntero
	//trabajo (*trabajos) debemos convertirlo en un vector.
 
	primera->trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
 
 
	for (i = 0; i < cantidad_personas; i++){
		for (j = 0; j < cantidad_trabajos; j++){
 
			primera->trabajos[j]=cont;
			cont++;
		}
	}
 
	for (i = 0; i < cantidad_personas; i++){
		for (j = 0; j < cantidad_trabajos; j++){
 
			printf("%d ",primera->trabajos[j]);
		}
		printf("\n");
	}
 
	return 0;
}

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.

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.

Y si le pongo un contador a primera (es decir
1
primera[i]->
no me compila, qué pasa?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Dimensionar un vector dentro de un struct

Publicado por Capitan Kirk (97 intervenciones) el 10/11/2014 08:33:01
En primer lugar, al hacer

primera=(persona *)malloc(sizeof(persona)*cantidad_personas);

has reservado espacio para (cantidad_personas) estrucutras del tipo persona. Ahora, primera está apuntando a la primera estructura. Luego, haces

primera->trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);

Con esto, y dado que primera apunta a la primera estructura, esta primera estructura es la única que tiene espacio para los (cantidad_trabajos) que quieres asignar a cada persona. Por ello, tal como lo tienes, únicamente estás asignando valores (y luego imprimiendo) a la primera estructura.

Ahora bien, una vez que has reservado la memoria, primera puedes utilizarlo como un array de 'personas', TAL COMO LO HAS HECHO CON TRABAJOS. Debes, pues, asignar memoria a cada uno de las 'personas', pues, tal como lo has hecho, solamente has reservado trabajos para la primera. El código quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
 
typedef struct humano
{
	int *trabajos;
}
persona;
 
int main()
{
	int i,j,cont=1;
	int cantidad_personas=8;
	int cantidad_trabajos=4;
	persona *primera;
 
	// Aqui reservamos espacio para el numero de personas a utilizar
	primera=(persona *)malloc(sizeof(persona)*cantidad_personas);
 
	// AQUI RESERVAMOS ESPACIO PARA LOS TRABAJOS DE CADA UNA DE LAS PERSONAS
	for (i=0; i<cantidad_personas; i++)
		primera[i].trabajos=(int *)malloc(sizeof(int)*cantidad_trabajos);
//
 	for (i = 0; i < cantidad_personas; i++)
	{
		for (j = 0; j < cantidad_trabajos; j++)
		{
			primera[i].trabajos[j]=cont;
			cont++;
		}
	}
 //
	for (i = 0; i < cantidad_personas; i++)
	{
		for (j = 0; j < cantidad_trabajos; j++)
		{
			printf("%d ",primera[i].trabajos[j]);
		}
		printf("\n");
	}
 
	// AQUI LIBERAMOS LA MEMORIA RESERVADA DE FORMA DINAMICA
	// DE SER POSIBLE, LIBERARLA EN ORDEN INVERSO AL DE SU GENERACION
	for (i=cantidad_personas-1; i>=0; i--)
		free(primera[i].trabajos;
	free(primera);
 
	return 0;
}

Fíjate que los elementos de la estructura 'persona' en 'primera' se direccionan con '.' en lugar de con '->'. Esto se debe a que, ahora, 'primera[i]' es una estructura del tipo persona, y no un puntero. Al compilar antes no te daba error porque 'primera' sí es un puntero. Del mismo modo, 'primera[i].trabajo' es un puntero, pero 'primera[i].trabajo[j]' ya es un trabajo concreto.

Finalmente, acostúmbrate a liberar la memoria reservada dinámicamente cuando ya no la necesites. En un programa pequeño como este tiene poca importancia, pero en programas grandes puedes llegar a tener problemas por fragmentación excesiva de la memoria disponible, o por falta de memoria por bloques de memoria reservados a los que ya no se puede acceder porque se ha perdido el puntero que tenían asignado.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar