Eccezione C: violazione di accesso in lettura

di Anonimizzato24199 il
4 risposte
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

  • 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 ...
  • Si il problema mi viene evidenziato in quella riga.

    Non posso copiare tutto il programma online, speravo qualcuno sapesse aiutarmi così...
  • 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.
  • 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