Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447

    [C++] Bus error in programma compilazione

    Ho un semplice programma in c++ che gestisce una lista permettendo tre "operazioni": la creazione, la stampa e il conteggio degli elementi della lista. Questo è il codice:
    codice:
    #include <iostream>
    using namespace std;
    
    struct elem{
    	int inf;
    	elem* pun;
    };
    
    typedef elem* list;
    
    list initList(int n){
    	list p0;
    	elem* p;
    	for(int i=0; i<n; i++){
    		p=new elem;
    		cout << "Inserisci valore: ";
    		cin >> p->inf;
    		p->pun=p0;
    		p0=p;
    	}
    	return p0;
    }
    
    int countList(list li){
    	int count=0;
    	elem* p=li;
    	while(p!=0){
    		count+=1;
    		cout << "Count: " << count << endl;
    		p=p->pun;
    	}
    	return count;
    }		
    	
    void printList(list li){
    	elem* p=li;
    	while(p!=0){
    		cout << p->inf << endl;
    		p=p->pun;
    	}
    }
    
    int main(){
    	list l1;
    	int n;
    	
    	l1=initList(5);
    	n=countList(l1);
    	cout << "Conteggio " << n << ".\n";
    	
    	//system("pause");
    	return 0;
    }
    Ho compilato questo codice in ambiente mac e non ho avuto modo di provarlo ne su linux ne su windows. Il programma una volta lanciato come da titolo presenta l'errore bus error a cui purtroppo non riesco a dare un significato.

    Grazie in anticipo per le risposte.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La initList non e' corretta.

    Per esempio, assegni p0 a p->pun ma p0 non e' mai stato inizializzato ...

    Rivedi la logica di questa funzione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Grazie mille, mi ero dimenticato di inizializzare p0=0.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Pacio88
    Grazie mille, mi ero dimenticato di inizializzare p0=0.
    E' un puntatore ... inizializzalo a NULL ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Scusa l'ignoranza, potresti spiegarmi la differenza?Grazie

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Pacio88
    Scusa l'ignoranza, potresti spiegarmi la differenza?Grazie
    http://en.wikipedia.org/wiki/Pointer...e_null_pointer

    Ma se scrivi questo tipo di programmi, dovresti avere almeno queste conoscenze di base ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Hai perfettamente ragione!

    Non voglio scaricare la colpa su nessuno, ma questo è ciò che si insegna nell'università italiana, e il mio testo su cui ho studiato il C++ insegna per l'appunto la creazione di una lista inizializzando il puntatore p0 a 0 e non NULL.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Pacio88
    ... il mio testo su cui ho studiato il C++ ...
    Un testo universitario? Quale?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Dovrebbe essere questo.

    E' un testo a mio parere troppo datato, soprattutto per essere adottato all'università. Io comunque ho preferito a quello il Thinking in C++, ma purtroppo su alcuni aspetti, come è emerso anche prima, sono stato "contaminato".

  10. #10
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Continuando a esercitarmi sulle liste ho modificato il codice precedente. Ancora una volta in compilazione non ho problemi ma quando poi eseguo mi restituisce un errore segmentation fault. Tuttavia non mi capacito di che cosa generi questo problema. Ecco il codice e grazie ancora...
    codice:
    #include <iostream>
    using namespace std;
    
    struct elem{
    	int inf;
    	elem* pun;
    };
    
    class list{
    		elem* p0;
    	public:
    		list();
    		//~list();
    	    void initValueList(int, int);
    		void printList();
    		void pushHead(int);
    		bool popHead();
    		void pushFund(int);
    		bool popFund();
    		int findData(int);
    		int listSize();
    		list orderList();
    		list operator+ (list);
    		list operator[] (list);
    };
    
    list::list(){
    	p0=NULL;
    }
    
    void list::initValueList(int num=0, int value=0){
    	p0=NULL;
    	elem* p=p0;
    	for(int i=0; i<num; i++){
    		p=new elem;
    		p->inf=value;
    		p->pun=p0;
    		p0=p;
    	}	
    }
    
    void list::printList(){
    	elem* p=p0;
    	if(p==NULL)
    		cout << "Empty List\n";
    	else{	
    		while(p!=NULL){
    			cout << "'" << p->inf << "'->";
    			p=p->pun;
    		}
    	cout << "NULL\n";
    	}
    }
    
    void list::pushHead(int value){
    	elem* p=new elem;
    	p->inf=value;
    	p->pun=p0;
    	p0=p;
    }
    
    bool list::popHead(){
    	elem* p;
    	if(p0==NULL)
    		return false;
    	p=p0->pun;
    	p0=p;
    	delete p;
    	return true;
    }		
    		
    
    void list::pushFund(int value){
    	elem* p;
    	elem* q;
    	for(p=p0; p!=NULL; p=p->pun)
    		q=p;
    	p=new elem;
    	p->inf=value;
    	if(p0==NULL)
    		p0=p;
    	else
    		q->pun=p;
    }
    
    bool list::popFund(){
    	elem* p;
    	elem* q;
    	if(p0==NULL)
    		return false;
    	for(q=p0; q->pun!=NULL; q=q->pun)
    		p=q;
    	if(q==p0)
    		p0=NULL;
    	else
    		p->pun=NULL;
    	delete q;	
    	return true;
    }	
    		
    int main(){
    	list l1;
    	l1.initValueList(3, 3);
    	l1.printList();
    	l1.pushHead(5);
    	l1.printList();
    	l1.pushFund(5);
    	l1.printList();
    	l1.popHead();
    	l1.printList();
    	l1.popFund();
    	l1.printList();
    	return 0;
    }

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.