1

ハッシュテーブルからの多数を扱っています。移植性を考慮して、それらを定数 (100) に追加する良い方法は何でしょうか。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)); // ?
4

2 に答える 2

5

私はgnomeライブラリに精通していませんが、GNOMEドキュメントライブラリから:

ポインタを整数に格納することはできません。これは、いかなる形や形でも持ち運びできません。これらのマクロは、整数をポインタに格納することのみを許可し、整数の32ビットのみを保持します。32ビット整数の範囲外の値はマングルされます。

移植性がない唯一のことは、ポインタを整数で格納することです。あなただけの場合:

  • 整数をポインタに格納します。(整数のポインターではありません)。
  • 整数は32ビットを超えません。

大丈夫です。

于 2010-08-17T04:50:47.400 に答える
1

ポインタ内に整数を格納するのではなく、ポインタが整数を指すようにします。

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_freeますg_hash_table_new_full

于 2010-08-17T04:47:27.800 に答える