Eccezione C: violazione di accesso in lettura

di il
4 risposte

Eccezione C: violazione di accesso in lettura

Ciao,
quando faccio partire il debug del io programma mi intterompe alla riga scritta in stampatello (l'ultimo ciclo for) indicandomi "Eccezione generata in corrispondenza di 0x00007FF69C7C1EDA in Project1.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0x0000000000000000".
Ho usato questo programma per giorni e non mi ha mai dato questo problema, oggi ha iniziato a fare così senza che io abbia modificato nulla di questa funzione. Dovrebbe essere un problema di puntatori/uso sbagliato della memoria alloata, ma non riesco a capire quale sia il probolmea e perchè sia sorto solo oggi.



typedef struct datolistaTR {         /*Lista di liste*/
	transizione tran;
	struct datolistaTR *dx;
	struct datolistaTR *sub;
}dato;

dato* InserisciOrdine(dato* head, transizione t) {

	dato *nuovo, *p, *h;

	if (nuovo = (dato*)malloc(sizeof(dato))) {
		nuovo->tran.stato_i = t.stato_i;
		nuovo->tran.stato_f = t.stato_f;
		nuovo->tran.letto = t.letto;
		nuovo->tran.scritto = t.scritto;
		nuovo->tran.mossa = t.mossa;
	}
	/*se la lista è vuota*/
	if (head == NULL) {
		nuovo->dx = NULL;
		nuovo->sub = NULL;
		head = nuovo;
		return head;
	}
	/*altrimenti controllo se devo inserire l'elemento come primo*/
	p = head;
	if (p->tran.stato_i > t.stato_i) {
		nuovo->dx = p;
		nuovo->sub = NULL;
		head = nuovo;
		return head;
	}
	/*else, cioè p->tran.stato_i<=t.stato_i*/
	while (p->dx != NULL && p->dx->tran.stato_i <= t.stato_i)
		p = p->dx;
	if (p->tran.stato_i == t.stato_i) {
		if (p->tran.letto > t.letto || (p->tran.letto == t.letto && p->tran.scritto > t.scritto) || (p->tran.letto == t.letto && p->tran.scritto == t.scritto && p->tran.mossa > t.mossa) || (p->tran.letto == t.letto && p->tran.scritto == t.scritto && p->tran.mossa == t.mossa && p->tran.stato_f > t.stato_f)) {
			nuovo->dx = p->dx;      /*Inserisco l'elemento come primo della lista verticale*/
			nuovo->sub = p;
			p->dx = NULL;
			FOR(H=HEAD;H->DX->TRAN.STATO_I != T.STATO_I; H=H->DX)
				;
			h->dx = nuovo;
			return head;
		}
		
		qui la funzione prosegue con altre situazioni di innserimento.

Grazie in anticipo.

4 Risposte

  • Re: Eccezione C: violazione di accesso in lettura

    Intendi dire che il problema sta in

    FOR(H=HEAD;H->DX->TRAN.STATO_I != T.STATO_I; H=H->DX)

    Ma come proviamo il codice dato che ne manca una buona parte? Non è compilabile ... e non esiste un main per provarlo ...
  • Re: Eccezione C: violazione di accesso in lettura

    Si il problema mi viene evidenziato in quella riga.

    Non posso copiare tutto il programma online, speravo qualcuno sapesse aiutarmi così...
  • Re: Eccezione C: violazione di accesso in lettura

    E' molto difficile darti indicazioni precise. Comunque puoi fare un po' di debugging eseguendo passo passo. Probabilmente il valore di

    H->DX

    a un certo punto è NULL (ma non chiedermi perché senza il resto del codice) e ovviamente H->DX->TRAN.STATO_I va in errore.
  • Re: Eccezione C: violazione di accesso in lettura

    Anche io avevo pensato fosse quello il problema, ricontrollerò meglio passo passo, grazie mille comunque
Devi accedere o registrarti per scrivere nel forum
4 risposte