PDA

Visualizza la versione completa : [c++] Memoria non poteva essere Written


MeSo
05-02-2008, 11:39
Salve a tutti, ho realizzato la struttura dati Coda con i puntatori. Però quando vado a testare il programma la compilazione va bene ma quando lo eseguo ci deve essere qualche errore di logica che non riesco a capire perchè il programma si blocca, mi compare una finestra di windows che mi dice:
L'istruzione a "0x00410bb0" ha fatto riferimento alla memoria a "0x77c0b814". La memoria non poteva essere "written".
Fare clic su ok per terminare l'applicazione
fare clic su annulla per eseguire il debug dell'applicazione

vi posto il codice che ho scritto:


#ifndef _codap_h
#define _codap_h
#include <iostream>
using namespace std;

//cella generica
template <class Tipo>
struct cella{
Tipo info;
cella<Tipo> *succ;
};
//la Coda è formata da 2 puntatori di tipo cella uno all'inizio della coda e uno alla fine
template <class Tipo>
struct codap{
cella<Tipo> *inizio;
cella<Tipo> *fine;
};

//La Coda:
template <class Tipo>
class Coda
{
public:
Coda();//costruttore
~Coda();//distruttore
//operatori della Coda
void creaCoda();
bool codaVuota();
Tipo leggiCoda();
void inCoda(Tipo);
void fuoriCoda();
bool appartiene(Tipo); //operatore aggiunto
private:
codap<Tipo> *coda;
};

//costruttre
template <class Tipo>
Coda<Tipo>::Coda()
{
creaCoda();
}

//distruttore
template <class Tipo>
Coda<Tipo>::~Coda()
{
if(!codaVuota())
{
cella<Tipo> *tmp = coda->inizio;
while(tmp!= NULL)
{
cella<Tipo> *tmp1= tmp->succ;
delete(tmp);
tmp=tmp1;
}
}
}

//Creacoda crea una nuova coda vuota
template <class Tipo>
void Coda<Tipo>::creaCoda()
{
coda->inizio = NULL;
}

//indica se una coda è vuota
template <class Tipo>
bool Coda<Tipo>::codaVuota()
{
return (coda->inizio == NULL);
}

//leggiCoda legge il contenuto di una cella
template <class Tipo>
Tipo Coda<Tipo>::leggiCoda()
{
if(!codaVuota())
return (coda->inizio->info);
else
cout<<"ERRORE: leggiCoda() a coda vuota!"<<endl;
}

//inCoda inserisce un nuovo elemento alla fine della codaù
template <class Tipo>
void Coda<Tipo>::inCoda(Tipo e)
{
if (codaVuota())
{
coda->inizio = coda->fine = new cella<Tipo>;
}
else
{
coda->fine->succ = new cella<Tipo>;
coda->fine = coda->fine->succ;
}
coda->fine->info = e;
coda->fine->succ = NULL;
}

//fuoriCoda elimina l'elemento in cima alla coda
template <class Tipo>
void Coda<Tipo>::fuoriCoda()
{
if(!codaVuota())
{
cella<Tipo> *tmp = coda->inizio;
coda->inizio = coda->inizio->succ;
delete (tmp);
}else
cout<<"ERRORE: fuoriCoda() a coda vuota!"<<endl;
}

//la funzione appartiene indica se un elemento si trova nella coda
template <class Tipo>
bool Coda<Tipo>::appartiene(Tipo e)
{
bool ret = false;
cella<Tipo> *tmp = coda->inizio;
while((tmp != NULL)&& (!ret))
{
if (tmp->info == e)
ret = true;
else
tmp = tmp->succ;
}
return ret;
}

#endif



e il relatico main


#include "Coda.h"
#include <iostream>

using namespace std;

//main
int main()
{
Coda<int> c;

c.inCoda(1);
c.inCoda(2);
c.inCoda(3);
c.inCoda(4);

cout<<"Stampo una Coda generica:\n"<<endl;
while(!c.codaVuota())
{
cout<<c.leggiCoda()<<endl;
c.fuoriCoda();
}


system("PAUSE");
return 0;

}



mi dite come mai mi da questo problema???
Grazie in anticipo a tutti e ciao

MacApp
05-02-2008, 11:56
non riesci a "debuggare"?

oregon
05-02-2008, 12:17
L'errore viene generato in partenza da

coda->inizio = NULL;

in quanto

coda

e' un puntatore il cui spazio non e' stato mai allocato.

MeSo
05-02-2008, 22:28
lo fa anche se metto:
coda->inizio = new (cella<Tipo>);
coda->inizio = NULL;

boo non riesco a capire!

oregon
05-02-2008, 23:22
Ma cosa c'entra?

E' lo spazio per

coda

che non esiste !

MeSo
06-02-2008, 18:45
Grazie mille Oregon, non avevo fatto caso al puntatore più importante, cioè quello che implementa realmente la coda! che stupido!Ora funziona alla grande!
GRAZIE MILLE ancora e ciao a tutti

Loading