GLib:哈希表未正确找到值
GLib: Hashtable not finding values correctly
所以我最近一直在使用GLib的类型,比如lists和maps,但是遇到了一个比较麻烦的问题。
开始时,我这样创建了哈希表:
BoneIdMap = g_hash_table_new(g_direct_hash, g_str_equal);
然后我试了一下,在字符串键上插入一些 uint,它完美地工作:
char* string = alloq_calloc(&model->dynamic, strlen(aimesh->mBones[x]->mName.data) + 1, sizeof(char));
strcpy(string, aimesh->mBones[x]->mName.
if(map_find(&model->BoneIdMap, string, &handle)) {
index = *handle;
} else {
index = model->BoneIdMap.size;
}
map_insert(&model->BoneIdMap, &index, sizeof(uint), string);
请注意:我动态分配指针,那是因为我尝试只传递静态数组但它不起作用(事实证明两者都不起作用)
然后我继续尝试稍后检索这些单位:
char* string = alloq_calloc(&model->dynamic, strlen(ainode->mName.data) + 1, sizeof(char));
strcpy(string, ainode->mName.data);
/* Time to do some debugging */
if(map_find(&model->BoneIdMap, string, &handle)) {
但它根本不起作用...我尝试将所有键检索到一个数组中:
uint len;
char** arr = g_hash_table_get_keys_as_array(model->BoneIdMap.table, &len);
for(int i = 0; i < len; ++i) {
if(arr[i]) printf("Key: %s\n", arr[i]);
if(!strcmp(arr[i], ainode->mName.data)) printf("Yes!\n");
}
printf("----------------------------\n");
而且有效!!! (???)
Key: pelvis
Key: toe.L
Yes!
Key: sheath
Key: lamp
----------------------------
Key: toe.R
Key: shin.L
Key: fingerstip.R
Key: neck
Key: thigh.R
Key: fingers.L
Key: shin.R
Key: spine
Key: lamp
Key: head
Key: fingerstip.L
Key: thm_end.L
Key: thm_end.R
Key: tiptoe.L
Yes!
Key: upperarm.R
请注意,如果我在上面的打印功能之外使用静态字符串添加一个键并尝试找到它,它会起作用!
这让我很困惑......
顺便说一下,mName 是一个 aiString (ASSIMP) --
Public Attributes
char data [MAXLEN]
String buffer.
size_t length
Binary length of the string excluding the terminal 0.
感谢阅读...
您正在使用 g_direct_hash
哈希函数,该函数旨在用于字符串键的 gpointer,请尝试将其更改为 g_str_hash
。
// g_direct_hash implementation seems to be this
guint
g_direct_hash (gconstpointer v)
{
return GPOINTER_TO_UINT (v);
}
至于为什么它与静态字符串文字一起工作,我会说它是针对二进制 space 进行优化的编译器,并将具有相同内容的两个文字折叠到单个数据段记录中,因此它散列相同的指针为什么它看起来可以正常工作,但实际上却没有。
所以我最近一直在使用GLib的类型,比如lists和maps,但是遇到了一个比较麻烦的问题。
开始时,我这样创建了哈希表:
BoneIdMap = g_hash_table_new(g_direct_hash, g_str_equal);
然后我试了一下,在字符串键上插入一些 uint,它完美地工作:
char* string = alloq_calloc(&model->dynamic, strlen(aimesh->mBones[x]->mName.data) + 1, sizeof(char));
strcpy(string, aimesh->mBones[x]->mName.
if(map_find(&model->BoneIdMap, string, &handle)) {
index = *handle;
} else {
index = model->BoneIdMap.size;
}
map_insert(&model->BoneIdMap, &index, sizeof(uint), string);
请注意:我动态分配指针,那是因为我尝试只传递静态数组但它不起作用(事实证明两者都不起作用)
然后我继续尝试稍后检索这些单位:
char* string = alloq_calloc(&model->dynamic, strlen(ainode->mName.data) + 1, sizeof(char));
strcpy(string, ainode->mName.data);
/* Time to do some debugging */
if(map_find(&model->BoneIdMap, string, &handle)) {
但它根本不起作用...我尝试将所有键检索到一个数组中:
uint len;
char** arr = g_hash_table_get_keys_as_array(model->BoneIdMap.table, &len);
for(int i = 0; i < len; ++i) {
if(arr[i]) printf("Key: %s\n", arr[i]);
if(!strcmp(arr[i], ainode->mName.data)) printf("Yes!\n");
}
printf("----------------------------\n");
而且有效!!! (???)
Key: pelvis
Key: toe.L
Yes!
Key: sheath
Key: lamp
----------------------------
Key: toe.R
Key: shin.L
Key: fingerstip.R
Key: neck
Key: thigh.R
Key: fingers.L
Key: shin.R
Key: spine
Key: lamp
Key: head
Key: fingerstip.L
Key: thm_end.L
Key: thm_end.R
Key: tiptoe.L
Yes!
Key: upperarm.R
请注意,如果我在上面的打印功能之外使用静态字符串添加一个键并尝试找到它,它会起作用! 这让我很困惑......
顺便说一下,mName 是一个 aiString (ASSIMP) --
Public Attributes
char data [MAXLEN]
String buffer.
size_t length
Binary length of the string excluding the terminal 0.
感谢阅读...
您正在使用 g_direct_hash
哈希函数,该函数旨在用于字符串键的 gpointer,请尝试将其更改为 g_str_hash
。
// g_direct_hash implementation seems to be this
guint
g_direct_hash (gconstpointer v)
{
return GPOINTER_TO_UINT (v);
}
至于为什么它与静态字符串文字一起工作,我会说它是针对二进制 space 进行优化的编译器,并将具有相同内容的两个文字折叠到单个数据段记录中,因此它散列相同的指针为什么它看起来可以正常工作,但实际上却没有。