请考虑以下代码:
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
答案 0 :(得分:0)
也许某些内容在添加到哈希表的时间和在其上调用set_active()
之间删除了对切换按钮的最后一个引用?
但我认为你更有可能没有得到你认为自己的指针。解除引用*GTK_TOGGLE_BUTTON(g_hash_table_lookup(...))
的技巧并没有告诉你关于存储在哈希表中的指针的任何信息; GTK_TOGGLE_BUTTON()
会将任何指针强制转换为GtkToggleButton *
,因此无论您取消引用什么,您都会得到编译器认为是GtkToggleButton
结构的内容。