• Jueves 14 de Noviembre de 2024, 18:43

Autor Tema:  Error En El Puntero A Pila  (Leído 1954 veces)

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Error En El Puntero A Pila
« en: Sábado 6 de Agosto de 2005, 11:46 »
0
Hola a todos!

Es mi primer mensaje en este foro y espero que se ajuste correctamente a sus normas. Antes de nada os doy las gracias por anticipado a todos. Espero que alguien pueda darme una pista porque he probado ya un montón de cosas y la verdad no veo dónde me "cuelo".

Debo poder manejar una pila de cartas i en la función de apilarlas me da error en asignar el puntero a la cabeza de la pila al nuevo nodo. El trozo de código es:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
int Empilar (tPila *pila, tCarta *carta) {
    
    tNode *nuevo;
            
    if (EsVaciaPila(pila)) {  
       nuevo = (tNode *) malloc (sizeof(tNode));
       if (nuevo != NULL) {
          nuevo->carta = *carta;
          nuevo->seguent = NULL;
          pila->cap = nou;
          return 0;
       }
       else {
          printf ("Error en la assignación de memoria.\n");
          printf ("\n Finalizamos el programa.\n");
          exit(1);
       }
    }
    else {
       nuevo = (tNode *) malloc (sizeof(tNode));
       if (nuevo != NULL) {
          nuevo->carta = *carta;
          nuevo->seguent = pila->cap;
          pila->cap = nou;
          return 0;
       }
       else {
          printf ("Error en la assignación de memòria.\n");
          printf ("\n Finalizamos el programa.\n");
          exit(1);
       }    
    }
}

Las estructuras son:

typedef struct {
                int pal;
                int num;
}tCarta;

typedef struct {
                tCarta carta;
                struct tNode *seguent;
}tNode;

typedef struct {
                tNode *cap;
}tPila;
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Creo que el problema que cuelga el programa es esta asignación pero... Seguiré probando...

Muchas gracias por la ayuda!!!
Saludos a todos.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error En El Puntero A Pila
« Respuesta #1 en: Lunes 8 de Agosto de 2005, 05:12 »
0
Hola no he podido analizar tu codigo en detalla .. pero si no entendi mal el rpoblema es que estas escribiendo mal.

Si ese llega a ser tu problema... rpobablemente sea porque no has hecho el coeigo tu... no se... :whistling:

<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
typedef struct {
               int pal;
               int num;
}tCarta;

typedef struct {
               tCarta carta;
               struct tNode *seguent;
}tNode;

typedef struct {
               tNode *cap;
}tPila;

int Empilar (tPila *pila, tCarta *carta) {
  
   tNode *nuevo;
          
   if (EsVaciaPila(pila)) {  
      nuevo = (tNode *) malloc (sizeof(tNode));
      if (nuevo != NULL) {
         nuevo->carta = *carta;
         nuevo->seguent = NULL;
         pila->cap = nuevo;
         return 0;
      }
      else {
         printf ("Error en la assignación de memoria.\n");
         printf ("\n Finalizamos el programa.\n");
         exit(1);
      }
   }
   else {
      nuevo = (tNode *) malloc (sizeof(tNode));
      if (nuevo != NULL) {
         nuevo->carta = *carta;
         nuevo->seguent = pila->cap;
         pila->cap = nuevo;
         return 0;
      }
      else {
         printf ("Error en la assignación de memòria.\n");
         printf ("\n Finalizamos el programa.\n");
         exit(1);
      }    
   }
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Valdria que le hecharas una revision general al codigo ya que es factible que tengas mas equivocaciones.  :hola:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Error En El Puntero A Pila
« Respuesta #2 en: Lunes 8 de Agosto de 2005, 09:18 »
0
Buenos días a todos!

Muchas gracias JuanK! me equivoqué al copiar el codigo con el nombre de las varaiables porque los cambié para que se entendieran mejor y se me coló. En el código lo tengo igual que tú pero cuando compilo me da un Warning de incompatibilidad de tipo y cuando lo ejecuto funciona hasta allí y se me cuelga.

En cuanto a lo de que el código... Se trata de una práctica, las estructuras son del profe y la función la he hecho yo, me he guiado por libros etc. porque soy novata y estoy intentando aprender. Supongo que por eso la función no funciona. Creía que lo había entendido pero si no funciona supongo que no es así. Me podéis ayudar? Alguna pista de qué hago mal?

Muchas gracias por adelantado a todos!!

carlos20

  • Miembro activo
  • **
  • Mensajes: 34
    • Ver Perfil
Re: Error En El Puntero A Pila
« Respuesta #3 en: Lunes 8 de Agosto de 2005, 12:11 »
0
hola angels

Creo que el problema puede estar en la funcion "EsVaciaPila(pila)" , en la forma
como pruebas si la pila esta vacia porque si la variable "pila" la inicialisas con NULL
no puedes hacer la asignacion "pila->cap = nuevo;" porque tratar de acceder
a "pila->cap" si la variable "pila" es NULL te dara un error . prueba colocando
"pila->cap==NULL" en el if donde esta la funcion "EsVaciaPila(pila)" y prueba
con esto

Código: Text
  1.  
  2.  
  3. void main(){
  4.    
  5.     tPila p;
  6.     p.cap = NULL;
  7.  
  8.  
  9.     tCarta* carta;
  10.     carta-&#62;num = 10;
  11.     carta-&#62;pal = 2;
  12.  
  13.     Empilar(&p,carta);
  14.     Empilar(&p,carta);
  15.  
  16. }
  17.  
  18.  
  19.  

angels

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Error En El Puntero A Pila
« Respuesta #4 en: Martes 9 de Agosto de 2005, 11:57 »
0
Buenos días a todos!!

Muchas gracias carlos20! Tenías razón. He probado lo que me dijiste y me funcionaba así que el problema era la función "EsVaciaPila(pila)". Yo tenía:

int IniciarPila (tPila *pila) {
     pila = NULL;
     return (1);
}
int EsVaciaPila (tPila *pila) {
     if (pila == NULL) {
          return(TRUE);
     }
     else {
          return(FALSE);
     }
}


Y lo he dejado como:


int IniciarPila (tPila *pila) {
     pila->cap = NULL;
     return (1);
}
int EsVaciaPila (tPila *pila) {
     if (pila->cap == NULL) {
          return(TRUE);
     }
     else {
          return(FALSE);
     }
}

Por si sirve de ayuda a alguien.


Vuelvo a daros las gracias! Sois geniales.   :lol: