• Lunes 16 de Diciembre de 2024, 00:33

Autor Tema:  Error Con Los Punteros  (Leído 1438 veces)

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Error Con Los Punteros
« en: Miércoles 17 de Agosto de 2005, 13:44 »
0
Buenas tardes a todos!


Veréis creo que debo tener un lio con el uso de punteros pues el programa me da error y no sé por qué. Espero que podáis ayudarme u orientarme. Mis dudas son:

Con esta estructura:
Código: Text
  1.  
  2. /* Información */
  3. typedef struct {
  4.                 int direccion;
  5.                 int medida;
  6. }tInfoTram;
  7. /* Nodo de la cola */
  8. typedef struct {
  9.                 tInfoTram infotram;
  10.                 struct tTramo *seguent;
  11. }tTramo;
  12. /* Gusano */
  13. typedef struct {
  14.                 tTramo *CabezaCuc;
  15.                 tTramo *ColaCuc;
  16. }tCuc;
  17.  
  18.  

Puedo hacer:
Código: Text
  1.  
  2. tCuc *CreaCuc(void);
  3.  
  4. tCuc *CreaCuc(void) {
  5.  
  6.      tCuc *cuc;
  7.      cuc = NULL;
  8.      return (cuc);
  9.     
  10. }
  11.  
  12.  

Pero no me deja hacer:
Código: Text
  1.  
  2. tCuc *CreaCuc(void) {
  3.  
  4.      tCuc *cuc;
  5.      cuc->CabezaCuc = NULL;
  6.      cuc->ColaCuc = NULL;
  7.      return (cuc);
  8.     
  9. }
  10.  
  11.  

Y creo que por ese motivo la siguiente función Jugar siempre dice que inserta en gusano no null cuando en el primer tramo el gusano si es null.
Código: Text
  1.  
  2. typedef struct {
  3.                 tTauler *Tablero;
  4.                 tPila *P1, *P2;
  5.                 tCuc *Cuc;
  6.                 int nTiradas;
  7.                 int nRondas;
  8. }tJoc;
  9.  
  10.  

Código: Text
  1.  
  2. int main(void) {
  3. ...
  4.  
  5. tJoc Juego;
  6. ...
  7. Juego = InicialitzarJoc(&Juego, altura, ancho);
  8.                                   
  9. Juego.Tablero->caselles[fila-1][columna-1] = CABEZA;                                      
  10. i = TableroAPantalla(Juego.Tablero);
  11.  
  12. /* Generar la pila de cartas aleatóriamente */
  13. Juego.P1 = GenerarPilaCartes();
  14.                                                                       
  15.  /* Repetir */    
  16. Repetir(&Juego);                          
  17.  
  18.  

Código: Text
  1.  
  2. tJuego InicialitzarJoc(tJoc *Juego, int altura, int ancho) {
  3.         
  4.      Juego->Tablero = CrearTauler(altura, ancho);
  5.      Juego->P1 = IniciarPila();
  6.      Juego->P2 = IniciarPila();
  7.      [COLOR=red]Juego->Cuc = CreaCuc();[/COLOR]
  8.      Juego->nRondas = 0;
  9.      Juego->nTiradas = 0;
  10.      return *Juego;
  11.  
  12. }
  13.  
  14. int Jugar(tJoc *Juego, tCarta *carta) {
  15.    
  16.    
  17.     int i;
  18.     tCarta C;
  19.     tTramo *tram;
  20.        
  21.     tram = CrearTramo(carta->pal, carta->num);
  22.     /* Añado el tramo al gusano */
  23.     [COLOR=red]i = AfegeixTramCuc(Juego->Cuc, tram);[/COLOR]
  24.    
  25.     switch (carta->pal) {
  26.    
  27.            case 1:
  28.                 printf("OROS: Derecha\n");
  29.                
  30.                 break;
  31.            case 2:
  32.                 printf("BASTOS: Izquierda\n");
  33.                 break;
  34.            case 3:
  35.                 printf("COPAS: Arriba\n");
  36.                 break;
  37.            case 4:
  38.                 printf("ESPADAS: Abajo\n");
  39.                 break;                
  40.     }
  41. }
  42.  
  43. void Repetir(tJoc *Juego) {
  44.     
  45.      int i;
  46.      tCarta C;  
  47.      tPila pila;                  
  48.     
  49.      /* Repetir */    
  50.      while (Juego->P1->cap != NULL) {
  51.           
  52.            /* Sacar una carta C de P1 */
  53.            i = Desempilar(Juego->P1, &C);
  54.                     
  55.            /* If C se puede jugar entonces */
  56.            If (Jugar(&Juego, &C)) {      
  57.                /* Añadir C al gusano */
  58.               /* Actualizar el tablero */
  59.               /* Sumar 1 a la puntuación */
  60.               /* Else */
  61.               /* Añadir C a P2 */
  62.               /* Restar k puntos de la puntuación */              
  63.            } /* Fin de If */
  64.  
  65. /* Mostrar el tablero por pantalla */
  66. /* Si el usuario quiere, pedir otra acción */
  67.    } /* Fin del While */
  68. }
  69.  
  70.  
  71.  

En Repetir y Jugar hay trozos que me faltan (comentarios) pero como soy novata prefiero ir paso a paso y aprender. El caso es que al llamar a añadir tramo al gusano para jugar (AfegeixTramCuc(Juego->Cuc, tram)) me trata el primer tramo como si el gusano no fuera null. Me podéis orientar? No he puesto todo el código porque es muy grande. Espero que quede claro y no falten datos.

Muchas gracias a todos. Gracias a vosotros estoy aprendiendo mucho.

rir3760

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Error Con Los Punteros
« Respuesta #1 en: Miércoles 17 de Agosto de 2005, 14:59 »
0
Cita de: "angels"
Pero no me deja hacer:
Código: Text
  1.  
  2. tCuc *CreaCuc(void) {
  3.  
  4.      tCuc *cuc;
  5.      cuc->CabezaCuc = NULL;
  6.      cuc->ColaCuc = NULL;
  7.      return (cuc);
  8.      
  9. }
  10.  
  11.  
Esto se debe a que cuc no apunta a una direccion valida de memoria. Antes de utilizar este puntero debes reservar memoria suficiente para un objeto de tipo tCuc:
Código: Text
  1. tCuc *CreaCuc(void)
  2. {
  3.    tCuc *cuc;
  4.    
  5.    if ((cuc = malloc(sizeof(*cuc))) != NULL){
  6.       cuc->CabezaCuc = NULL;
  7.       cuc->ColaCuc = NULL;
  8.    }
  9.    
  10.    return cuc;
  11. }
  12.  

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

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Error Con Los Punteros
« Respuesta #2 en: Jueves 18 de Agosto de 2005, 10:25 »
0
Hola:

Echa un ojo en Punteros a ver si te ayuda.

Se bueno.

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Error Con Los Punteros
« Respuesta #3 en: Jueves 18 de Agosto de 2005, 14:49 »
0
Buenas tardes a todos!!


Muchas gracias rir3760. He dejado la función CreaCuc como me habías indicado y no se cuelga.

Muchas gracias chuidiang. Es realmente bueno este artículo sobre punteros, me ha aclarado varias cosas. Te lo agradezco.


Sois estupendos. Hasta la próxima.  :)