2011-04-30 157 views
1

考虑下面的代码: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 
+0

呃,它告诉你你正在投射和传入的小部件实际上并不是切换按钮。 – 2011-04-30 15:18:03

+0

但是。或者更确切地说,它是一个GtkCheckButton(它继承自togglebutton)'gtk_toggle_button_set_active'正常工作,如果我传递它'GTK_TOGGLE_BUTTON(gtk_builder_get_object)',而不是将其存储在'GHashTable'中,然后传递它。 – 2011-04-30 16:04:57

回答

0

也许有些事情的最后一个引用删除您切换按钮的时间之间当它被添加到散列表并且当你打电话给set_active()吗?

但我认为你更有可能没有明确指出你认为你是谁。你取消引用*GTK_TOGGLE_BUTTON(g_hash_table_lookup(...))的技巧不会告诉你有关存储在散列表中的指针的任何信息; GTK_TOGGLE_BUTTON()可以将任何指针转换为GtkToggleButton *,因此无论您如何取消引用,您总会得到编译器认为是GtkToggleButton结构的东西。

+0

我有一个if语句倒在某处 – 2011-05-01 10:21:59

相关问题