2010-03-08 4 views
0

J'essaie d'incrémenter la valeur d'une clé spécifique si elle a été trouvée. Pour une raison quelconque, je continue d'obtenir l'adresse (pointeur) lorsque je vide tous les keys:values de la table de hachage.GLib Hash Table - Pointer

Output 
     a: 153654132 // should be 5 
     b: 1 
     c: 153654276 // should be 3 
     d: 1 
     e: 1 
     f: 153654420 // should be 3 


int proc() 
{ 
    struct st stu; 
    gpointer ok, ov; 

    //... some non-related code here 

    if(!g_hash_table_lookup_extended(table, key, &ok, &ov)){ 
     stu.my_int = g_malloc(sizeof(guint)); 
     *(stu.my_int) = 0; 
     g_hash_table_insert(table, g_strdup(key), GINT_TO_POINTER(1)); 
    }else{ 
     stu.my_int = g_malloc(sizeof(guint)); 
     *(stu.my_int)++; 
     g_hash_table_insert(table, g_strdup(key), stu.my_int); 
    } 
} 

Toutes les idées seront en mesure d'apprécier.

+0

FIXE: Je l'ai remplacé le deuxième insert comme: (ov) ++; g_hash_table_insert (table, g_strdup (clé), ov); – Mike

Répondre

1

++ est prioritaire supérieur à *. Donc, vous incrémentez le pointeur stu.my_int lui-même, plutôt que vers quoi il pointe. Vous voulez probablement (* stu.my_int) ++.

1

compté 7 erreurs que je en 8 lignes:

/* 1) ov, the actual value read from the hash table, is never used */ 
if(!g_hash_table_lookup_extended(table, key, &ok, &ov)){ 
    stu.my_int = g_malloc(sizeof(guint)); 
    *(stu.my_int) = 0; 
    /* 2) stu.my_int not freed: memory leak */ 
    g_hash_table_insert(table, g_strdup(key), GINT_TO_POINTER(1)); 
    /* 3) g_strdup(key) not freed: memory leak */ 
}else{ 
    stu.my_int = g_malloc(sizeof(guint)); 
    /* 4) stu.my_int not freed: memory leak */ 
    /* 5) stu.my_int not initialized: stu.my_int contains junk */ 
    *(stu.my_int)++; 
    /* 6) incrementing a pointer, not the value pointed by */ 
    g_hash_table_insert(table, g_strdup(key), stu.my_int); 
    /* 7) g_strdup(key) not freed: memory leak */ 
} 

Voici comment j'écrire que (non testé):

gpointer ov; 
gint value; 

/* ... */ 

if(g_hash_table_lookup_extended(table, key, NULL, &ov)) { 
    value = GPOINTER_TO_INT(ov); 
} else { 
    value = 1; 
} 

g_hash_table_insert(table, key, GINT_TO_POINTER(value)); 
+0

C'est un excellent conseil. – geocar