2010-08-17 127 views
1

我正在处理来自哈希表的大数。我想知道在考虑到可移植性的情况下将它们添加到常量(100)中是一种好方法。 Glib的文档强调使用GINT_TO_POINTER不能以任何方式移植。任何想法,将不胜感激!C - Glib 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)); // ? 

回答

0

而不是存储一个指针内的整数,有指针指向的整数:

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); 

对于一个新的值,使用g_malloc

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

为了确保键和值正确销毁,通过析构函数g_freeg_hash_table_new_full

+2

这在技术上是正确的,但由于使用'GINT_TO_POINTER' _is_ portable来存储指针中的32位整数,所以这是不必要的,也是低效的。 – ptomato 2010-08-18 09:18:19

5

我不熟悉的gnome库,但是从GNOME Documentation Library

你不可以 整数中储存一个指针。这是不便携的任何 方式或形式。 这些宏仅允许 允许在指针中存储整数, 并且仅保留 整数的32位; 32位整数范围之外的值将被破坏。

唯一不可移植的是以整数存储指针。如果您只是:

  • 将指针存储为整数。 (不是整数中的指针)。
  • 该整数不超过32位。

它应该没问题。