Frank Lioty
23-08-2010, 17:48
Salve a tutti ragazzi (non c'è una sezione di presentazione?). Devo sviluppare un progetto per l'uni e devo scrivere delle funzioni che manipolino delle liste generiche da inserire poi in un opportuno header file.
I prototipi della funzione e le strutture della lista sono qui:
http://pastebin.com/w7HqhQbN
Le funzioni vengono poi "messe sotto stress" tramite un codice di test che cerca eventuali punti critici.
Ho implementato la New_List così:
list_t * new_List(int (* compare) (void *, void *),void* (* copyk) (void *),void* (*copyp) (void*)) {
list_t *t;
t = (list_t*)malloc(sizeof(list_t));
if (t==NULL) return NULL;
t->head = NULL;
t->compare = compare;
t->copyk = copyk;
t->copyp = copyp;
return t;
}
le funzioni passate tramite chiamata di sistema sono fornite dal professore e permettono di costruire liste con elementi aventi per chiavi interi/stringhe ed informazioni (payload) interi/stringhe.
La mia free_List:
void free_List (list_t ** pt) {
if(pt == NULL || *pt == NULL) return;
elem_t *curr = (*pt)->head;
while(curr != NULL)
{
elem_t *temp = curr;
free(curr->key);
free(curr->payload);
free(temp);
temp = (curr->next);
}
free(*pt);
*pt = NULL;
}
I problemi sorgono nel momento in cui nei test si prova a deallocare la lista in seguito ad inserimento di elementi, dandomi SIGABRT. Il debugger mi informa che l'istruzione che dà errore è quella in grassetto nella free_List. Da dire che la deallocazione di liste vuote invece non dà errori.
Altro particolare non da poco è che provando a visualizzare prima della chiamata alla free_List il contenuto della lista, questa non mi restituisce i key ed i payload dei vari elementi (ma solo puntatori a void).
Penso quindi che sia un problema di implementazione della funzione di aggiunta elemento che poi causa un errore nel momento in cui si invoca la free_List. Ecco il codice:
int add_ListElement(list_t * t,void * key, void* payload) {
if (find_ListElement(t, key) != NULL) return -1;
elem_t *new_nodo = malloc(sizeof(elem_t));
if (new_nodo == NULL) return -1;
new_nodo->key = t->copyk(key);
new_nodo->payload = t->copyp(payload);
new_nodo->next = NULL;
new_nodo->next = t->head;
t->head = new_nodo;
return 0;
}
P.S: Invoco la find_ListElement perché non sono tollerati elementi con chiavi replicate
Qualcuno sa dirmi cosa non va? Ci sto sbattendo la testa da 4 giorni ormai...:muro:
I prototipi della funzione e le strutture della lista sono qui:
http://pastebin.com/w7HqhQbN
Le funzioni vengono poi "messe sotto stress" tramite un codice di test che cerca eventuali punti critici.
Ho implementato la New_List così:
list_t * new_List(int (* compare) (void *, void *),void* (* copyk) (void *),void* (*copyp) (void*)) {
list_t *t;
t = (list_t*)malloc(sizeof(list_t));
if (t==NULL) return NULL;
t->head = NULL;
t->compare = compare;
t->copyk = copyk;
t->copyp = copyp;
return t;
}
le funzioni passate tramite chiamata di sistema sono fornite dal professore e permettono di costruire liste con elementi aventi per chiavi interi/stringhe ed informazioni (payload) interi/stringhe.
La mia free_List:
void free_List (list_t ** pt) {
if(pt == NULL || *pt == NULL) return;
elem_t *curr = (*pt)->head;
while(curr != NULL)
{
elem_t *temp = curr;
free(curr->key);
free(curr->payload);
free(temp);
temp = (curr->next);
}
free(*pt);
*pt = NULL;
}
I problemi sorgono nel momento in cui nei test si prova a deallocare la lista in seguito ad inserimento di elementi, dandomi SIGABRT. Il debugger mi informa che l'istruzione che dà errore è quella in grassetto nella free_List. Da dire che la deallocazione di liste vuote invece non dà errori.
Altro particolare non da poco è che provando a visualizzare prima della chiamata alla free_List il contenuto della lista, questa non mi restituisce i key ed i payload dei vari elementi (ma solo puntatori a void).
Penso quindi che sia un problema di implementazione della funzione di aggiunta elemento che poi causa un errore nel momento in cui si invoca la free_List. Ecco il codice:
int add_ListElement(list_t * t,void * key, void* payload) {
if (find_ListElement(t, key) != NULL) return -1;
elem_t *new_nodo = malloc(sizeof(elem_t));
if (new_nodo == NULL) return -1;
new_nodo->key = t->copyk(key);
new_nodo->payload = t->copyp(payload);
new_nodo->next = NULL;
new_nodo->next = t->head;
t->head = new_nodo;
return 0;
}
P.S: Invoco la find_ListElement perché non sono tollerati elementi con chiavi replicate
Qualcuno sa dirmi cosa non va? Ci sto sbattendo la testa da 4 giorni ormai...:muro: