Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] crash inspiegabile

    Salve a tutti!
    oggi, oltre al caldo,c'è un'altra cosa che mi tormenta:un crash che proprio non mi spiego!
    Sto lavorando su una struttura, un albero ennario realizzato con puntatore. Faccio uno scrivinodo e tutto va bene, ma quando vado a leggere il nodo ho questo crash. Volete darci un'occhiata per favore?
    Il crash si ha quando parte l'istruzione legginodo nel metodo testaalberi della classe base.

    Albero nario con punt.
    codice:
    #ifndef albennariopunt_h
    #define albennariopunt_h
    #include <stdlib.h>
    #include <iostream>
    #include "nodoalberoennario.h"
    
    using namespace std;
    
    template <class tipoelem>
    class albennariopunt : public alberoennebase <tipoelem, nodoalberoennario<tipoelem> * >
    {
      public:
             typedef nodoalberoennario<tipoelem> *nodo;
             albennariopunt();
             void creaalbero();      
             bool alberovuoto();
             nodo radice();
             void insradice(nodo);
             nodo padre(nodo);
             bool foglia(nodo);
             nodo primofiglio(nodo);
             bool ultimofratello(nodo);
             nodo succfratello(nodo);
             tipoelem legginodo(nodo);
             void scrivinodo(tipoelem, nodo);
             void insprimosottoalbero(nodo);
             void inssottoalbero(nodo);
             void cancsottoalbero(nodo);
      private:
             nodo root;
    };
    #endif
    
    
    template <class tipoelem> //costruttore
    albennariopunt<tipoelem>::albennariopunt() 
    {
      creaalbero();                                           
    }
    
    template <class tipoelem> //creaalbero
    void albennariopunt<tipoelem>::creaalbero()
    {
      root=NULL;
    }
    
    template <class tipoelem> //alberovuoto
    bool albennariopunt<tipoelem>::alberovuoto() 
    {
      return (root==NULL);     
    }
    
    template <class tipoelem> //radice
    typename albennariopunt<tipoelem>::nodo albennariopunt<tipoelem>::radice() 
    {
      return (root);         
    }
    
    
    template <class tipoelem> //insradice
    void albennariopunt<tipoelem>::insradice(typename albennariopunt<tipoelem>::nodo x)
    {
      if (alberovuoto())
        {
         x=new nodoalberoennario<tipoelem>;
         root=x;
         x->setpadre(NULL);
         x->setfiglio(NULL);
         x->setfratello(NULL);
        }
    }
    
    template <class tipoelem> //padre
    typename albennariopunt<tipoelem>::nodo albennariopunt<tipoelem>::padre (typename albennariopunt<tipoelem>::nodo x)
    {
    // if ( (!alberovuoto()) && (x!=root) )
      return ( x->getpadre() );
     //else cout<<"errore"<<"\n";
    }
    
    template <class tipoelem> //foglia
    bool albennariopunt<tipoelem>::foglia (typename albennariopunt<tipoelem>::nodo x)
    {
     if (!alberovuoto())
      return (x->getfiglio()==NULL);     
    }
    
    template <class tipoelem> //primofiglio
    typename albennariopunt<tipoelem>::nodo albennariopunt<tipoelem>::primofiglio (typename albennariopunt<tipoelem>::nodo x)
    {
     if ( (!foglia(x)) && (!alberovuoto()) )
       return (x->getfiglio());
    }
    
    template <class tipoelem> //ultimofratello
    bool albennariopunt<tipoelem>::ultimofratello(typename albennariopunt<tipoelem>::nodo x)
    {
     if (!alberovuoto())
      return (x->getfratello()==NULL);     
    }
    
    template <class tipoelem> //succfratello
    typename albennariopunt<tipoelem>::nodo albennariopunt<tipoelem>::succfratello(typename albennariopunt<tipoelem>::nodo x)
    {
     if ( (!alberovuoto()) && (!ultimofratello(x)) )
      return (x->getfratello());
    }
    
    template <class tipoelem> //legginodo
    tipoelem albennariopunt<tipoelem>::legginodo(typename albennariopunt<tipoelem>::nodo x)
    {
     return (x->getetichetta());         
    }
    
    template <class tipoelem> //scrivinodo
    void albennariopunt<tipoelem>::scrivinodo(tipoelem elem, nodo x)
    {
     x->setetichetta(elem);     
    }
    
    
    template <class tipoelem> //insprimosottoalbero
    void albennariopunt<tipoelem>::insprimosottoalbero (typename albennariopunt<tipoelem>::nodo x)
    {
     nodo y;
     y=new nodoalberoennario<tipoelem>;
     
     if ( (!alberovuoto()) && ( this->radice()!=NULL) )
     { 
       y->setpadre(x);
       y->setfratello(x->getfiglio());
       x->setfiglio(y);
     }    
    }
    
    template <class tipoelem> //inssottoalbero
    void albennariopunt<tipoelem>::inssottoalbero(typename albennariopunt<tipoelem>::nodo x)
    {
     nodo y;
     y=new nodoalberoennario<tipoelem>;
     
     if ( (!alberovuoto()) && (x!=root) ) 
     { 
      if ( (x->getfiglio())!=NULL )
      {
       y->setfratello(x->getfratello());    
       y->setpadre(x->getpadre());
       x->setfratello(y);
      }
     }
    }
    
    
    template <class tipoelem> //cancsottoalbero
    void albennariopunt<tipoelem>::cancsottoalbero(typename albennariopunt<tipoelem>::nodo x)
    {
     if (!alberovuoto())
     {
       nodo temp;
       if (!foglia(x))
       {
         temp=primofiglio(x);
         while (!ultimofratello(temp))
         {  
           cancsottoalbero(temp);
           temp=succfratello(temp);                  
         }
       }
       if (x==root)
         root=NULL;
     delete x;
     }     
    }
    classe base
    codice:
    #ifndef alberoennebase_h
    #define alberoennebase_h
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    template <class tipoelem, class nodo>
    class alberoennebase
    {
          public:
                 virtual void creaalbero()=0;      
                 virtual bool alberovuoto()=0;
                 virtual nodo radice()=0;
                 virtual void insradice(nodo)=0;
                 virtual nodo padre(nodo)=0;
                 virtual bool foglia(nodo)=0;
                 virtual nodo primofiglio(nodo)=0;
                 virtual bool ultimofratello(nodo)=0;
                 virtual nodo succfratello(nodo)=0;
                 virtual tipoelem legginodo(nodo)=0;
                 virtual void scrivinodo(tipoelem, nodo)=0;
                 virtual void insprimosottoalbero(nodo)=0;
                 virtual void inssottoalbero(nodo)=0;
                 virtual void cancsottoalbero(nodo)=0;
                 
                 void testalberi();
                  
          
    };
    #endif
    
    template <class tipoelem, class nodo>
    void alberoennebase<tipoelem, nodo>::testalberi()
    {
      nodo x,y;
      
      cout<<"Test albero vuoto(esito previsto 1): "<<this->alberovuoto()<<"\n"; 
      
      cout<<"Test insradice. \n";
      this->insradice(x); //test insradice
      cout<<"Test radice: "<<this->radice()<<"\n"; //test radice
    
      cout<<"Test inssottoalbero.";
      this->inssottoalbero(x);
      cout<<"Test scrivinodo,scrivo 2.";
      this->scrivinodo(2, x); //test scrivinodo
      cout<<"Test legginodo sul nodo appena scritto:"<<this->legginodo(x)<<"\n";
      
    }
    classe nodo
    codice:
    #ifndef nodoalberoennario_h
    #define nodoalberoennario_h
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    template <class tipoelem>
    class nodoalberoennario
    {
       public:
              typedef nodoalberoennario *pos;
              
              nodoalberoennario();
              tipoelem getetichetta();
              pos getpadre();
              pos getfiglio();
              pos getfratello();
              
              void setetichetta(tipoelem);
              void setpadre(pos);
              void setfiglio(pos);
              void setfratello(pos);
              
              nodoalberoennario operator= (nodoalberoennario); //overloading dell'operatore =, necessario in futuro per assegnare due nodi
       private:
               tipoelem elem;          
               pos padre,figlio,fratello;
    };
    #endif
    
    template <class tipoelem> //costruttore
    nodoalberoennario<tipoelem>::nodoalberoennario()
    {
      elem=0;                                              
      padre=NULL;
      figlio=NULL;
      fratello=NULL;                                                
    }
    
    template <class tipoelem> //getetichetta
    tipoelem nodoalberoennario<tipoelem>::getetichetta()
    {
     return  elem;                                
    }
    
    template <class tipoelem> //getpadre
    typename nodoalberoennario<tipoelem>::pos nodoalberoennario<tipoelem>::getpadre()
    {
     return padre;         
    }
    
    template <class tipoelem> //getfiglio
    typename nodoalberoennario<tipoelem>::pos nodoalberoennario<tipoelem>::getfiglio()
    {
     return figlio;        
    }
    
    template <class tipoelem> //getfratello
    typename nodoalberoennario<tipoelem>::pos nodoalberoennario<tipoelem>::getfratello()
    {
     return fratello;         
    }
    
    template <class tipoelem> //setetichetta
    void nodoalberoennario<tipoelem>::setetichetta (tipoelem x)
    {
     elem=x;     
    }
    
    template <class tipoelem> //setpadre
    void nodoalberoennario<tipoelem>::setpadre(pos x)
    {
     padre=x;     
    }
    
    template <class tipoelem> //setfiglio
    void nodoalberoennario<tipoelem>::setfiglio(pos x)
    {
     figlio=x;     
    }
    
    template <class tipoelem> //setfratello
    void nodoalberoennario<tipoelem>::setfratello(pos x)
    {
     fratello=x;     
    }
    
    template <class tipoelem>
    nodoalberoennario<tipoelem> nodoalberoennario<tipoelem>::operator= (nodoalberoennario<tipoelem> x)
    {
     padre=x.getpadre();
     figlio=x.getfiglio();
     fratello=x.getfratello();                            
    }

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Nel tuo main vedo che istanzi 2 oggetti di tipo nodo, poi li passi giustamente alle due classi come riferimenti (non vedo puntatori fin qui) e poi usi all'interno delle due funzioni (scrivi e leggi nodo) come fossero dei puntatori..

    Mi sembra che sia qui il problema....

  3. #3
    Originariamente inviato da Stoicenko
    Nel tuo main vedo che istanzi 2 oggetti di tipo nodo, poi li passi giustamente alle due classi come riferimenti (non vedo puntatori fin qui) e poi usi all'interno delle due funzioni (scrivi e leggi nodo) come fossero dei puntatori..

    Mi sembra che sia qui il problema....
    Grazie mille per l'informazione,ora proverò a verificare!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.