PDA

View Full Version : Aiuto su codice c++


elgordoo
03-10-2006, 11:11
Salve a tutti
premetto che sono alle prime armi con il c++ , nn riesco proprio a capire perchè mi da errore in esecuzione questo codice

class contesto
{
private:
list<int> **m;
public:
contesto();
};

contesto::contesto()
{
m = new list<int>*[2];
m[0]->push_back(1);
m[0]->push_back(2);

m[1]->push_back(3);
m[1]->push_back(4);
}

E nel main una semplice dichiarazione
int main()
{
contesto *p=new contesto();
}

Il compilatore dice che va bene.. ma in esecuzione mi si blocca... E se non inserisco elementi nella lista tutto funziona.

Grazie per ora dei vostri consigli

cionci
03-10-2006, 14:15
Salve a tutti
premetto che sono alle prime armi con il c++ , nn riesco proprio a capire perchè mi da errore in esecuzione questo codice

Il compilatore dice che va bene.. ma in esecuzione mi si blocca... E se non inserisco elementi nella lista tutto funziona.

Grazie per ora dei vostri consigli
Se vuoi fare un vettore dinamico di list allora devi fare cosi':

class contesto
{
private:
list<int> *m;
public:
contesto();
};

contesto::contesto()
{
m = new list<int>[2];
m[0].push_back(1);
m[0].push_back(2);

m[1].push_back(3);
m[1].push_back(4);
}
Se non sono arrugginito dovrebbe andare bene :)

elgordoo
03-10-2006, 18:20
Intanto grazie


La differenza praticamente e questa

list<int> **m; (scritta da me)
a questa
list<int> *m; (scritta da te)


puoi spiegarmi perchè il compilatore non segnalava errori?
Cioè quello che ho scritto io, era effettivamente una dichiarazione di un puntatore ad un array di puntatori a liste? (oppure ho dichiarato chissa cosa)

cionci
03-10-2006, 22:34
Tu hai dichiarato un puntatore a puntatore a List<int>...hai allocato due puntatori a list<int>, ma non hai allocato list<int> all'indirizzo puntato da m[0] e m[1]...l'errore non lo può dare in compilazione perchè il tipo era giusto (m[0]-> accedeva in questo caso ad un oggetto di tipo list<int>, quindi il tipo torna, ma tale oggetto non era allocato ed in quanto tale genera l'errore a runtime)...

In questo caso si fa lo stesso discorso che si fa per i vettori dinamici di interi:

int *a;
a = new int[2];

Se avessi voluto far tornare tutto, sarebbe bastato aggiungere:

*m[0] = new list<int>;
*m[1] = new list<int>;

elgordoo
04-10-2006, 18:21
ottimo direi

grazie ancora