Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116

    grave problema con i puntatori...

    Ciao a tutti, ho un problema che riguarda i puntatori:

    Non capisco perche' avviene questa stranissima cosa:
    (vi avverto che nonostante sia una domanda lunga in realta'
    il problema e' facile da capire; inoltre se volete potete anche compilarvele da soli
    con i comandi :
    g++ -c Lista.cpp
    g++ -o CodaFifo CodaFifo.cpp Lista.o
    e potete eseguire con
    ./CodaFifo
    e rendervi conto del mistero.......)


    Considerate le seguenti classi:

    Classe Nodo.h
    codice:
    class Nodo{
    public:
    	int q1,q2,f_value;
    	Nodo(){
    		q1 = 0;
    		q2 = 0;
                    f_value=0;
    
    		
    	}
    
    	Nodo(int qu1, int qu2, int f_val){
    		
    		q1 = qu1;
    		q2 = qu2;
    		f_value = f_val;
    		
    	}
    
    
      	~Nodo(){}
    };
    Classe Cella.h:
    codice:
    #include "Nodo.h"
    
    class Cella{
    
    public:
    	
     	Nodo n;
    	Cella* next; //punta alla prossima cella
    	Cella* pred; // punta alla cella precedente
    		
    	Cella(Nodo n1){
       		n = n1;
    		next = NULL;
    		pred = NULL;
    	}
    	~Cella(){}	
    };
    Classe Lista.h
    codice:
    #include "Cella.h"
    
    class Lista{
    
    public:
    	
    	Cella* head; // inizio della lista
    	Cella* last; // fine della lista
    	int nOggetti;// numero di oggetti presenti nella lista
    	
    	Lista(){
    		
     		head = NULL;
    		last = NULL;
    		nOggetti = 0;
    	}
    	~Lista(){}	
    };
    La relativa classe Lista.cpp e' formata solo dalle seguenti 2 istruzioni
    codice:
     #include <iostream.h>
     #include "Lista.h"
    Ora, la classe CodaFifo eredita da Lista: ecco CodaFifo.h:
    codice:
    #include "Lista.h"
    
    class CodaFifo : public Lista{
    
    public:
    
      CodaFifo(){}
      ~CodaFifo(){}
      
      void inserisci(Nodo n);// inserisce una cella nella coda
      void cancella(int k);//cancella una cella
    };

    Infine la classe CodaFifo.cpp :
    codice:
    #include <iostream.h>
    #include "CodaFifo.h"
    
    // inserisce un nodo in fondo alla coda
    void CodaFifo :: inserisci(Nodo n){
    	
    	Cella nuova_cella =  Cella(n);
    	
    	if(nOggetti == 0){// se bisogna inserire il primo elemento
    	
    		this->head = &nuova_cella;
    	}else{
    		
    		nuova_cella.pred = this->last;
    		this->last = &nuova_cella;
    			
    	}
    	nOggetti++;
    }
    
    
    
    void CodaFifo::cancella(int k){ // non cancella,mostra solo il contenuto di this->head->n.q1
    
    int a = this->head->n.q1;
    cout << "sto cancellando; testa :" << a << "Numero oggetti:" << nOggetti << endl;
    }
    
    main(){
    	Nodo n1,n2,n3;
    	n1 = Nodo(1,82,53);
    	n2 = Nodo(2,37,58);
    	n3 = Nodo(3,28,33);
    	
    	CodaFifo l;
    	l.inserisci(n1); cout << l.head->n.q1 << " " << l.nOggetti << endl;
    	l.inserisci(n2); cout << l.head->n.q1 << " " << l.nOggetti << endl;
     	l.inserisci(n3); cout << l.head->n.q1 << " " << l.nOggetti << endl;
    	
     	l.cancella(1);
    	
    	cout << endl;
    
    }
    Perche' l.cancella(1) non mi da' il risultato corretto? Il fatto e' che sicuramente c'e' qualche problema con i puntatori perche' il campo nOggetti viene restituito correttamente;Purtroppo
    in fase di compilazione non ho nessun erreore dunque la sintassi e' corretta.


    Vi prego aiutatemi!!!!!!!!!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, ma in

    void CodaFifo::cancella(int k){ // non cancella,mostra solo il contenuto di this->head->n.q1

    int a = this->head->n.q1;
    cout << "sto cancellando; testa :" << a << "Numero oggetti:" << nOggetti << endl;
    }

    qual e' il codice per "cancellare" ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Non l'ho messo, perche' non e' rilevante ai fini della domanda e perche' devo ancora terminalo.

    Nella funzione cancella volevo solo mettere in evidenza il fatto che mentre nOggetti viene restituito correttamente (notare che non e' un campo puntatore) invece
    this->head->n.q1 ritorna un numero molto lungo che e' diverso
    da quello corretto.

    Sapresti aiutarmi? Non so proprio dove sbattere la testa, il compilatore dice che non ci sono problemi!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Veramente ho degli errori in

    n1 = Nodo(1,82,53);
    n2 = Nodo(2,37,58);
    n3 = Nodo(3,28,33);

    dato che non esiste alcuna funzione che accetti 3 parametri per Nodo ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Scusa mi ero dimenticato di aggiungere il costruttore.
    Ho appena modificato il codice nella classe Nodo.h
    Adesso dovrebbe funzionare. Ma il problema originale persiste.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ho visto che usi in CodaFifo nella funzione Inserisci, come parametro, un oggetto piuttosto che il suo puntatore ... e forse usi questo modo di passare gli oggetti un po' in generale, ma non e' corretto.

    Dovrebbe essere

    l.inserisci(&n1);

    e quindi

    void CodaFifo::inserisci(Nodo *n)

    in cui n deve essere trattato come puntatore all'oggetto.

    Se usi passare gli oggetti, viene fatta una copia dell'oggetto originale in un altro oggetto dal C++, copia che viene usata all'interno della funzione e poi distrutta con il richiamo del distruttore prima dell'uscita. Questo fatto ti fa credere che stai operando con gli oggetti dichiarati nel main ed invece non e' cosi'.

    O anche, e forse meglio, passa i parametri per reference.
    Cosi' che lasci

    l.inserisci(n1);

    e scrivi

    void CodaFifo::inserisci(Nodo& n)

    Attento pero' ... la cosa non si deve limitare a CodaFifo ma anche alle altre classi in cui i parametri "oggetti" devono essere passati per puntatore o riferimento (vedi il costruttore di Cella ...)

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Ciao Oregon grazie per avermi risposto. Adesso provo a modificare il codice come mi hai detto, però ti faccio notare che così comm è inserisci() funziona; E' cancella() il problema! Sei percaso riuscito a risolverlo?
    Prova a far girare il programma e te ne accorgi subito.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non e' che cancella non funziona ... e' inserisci e tutto il resto che non inserisce correttamente ... cosa deve fare cancella se non si sono inseriti i dati correttamente?

    Ho fatto girare il programma e il problema e' quello che ti ho detto ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Caro Oregon, non ci riesco :-( ottengo gli stessi errori di prima. Forse dovrei fare delle altre modifiche...

    Ho modificato le seguenti funzioni come mi hai detto tu:

    In CodaFifo.h e CodaFifo.cpp:
    codice:
    void inserisci(Nodo& n)

    In Cella.h:
    codice:
    Cella(Nodo& n1){
       		n = n1;
    		next = NULL;
    		pred = NULL;
    	}
    Tu sei riuscito a far girare il prgramma? Se vuoi ti mando un messaggio privato con la mia mail e ti chiedo di inviarmi il codice corretto.
    Per favore aiutami.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Ti pongo la questione in un altro modo: secondo me il problema e' che quando ci si riferisce alla classe (dento cancella() c'e' this->...) c'e' qualcosa che non va.
    Infatti io faccio
    codice:
    l.inserisci(n3);
    se chiedo:
    codice:
     cout << l.head->n.q1 << " " << l.nOggetti << endl;
    mi ritorna un valore corretto, e subito dopo quando faccio cancella:
    codice:
    l.cancella(1);
    il risutato della richiesta (che e' dentro cancella())

    codice:
    int a = this->head->n.q1;
    cout << "sto cancellando; testa :" << a << "Numero oggetti:" << nOggetti << endl;
    non funziona?

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.