| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
mnv_19
Registrado: 02 Sep 2007 Mensajes: 3
| Publicado: 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 )
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|