考虑下面的代码:g_hash_table_lookup()不接受变量作为参数
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
呃,它告诉你你正在投射和传入的小部件实际上并不是切换按钮。 – 2011-04-30 15:18:03
但是。或者更确切地说,它是一个GtkCheckButton(它继承自togglebutton)'gtk_toggle_button_set_active'正常工作,如果我传递它'GTK_TOGGLE_BUTTON(gtk_builder_get_object)',而不是将其存储在'GHashTable'中,然后传递它。 – 2011-04-30 16:04:57