PDA

Visualizza la versione completa : C++ coda con priorità, metodo inserisci


pietrol83
04-04-2012, 16:20
ciao sto implementando una coda con priorità utilizzando una realizzazione con lista ordinata di nodi. sto facnedo il metodo inserisci che prende un valore e una priorità, crea un nodo e lo mette nella posizione di competenza nella lista. il metodo che stro creando mi funziona per l'inserimento dei primi 2 nodi, poi quando ne metto un altro con priorità minore (la priorità maggiore si ha con un numero intero minore) il metodo va in crash ma non so qual'è l'istruzione che dà problemi. ho provato a fare il debug ma questo non parte.
posto il codi del metodo, magari qualche anima buona mi aiuta a capire dove si trova l'istruzione errata.

pricodalo.h


template<class tipoelem>
void pricodalo<tipoelem>::inserisci(tipoelem elem)
{
cout << "inserire la priorita' da associare al valore " << elem << ": ";
int priority;
cin >> priority;

if(this->pricodavuota())
{
pric = new nodopricoda<tipoelem>;
pric->setelem(elem);
pric->setpri(priority);
}
else
{
nodopricoda<tipoelem> *tmp = pric;
bool trovato = false;
while(!trovato && (tmp != NULL))
{
if(priority < tmp->getpri())
{
nodopricoda<tipoelem> tmp2;
if(tmp == pric)
{
tmp2.setsuc(tmp);
tmp->setprec(&tmp2);
pric = &tmp2;
}
else
{
tmp2.setsuc(tmp);
tmp2.setprec(tmp->getprec());
(tmp->getprec())->setsuc(&tmp2);
tmp->setprec(&tmp2);
}
tmp2.setelem(elem);
tmp2.setpri(priority);
trovato = true;
}
else
tmp = tmp->getsuc();
}
if(!trovato)
{
tmp = pric;
while(tmp->getsuc() != NULL)
tmp = tmp->getsuc();

nodopricoda<tipoelem> tmp2;
tmp->setsuc(&tmp2);
tmp2.setprec(tmp);
tmp2.setelem(elem);
tmp2.setpri(priority);
}
}
}


le stro provando tutte ma niente da fare.

oregon
04-04-2012, 16:27
Ma com'è che non riesci ad individuare la linea (o almeno il metodo) in cui avviene il problema?

E' vero che le anime buone lo possono fare per te ma non sempre si ha tempo ...

Non puoi fare uno sforzo per individuare la linea eseguendo passo passo il codice?

Anche perché per farlo al posto tuo si dovrebbe avere *tutto* il codice con un main di prova e non solo il metodo in questione ...

pietrol83
04-04-2012, 16:29
oregon non immagini quante volte sto eseguendo il codice passo passo e non immagini nemmeno le parolacce che sto dicendo avanti al computer per riuscire a trovare questa maledettissima linea di codice che non va.

oregon
04-04-2012, 16:48
Originariamente inviato da pietrol83
oregon non immagini quante volte sto eseguendo il codice passo passo e non immagini nemmeno le parolacce che sto dicendo avanti al computer per riuscire a trovare questa maledettissima linea di codice che non va.

Ti comprendo ... non so cosa usi ma quando eseguo passo passo del codice (uso Visual Studio), diciamo che la prima (o al massimo la seconda) volta che eseguo il codice mi faccio subito un'idea di dove sia il problema. Qualche minuto dopo lo individuo con precisione ... (sarà che non usi lo strumento giusto ...).

Ovviamente a patto che non manchi nulla nel codice (ovvero che sia compilabile ed eseguibile) rispetto a quello che provi tu ...

pietrol83
04-04-2012, 16:53
oregon io sto preparando un esame e la prof vuole che usiamo esclusivamente il dev C++. come ho scritto sopra, ho provato a fare il debug ma non parte.
ho provato a fare anche i disegnini su carta eseguento il codice una istruzione alla volta ma mi sembra che tutto va bene, invece il programma va in crash, ho provato a mettere un system("pause") prima di ogni istruzione ma niente da fare.

oregon
04-04-2012, 16:58
Originariamente inviato da pietrol83
oregon io sto preparando un esame e la prof vuole che usiamo esclusivamente il dev C++. come ho scritto sopra, ho provato a fare il debug ma non parte.

Ah ... ok ... questo è il problema dell'università italiana ... si vede che la prof. non ha mai provato a fare debugging con DevC++ ...

Come ti dicevo, ti posso dare una mano, ma con tutto il codice che stai provando tu, completo e compilabile ... magari invia uno zip

pietrol83
04-04-2012, 17:24
questo è l'archivio contenente tutto il codice necessario.

https://skydrive.live.com/redir.aspx?cid=f9fe0d3e54198821&resid=F9FE0D3E54198821!592&parid=root

oregon
04-04-2012, 20:31
Ho visto ... eseguendo in debugging passo passo, l'errore avviene in questo ciclo



while(tmp->getsuc() != NULL)
tmp = tmp->getsuc();


perché, ad un certo punto, il valore restituito da tmp->getsuc() e quindi assegnato nuovamente a tmp non è valido ma non è neanche NULL.

Se ad un certo punto della catena si ha un puntatore non valido vuol dire che durante una inizializzazione di un nodo hai dimenticato di impostare a NULL i puntatori precedente e successivo.

shodan
04-04-2012, 22:46
Accade anche quando si vogliono memorizzare puntatori a variabili stack based, dimenticando che una volta uscite dallo scope, tali variabili sono spazzatura.


nodopricoda<tipoelem> tmp2;
tmp->setsuc(&tmp2);




questo è il problema dell'università italiana ... si vede che la prof. non ha mai provato a fare debugging con DevC++ ...

Il che mi conferma sempre più l'enorme divario tra l'università e il mondo reale.

oregon
04-04-2012, 22:50
Originariamente inviato da shodan
Accade anche quando si vogliono memorizzare puntatori a variabili stack based, dimenticando che una volta uscite dallo scope, tali variabili sono spazzatura.

Vero, ma in questo caso il debugger mi indica che il valore del puntatore è

0xcccccccc

che per Visual C++ è il valore impostato dal debugger per inizializzare il debugger. Quel valore indica che il puntatore non è mai stato scritto dal programma.





nodopricoda<tipoelem> tmp2;
tmp->setsuc(&tmp2);



:incupito:

Loading