typedef gchar* String;
typedef gboolean Boolean;
struct ddata
{
int typ;
union{
gchar* a;
};
};
typedef struct ddata* ddata;
一个示例结构,其实例被插入表中。
Boolean equals_ddata(ddata a, ddata b)
{
if (a == NULL || b == NULL)
{
printf("\nNULL\n");
return 0;
}
if (a->typ == b->typ)
{
switch(a->typ)
{
case 1:
{
if(strcmp(a->a, b->a) == 0)
return TRUE;
break;
}
default:
return TRUE;
}
}
return FALSE;
}
Boolean hm_equals_ddata(gconstpointer a, gconstpointer b) {
if (((ddata)a) == NULL || ((ddata)b) == NULL) {
printf("Key for comparison is NULL in hm_equals_ddata");
return 0;
}
return equals_ddata((ddata)a, (ddata)b);
}
int main()
{
ddata obj1 = (ddata)malloc(sizeof(struct ddata));
ddata obj2 = (ddata)malloc(sizeof(struct ddata));
ddata obj3 = (ddata)malloc(sizeof(struct ddata));
obj1->typ = 1;
obj1->a = g_strdup("vijay");
obj2->typ = 1;
obj2->a = g_strdup("vijay");
obj3->typ = 2;
obj3->a = g_strdup("kumar");
printf("\n%s, %s, %s\n", obj1->a, obj2->a, obj3->a);
GHashTable* c = g_hash_table_new(g_double_hash, hm_equals_ddata);
printf("%d\n", g_hash_table_insert(c, obj1, NULL));
printf("%d\n", g_hash_table_insert(c, obj2, NULL));
printf("%d\n", g_hash_table_insert(c, obj3, NULL));
printf("%d\n", g_hash_table_contains(c, obj3));
return 0;
}
在这里g_hash_table_contains
有时无法正常工作。创建哈希表时附加的equals函数不会被
g_hash_table_contains
,这是由于g_double_hash
功能所致。所以任何人都可以解释这种不确定的行为。
答案 0 :(得分:0)
哈希和相等函数适用于哈希表条目中的键,而不适用于值。您的代码插入了sudo service apache2 restart
类型的键(以及ddata
的值),但是然后尝试将它们散列为double值,并将相等的键比较为NULL
s。
尝试使用ddata
代替g_direct_hash
。