Ver Mensaje Individual
  #8 (permalink)  
Antiguo 16/12/2010, 03:35
luface2000
 
Fecha de Ingreso: octubre-2006
Mensajes: 169
Antigüedad: 17 años, 6 meses
Puntos: 2
Respuesta: Problema de principiante con struct en C

Hola,

he puesto la variable tAlumno palmera dentro del main y creo que tienes razón, es más purista pero funciona.

Código:
int main (void)
{
	tAlumnos palmera;
En lo segundo que comentas está mi duda.

Código:
typedef struct{
	int id;
	tNino datos [3];	           <--------tabla de tupla
} tAlumnos;
Entiendo que creas un tipo tAlumnos de struct y que albergará una tabla de struct de 3 posiciones en el caso de código que muestro. En la práctica ira la secuencia 0,1,2, es decir tres posiciones. El tema es que cuando ejecutas el programa por pantalla de la consola hace un printf de todos los casos. El tema es que no entiendo como hace la secuencia la tabla. Si es tNino datos[3] debería ser 0,1,2 pero en realidad hace 0,1,2,3. Es lo que no entiendo. Por ejemplo, el que código que pego a continuación

Código:
/*System header files*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*Symbolic constants*/
#define NUM_MAX 5

/*User defined types*/
typedef struct{
	char nombre[NUM_MAX];
	int ano;
	int edad;
} tNino;

typedef struct{
	int id;
	tNino datos [4];	
} tAlumnos;	

int main (void)
{
	tAlumnos palmera;
	printf("Hola Mundo\n");
	
	palmera.id = 0;
	strcpy (palmera.datos[0].nombre, "Laura");
	palmera.datos[0].ano = 2000;
	palmera.datos[0].edad = 10;
	printf("Los datos son: ID=%d Nombre=%s Año Nacimiento=%d y Edad=%d\n", palmera.id, palmera.datos[0].nombre, palmera.datos[0].ano, palmera.datos[0].edad);
	
	printf("Esto imprime el primer caracter de %s que es = %c\n", palmera.datos[0].nombre, palmera.datos[0].nombre[0]);
	
	palmera.id = 1;
	strcpy (palmera.datos[1].nombre, "Pablo");
	palmera.datos[1].ano = 2003;
	palmera.datos[1].edad = 8;
	printf("Los datos son: ID=%d Nombre=%s Año Nacimiento=%d y Edad=%d\n", palmera.id, palmera.datos[1].nombre, palmera.datos[1].ano, palmera.datos[1].edad);
	
	palmera.id = 2;
	strcpy (palmera.datos[2].nombre, "Pili");
	palmera.datos[2].ano = 1972;
	palmera.datos[2].edad = 38;
	printf("Los datos son: ID=%d Nombre=%s Año Nacimiento=%d y Edad=%d\n", palmera.id, palmera.datos[2].nombre, palmera.datos[2].ano, palmera.datos[2].edad);
	
	palmera.id = 3;
	strcpy (palmera.datos[3].nombre, "Lorenzo");
	palmera.datos[3].ano = 1968;
	palmera.datos[3].edad = 42;
	printf("Los datos son: ID=%d Nombre=%s Año Nacimiento=%d y Edad=%d\n", palmera.id, palmera.datos[3].nombre, palmera.datos[3].ano, palmera.datos[3].edad);
	
	palmera.id = 4;
	strcpy (palmera.datos[4].nombre, "Lorenzo");
	palmera.datos[4].ano = 1968;
	palmera.datos[4].edad = 42;
	printf("Los datos son: ID=%d Nombre=%s Año Nacimiento=%d y Edad=%d\n", palmera.id, palmera.datos[4].nombre, palmera.datos[4].ano, palmera.datos[4].edad);
	
	return 0;
}
para tNino datos[4] no da error y son 5 datos, pero si pongo tNino datos[3] el mensaje que muestra en consola es,
Código:
Hola Mundo
Los datos son: ID=0 Nombre=Laura Año Nacimiento=2000 y Edad=10
Esto imprime el primer caracter de Laura que es = L
Los datos son: ID=1 Nombre=Pablo Año Nacimiento=2003 y Edad=8
Los datos son: ID=2 Nombre=Pili Año Nacimiento=1972 y Edad=38
Los datos son: ID=3 Nombre=Lorenzo Año Nacimiento=1968 y Edad=42
Los datos son: ID=4 Nombre=Lorenzo Año Nacimiento=1968 y Edad=42
Segmentation fault

------------------
(program exited with code: 0)
Press return to continue

con lo que rebosa la tabla confirmando lo que digo. ¿Entonces como maneja el inicio y final de esa tabla? Lo siento, es un ladrillo de pregunta.

Gracias.