lefantome
22-11-2010, 23:19
Purtroppo sono morto e non riesco a trovare l'errore anche perché se gli do la via io mi funziona ma tramite script bash utilizzato per il test mi incappa in un errore.
Allora ho queste strutture banali:
(Versione a Colori su pastebin: http://pastebin.com/xkDcaxkf )
AGGIORNAMENTO: valgrind mi da "invalid read of size 4" soltanto appena accede all'ultima table[i] con i =size-1, poi comunque se lo richiedo, mi stampa gli elementi di table[size-1]. Pazzesco! O.o
Potrei avere allocato male la memoria da qualche parte?:look:
Lista
typedef struct {
/** la testa della lista */
elem_t * head;
/** la funzione per confrontare due chiavi */
int (* compare) (void *, void *);
/** la funzione per copiare una chiave */
void * (* copyk) (void *);
/** la funzione per copiare un payload*/
void * (* copyp) (void *);
} list_t;
Tabella Hash
typedef struct {
/** la tabella hash */
list_t ** table;
/** l'ampiezza della tabella */
unsigned int size;
/** la funzione per confrontare due chiavi */
int (* compare) (void *, void *);
/** la funzione per copiare una chiave */
void * (* copyk) (void *);
/** la funzione per copiare un payload*/
void * (* copyp) (void *);
/** la funzione hash*/
unsigned int (* hash) (void *,unsigned int);
} hashTable_t;
Qui é come istanzio la tabella hash:
hashTable_t * new_hashTable (unsigned int size, /*puntatori a funzione vari/*){
hashTable_t* t;
int i;
/* alloca una struct hashTable_t */
t = (hashTable_t*)malloc(sizeof(hashTable_t));
if (t == NULL){ return NULL;} /* ritorna NULL se malloc fallisce SETTARE ERNO*/
/* alloca lo spazio necessario per tutto l'array di liste */
t->size = size;
t->table = (list_t **) malloc(size * sizeof(list_t *) );
if (t->table == NULL){ return NULL;} /* ritorna NULL se malloc fallisce SETTARE ERNO*/
/* setta tutte le liste inizialmente a null */
for(i=0; i <t->size; i++) {
t->table[i] = NULL;
}
/*funzioni puntate */
}
Questa é l'algoritmo che funziona ma nel quale valgrind vede problemi e non fa tramite script bash.
Mi da errore direttamente nel primo ciclo for.
int msgList(hashTable_t* hs, char** s){
char*t = NULL;
char*u = NULL;
list_t* p;
elem_t *q;
int i =0;
int slen=0;
*s = (char*)malloc(sizeof(char)*6+1);
strcpy(*s,"[LIST]");
Ora hs->table[i] può essere ==NULL ma non accendo a niente se lo é eppure di midce che ho una lettura non valida di taglia 4 :fermosi:
for(p = hs->table[i];i < hs->size;p = hs->table[i])
{
if(p != NULL)
{ if( p->head != NULL)
{
for(q = p->head;q !=NULL;q=q->next)
{
int* c= q->payload;
if ( *c !=-1)
{
t = (char*)malloc(sizeof(char)*slen+sizeof(char)*strlen(q->key)+2);
if(u != NULL)
{
Allora ho queste strutture banali:
(Versione a Colori su pastebin: http://pastebin.com/xkDcaxkf )
AGGIORNAMENTO: valgrind mi da "invalid read of size 4" soltanto appena accede all'ultima table[i] con i =size-1, poi comunque se lo richiedo, mi stampa gli elementi di table[size-1]. Pazzesco! O.o
Potrei avere allocato male la memoria da qualche parte?:look:
Lista
typedef struct {
/** la testa della lista */
elem_t * head;
/** la funzione per confrontare due chiavi */
int (* compare) (void *, void *);
/** la funzione per copiare una chiave */
void * (* copyk) (void *);
/** la funzione per copiare un payload*/
void * (* copyp) (void *);
} list_t;
Tabella Hash
typedef struct {
/** la tabella hash */
list_t ** table;
/** l'ampiezza della tabella */
unsigned int size;
/** la funzione per confrontare due chiavi */
int (* compare) (void *, void *);
/** la funzione per copiare una chiave */
void * (* copyk) (void *);
/** la funzione per copiare un payload*/
void * (* copyp) (void *);
/** la funzione hash*/
unsigned int (* hash) (void *,unsigned int);
} hashTable_t;
Qui é come istanzio la tabella hash:
hashTable_t * new_hashTable (unsigned int size, /*puntatori a funzione vari/*){
hashTable_t* t;
int i;
/* alloca una struct hashTable_t */
t = (hashTable_t*)malloc(sizeof(hashTable_t));
if (t == NULL){ return NULL;} /* ritorna NULL se malloc fallisce SETTARE ERNO*/
/* alloca lo spazio necessario per tutto l'array di liste */
t->size = size;
t->table = (list_t **) malloc(size * sizeof(list_t *) );
if (t->table == NULL){ return NULL;} /* ritorna NULL se malloc fallisce SETTARE ERNO*/
/* setta tutte le liste inizialmente a null */
for(i=0; i <t->size; i++) {
t->table[i] = NULL;
}
/*funzioni puntate */
}
Questa é l'algoritmo che funziona ma nel quale valgrind vede problemi e non fa tramite script bash.
Mi da errore direttamente nel primo ciclo for.
int msgList(hashTable_t* hs, char** s){
char*t = NULL;
char*u = NULL;
list_t* p;
elem_t *q;
int i =0;
int slen=0;
*s = (char*)malloc(sizeof(char)*6+1);
strcpy(*s,"[LIST]");
Ora hs->table[i] può essere ==NULL ma non accendo a niente se lo é eppure di midce che ho una lettura non valida di taglia 4 :fermosi:
for(p = hs->table[i];i < hs->size;p = hs->table[i])
{
if(p != NULL)
{ if( p->head != NULL)
{
for(q = p->head;q !=NULL;q=q->next)
{
int* c= q->payload;
if ( *c !=-1)
{
t = (char*)malloc(sizeof(char)*slen+sizeof(char)*strlen(q->key)+2);
if(u != NULL)
{