gpt4 book ai didi

c - GHashTable 对两个相同输入的响应完全不同

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:11 25 4
gpt4 key购买 nike

以下是我可以创建的问题的最短可编译演示。

查看接近尾声的 printf 调用,输出如下。我不知道为什么两个完全相同的语句可以做到这一点。它可能与输入类型有关,但我看不出它可能是什么。

#include <gtk/gtk.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
int
main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
GtkBuilder * builder = gtk_builder_new ();
GHashTable * table = g_hash_table_new(NULL,NULL);
int i;
char builderdoc[] = "<?xml version=\"1.0\"?>"
"<interface>"
" <requires lib=\"gtk+\" version=\"2.16\"/>"
" <!-- interface-naming-policy project-wide -->"
" <object class=\"GtkCheckButton\" id=\"checkbutton1\">"
" </object>"
"</interface>";

// Load gtkbuilder
gtk_builder_add_from_string (builder, builderdoc, sizeof(builderdoc),NULL);

char * buffer[][2] = {
{"log","checkbutton1"}
};

// Load array of widgets into hash table (Shortened)
for(i = 0; i < sizeof(buffer) / sizeof(char *) / 2; i++){
g_hash_table_insert(table,(gchar *) buffer[i][0],gtk_builder_get_object (builder, (gchar *) buffer[i][1]));
}


// Load xml doc
xmlDocPtr doc;
xmlNodePtr cur;
xmlNodePtr cur2;
char xmldoc[] = "<?xml version=\"1.0\"?>"
"<CsSettings>"
"<options>"
"<check name=\"log\" value=\"1\" />"
"</options>"
"</CsSettings>";

doc = xmlParseMemory(xmldoc, (int) sizeof(xmldoc));
cur = xmlDocGetRootElement(doc);
cur = cur->xmlChildrenNode;

// Find what we're looking for
while (cur != NULL){
if(xmlStrEqual(cur->name, (xmlChar *) "options")){
cur2 = cur->xmlChildrenNode;
while (cur2 != NULL){
if(xmlStrEqual(cur2->name, (xmlChar *) "check")){
// We've found it, now print some output
printf("Plain old lookup: g_hash_table_lookup(table,\"log\"): %p\n",g_hash_table_lookup(table,"log"));
printf("Variable lookup : g_hash_table_lookup(table,\"%s\"): %p\n",(gchar *) xmlGetProp(cur2, (xmlChar *) "name"),g_hash_table_lookup(table,(gchar *) xmlGetProp(cur2, (xmlChar *) "name")));
printf("Xml says we should lookup: '%s'\n",(gchar *) xmlGetProp(cur2, (xmlChar *) "name"));

}
cur2 = cur2->next;
}
}
cur = cur->next;
}

}

以及光彩夺目的困惑输出:

Plain old lookup: g_hash_table_lookup(table,"log"): 0x1e369a0
Variable lookup : g_hash_table_lookup(table,"log"): (nil)
Xml says we should lookup: 'log'

最佳答案

您可能会从哈希表中得到意想不到的行为,因为您没有在构造函数上设置任何哈希或相等函数,在这种情况下,使用 g_direct_hash() 直接对指针进行哈希>g_direct_equal() 函数适用。

如果表的键是gchar *,我会使用g_str_hashg_str_equal。像这样初始化你的表:

GHashTable * table = g_hash_table_new(g_str_hash,g_str_equal);

如果散列表的键是指针所指的内容,则直接对指针进行散列不是一个好主意。请让我们知道这是否解决了问题。

关于c - GHashTable 对两个相同输入的响应完全不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5911144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com