2010-08-17 129 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位。

它應該沒問題。