g_hash_table_lookup()不接受变量作为参数

时间:2011-04-30 15:04:36

标签: c casting gtk

请考虑以下代码:

gtk_widget_show(g_hash_table_lookup(widgetbuffer,"togglebutton"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_hash_table_lookup(widgetbuffer,"togglebutton"))),TRUE);

第一行工作正常,第二行抛出此错误:

Gtk-CRITICAL **: gtk_toggle_button_set_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed

这是为什么?如果g_hash_table_lookup返回一个gtk_widget_show处理得很好的GtkWidget指针,为什么不能GTK_TOGGLE_BUTTON()正确地转换它的类型?

(另外,gtk_toggle_button_set_active在编译时不会导致错误,仅在运行时)

编辑:为清楚起见, 是一个gtktogglebutton(请注意dereferencer以及它现在如何导致错误):

gtk_toggle_button_set_active(*GTK_TOGGLE_BUTTON(g_hash_table_lookup(widgetbuffer,"togglebutton"))),TRUE);
note: expected ‘struct GtkToggleButton *’ but argument is of type ‘GtkToggleButton’

然而

printf("Pointer: %p\n",GTK_TOGGLE_BUTTON(g_hash_table_lookup(widgetbuffer,(gchar *) xmlGetProp(cur2, (xmlChar *) "name"))));
printf("Xml data: %s\n",xmlGetProp(cur2, (xmlChar *) "name"));
printf("hash table output pointer: %p\n\n",g_hash_table_lookup(widgetbuffer,xmlGetProp(cur2, (xmlChar *) "name")));

彻底混淆。

典型输出:

Pointer: (nil)
Xml data: log
hash table output pointer: (nil)

只是为了确保:

printf("Manual hash table output pointer: %p\n", g_hash_table_lookup(widgetbuffer,(gchar *) "log"));
printf("Manual hash table output pointer: %p\n", g_hash_table_lookup(widgetbuffer,"log"));
printf("Manual hash table output pointer: %p\n", g_hash_table_lookup(widgetbuffer,"(char *) log"));

所有回报:

Manual hash table output pointer: 0x1e08430

1 个答案:

答案 0 :(得分:0)

也许某些内容在添加到哈希表的时间和在其上调用set_active()之间删除了对切换按钮的最后一个引用?

但我认为你更有可能没有得到你认为自己的指针。解除引用*GTK_TOGGLE_BUTTON(g_hash_table_lookup(...))的技巧并没有告诉你关于存储在哈希表中的指针的任何信息; GTK_TOGGLE_BUTTON()会将任何指针强制转换为GtkToggleButton *,因此无论您取消引用什么,您都会得到编译器认为是GtkToggleButton结构的内容。