VendeR
02-05-2007, 20:57
Ciao a tutti!
avrei un problema con una funzione funzione che agisce su una lista.. la cosa stranissima è che se faccio il debug (uso dev-c++) non ho nessun problema ed il programma funziona benissimo..vedo prima di tutto di spiegarmi su come è creata la lista.
La testa della lista è vuota, ed ogni elemento è fatto in questo modo:
typedef struct elem_t{
BASE val;
struct elem_t* next;
} elem;
BASE è un'altra struttura (definita sempre con una typedef) che include i vari campi del mio elemento (alcuni interi ed un paio di stringhe).
I vari elementi della lista sono caricati da un file di testo.. ed ho voluto creare una funzione che mi elimini le eventuali voci duplicate.
int del_dup(elem* P_list){
int i = 0; /* # voci eliminate */
int flag = 0,n;
elem *p, *q, *s;
s = P_list->next;
while(s != NULL){
p = s;
q = s->next;
while(q != NULL){
for(n=0; n<N_COMPARE && (BASE_cmp(s->val,q->val,n)==0); n++);
if (n == N_COMPARE){
p->next = q->next;
free(&(q->val));
free(q);
i++;
q = p->next;
}else{
p = q;
q = q->next;
}
}
s = s->next;
}
return(i);
}
In pratica tengo un elemento fisso e poi lo confronto con tutti i successivi.. e se trovo una coincidenza la elimino.
La funzione BASE_cmp è sempre mia e confronta, in base al valore di n passato, un campo diverso della strutture BASE, e con il for dove l'ho inserita controllo ogni campo del mi elemento, per essere sicuro che siano uguali in tutto (e non solo simili..).
Per testare la funzione faccio caricare nella lista 8 volte lo stesso elemento(in pratica c'è solo quello).. E come ho detto prima se eseguo il tutto in modalità debug funziona perfettamente, mentre in modalità normale crasha! secondo me questo ha dell'incredibile.. ho notato che se nella lista ci sono al massimo 5 voci uguali funziona perfettamente anche in modalità normale..
Ok, in realtà non accadrà mai di avere più di 5 voci consecutive identiche.. però non è giusto che si comporti in quel modo, oltretutto ho già riguardato un sacco di volte il codice ed a me sembra (a logica) tutto corretto..
A questo punto mi affido a voi:)
Grazie 1000 in anticipo!
Vender
avrei un problema con una funzione funzione che agisce su una lista.. la cosa stranissima è che se faccio il debug (uso dev-c++) non ho nessun problema ed il programma funziona benissimo..vedo prima di tutto di spiegarmi su come è creata la lista.
La testa della lista è vuota, ed ogni elemento è fatto in questo modo:
typedef struct elem_t{
BASE val;
struct elem_t* next;
} elem;
BASE è un'altra struttura (definita sempre con una typedef) che include i vari campi del mio elemento (alcuni interi ed un paio di stringhe).
I vari elementi della lista sono caricati da un file di testo.. ed ho voluto creare una funzione che mi elimini le eventuali voci duplicate.
int del_dup(elem* P_list){
int i = 0; /* # voci eliminate */
int flag = 0,n;
elem *p, *q, *s;
s = P_list->next;
while(s != NULL){
p = s;
q = s->next;
while(q != NULL){
for(n=0; n<N_COMPARE && (BASE_cmp(s->val,q->val,n)==0); n++);
if (n == N_COMPARE){
p->next = q->next;
free(&(q->val));
free(q);
i++;
q = p->next;
}else{
p = q;
q = q->next;
}
}
s = s->next;
}
return(i);
}
In pratica tengo un elemento fisso e poi lo confronto con tutti i successivi.. e se trovo una coincidenza la elimino.
La funzione BASE_cmp è sempre mia e confronta, in base al valore di n passato, un campo diverso della strutture BASE, e con il for dove l'ho inserita controllo ogni campo del mi elemento, per essere sicuro che siano uguali in tutto (e non solo simili..).
Per testare la funzione faccio caricare nella lista 8 volte lo stesso elemento(in pratica c'è solo quello).. E come ho detto prima se eseguo il tutto in modalità debug funziona perfettamente, mentre in modalità normale crasha! secondo me questo ha dell'incredibile.. ho notato che se nella lista ci sono al massimo 5 voci uguali funziona perfettamente anche in modalità normale..
Ok, in realtà non accadrà mai di avere più di 5 voci consecutive identiche.. però non è giusto che si comporti in quel modo, oltretutto ho già riguardato un sacco di volte il codice ed a me sembra (a logica) tutto corretto..
A questo punto mi affido a voi:)
Grazie 1000 in anticipo!
Vender