/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Referenciar una estructura a otra

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
mnv_19



Registrado: 02 Sep 2007
Mensajes: 3

MensajePublicado: 24/11/2007 3:19 am
Título: Referenciar una estructura a otra

Hola, tengo una duda..

En mi programa en C, cuento con dos estrcuturas, una es alumno y otra es asignatura.

Cada una de ellas es asi:
struct asignatura{
char codigo[9];
char nombrea[50];
char titulaciona[60];
int credito;
char caracter[25];

};


struct alumno{
char nombre[50];
char apellido[50];
char telefono[10];
char dni[10];
char titulacion[60];
int nasignaturas; //para contar el numero de asignaturas para dar de alta, consultar...
struct asignatura *asig[15];
struct alumno *sig;
struct alumno *ant;
};

typedef struct asignatura asignatura;

typedef struct alumno alumno;

entonces a la hora de reservar memoria para los datos crear los nodos... para hacerlo con los datos de asignatura hago lo siguiente y me dice que no es correcto:
defino alumno *aux

y para guardar los datos de asignatura hago aux->asig->codigo, aux->asig->nombrea, aux->asig->titulaciona...


Cual e s la manera correcta??gracias, un saludo
Volver arriba
Mandu



Registrado: 28 May 2005
Mensajes: 24
Ubicación: El Toboso, Toledo ( España )

MensajePublicado: 24/11/2007 3:44 am
Título:

Buenas , he visto algo que no me cuadra mucho:

Código:
 struct asignatura *asig[15];


Esto es un puntero a un Array de estructuras.
no se porque la declaras como puntero,
creo que tendrias que crear de otra manera puntero o de array.

Código:
struct asignatura *asig;
struct asignatura asig[15];


Prueba con una de estas dos formas

tambien prueba esto, para acceder a los datos
pero no me hagas mucho caso
Código:
// Elige un numero de 0 a 14
aux->asig[0 - 14]->codigo, aux->asig[0 - 14]->nombrea,


Hasta otra, espero que te haya ayudado algo
Volver arriba
mnv_19



Registrado: 02 Sep 2007
Mensajes: 3

MensajePublicado: 25/11/2007 2:35 am
Título:

Pongo struct asignatura *asig[15]porque el el enunciado del problema me dice que como mucho un alumno puede darse de alta en 15 asignaturas. por eso es de 15 y es un puntero que apunta a la otra estructura. estaria bien asi no con esa explicacion?? y luego para acceder a los datos entonces lo estaba haciendo correctamente??gracias un saludo!!!
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3804
Ubicación: Mexico

MensajePublicado: 25/11/2007 9:29 am
Título:

Me parece que estas confundiendo las dos formas de realizar la misma operacion. Si el alumno tiene como maximo 15 asignaturas para manejar estas hay dos opciones:

A) Utilizar un array con el tamaño maximo posible, esto es facil y sencillo pero se desperdicia memoria. En este caso basta declarar el campo "asig" de la estructura "alumno" como un array de quince elementos:
Código:
struct alumno {
   char nombre[50];
   
   ...
   
   int nasignaturas; /* numero de asignaturas */
   struct asignatura asig[15]; /* array de 15 elementos */
   
   ...
};


B) Utilizar un puntero que guardara la direccion en memoria de un bloque con el tamaño justo para el numero de asignaturas necesarias, esto es mas engorroso ya que requiere del uso de punteros y las funciones malloc/free/etc. pero a cambio solo utiliza la memoria necesaria. En este caso el campo "asig" debe declararse como un puntero a "struct asignatura" y por cada variable de tipo alumno se debe reservar el bloque de memoria necesario mediante malloc/calloc/realloc/ guardando esta direccion en memoria en el mentado campo:
Código:
struct alumno {
   char nombre[50];
   
   ...
   
   /* numero de asignaturas */
   int nasignaturas;
   
   /* Aqui se guarda la direccion en memoria del
   ** bloque donde se almacenan las asignaturas
   */
   struct asignatura *asig;
   
   ...
} test;

/* ... */

/*
** Reservar memoria para dies asignaturas y
** guardar la direccion en el campo "asig"
*/

if ((test.asig = malloc(10 * sizeof *test.asig)) == NULL){

   /* manejo de error */

}

test.nasignaturas = 10

/* ... etc ... */


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com