PDA

Visualizza la versione completa : [C++] Bus error in programma compilazione


Pacio88
03-12-2008, 23:43
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:

#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.

oregon
03-12-2008, 23:57
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 ...

Pacio88
04-12-2008, 00:02
Grazie mille, mi ero dimenticato di inizializzare p0=0.

oregon
04-12-2008, 00:07
Originariamente inviato da Pacio88
Grazie mille, mi ero dimenticato di inizializzare p0=0.

E' un puntatore ... inizializzalo a NULL ...

Pacio88
04-12-2008, 00:10
Scusa l'ignoranza, potresti spiegarmi la differenza?Grazie

oregon
04-12-2008, 00:14
Originariamente inviato da Pacio88
Scusa l'ignoranza, potresti spiegarmi la differenza?Grazie

http://en.wikipedia.org/wiki/Pointer_(computing)#The_null_pointer

Ma se scrivi questo tipo di programmi, dovresti avere almeno queste conoscenze di base ...

Pacio88
04-12-2008, 00:18
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.

oregon
04-12-2008, 00:24
Originariamente inviato da Pacio88
... il mio testo su cui ho studiato il C++ ...

Un testo universitario? Quale?

Pacio88
04-12-2008, 00:34
Dovrebbe essere questo (http://www.pangloss.it/libro.php?isbn=8846435338&id=9932).

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".

Pacio88
06-12-2008, 11:02
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...

#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;
}

Loading