2010-08-17 6 views
1

J'ai affaire à de gros nombres provenant de la table de hachage. Je me demande ce qui serait un bon moyen de les ajouter à une constante (100) en tenant compte de la portabilité. La documentation de Glib souligne que l'utilisation de GINT_TO_POINTER n'est en aucun cas portable. Toute idée serait appréciée!C - Glib Portabilité GINT_TO_POINTER

gpointer v, old_key; 
gint value; // ? 

if(g_hash_table_lookup_extended(table, key, &old_key, &v)){ 
    value = GPOINTER_TO_INT(v); // ? 
    value = value + 100; 
} 
g_hash_table_replace(table, g_strdup(key), GINT_TO_POINTER(value)); // ? 

Répondre

0

Plutôt que de stocker un nombre entier à l'intérieur d'un pointeur, ont le point de pointeur vers un entier:

gpointer v, old_key; 
int *int_v; 
if(g_hash_table_lookup_extended(table, key, &old_key, &v)){ 
    int_v = (int *)v; 
    int new_value = *int_v + 100; 
    int_v = g_malloc(sizeof(int)); 
    *int_v = new_value; 
} 
g_hash_table_replace(table, g_strdup(key), int_v); 

Pour une nouvelle valeur, utilisez g_malloc:

// ... 
int *value = g_malloc(sizeof(int)); 
// ... 
g_hash_table_insert(table, key, value); 

Pour vérifier que les clés et les valeurs sont détruites correctement, transmettent les fonctions de destructeur comme g_free à g_hash_table_new_full.

+2

Ceci est techniquement correct, mais puisque l'utilisation de 'GINT_TO_POINTER' _is_ portable pour stocker des entiers de 32 bits dans les pointeurs, il est inutile et inefficace. – ptomato

5

Je ne suis pas familier avec la bibliothèque de gnome, mais de GNOME Documentation Library:

Vous ne pouvez pas MAGASIN DANS REPÈRES ENTIERS. CECI N'EST PAS PORTATIF DANS UNE FORME . Ces macros UNIQUEMENT permettent de stocker des nombres entiers dans des pointeurs, et ne conservent que 32 bits de l'entier ; Les valeurs en dehors de la plage d'un entier de 32 bits seront altérées.

La seule chose non portable est de stocker des pointeurs dans des entiers. Si vous juste:

  • Stockez des entiers dans des pointeurs. (pas de pointeurs en entier).
  • L'entier ne dépasse pas 32 bits.

Ça va aller.