Рассмотрим следующий код:
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 возвращает указатель GtkWidget, который gtk_widget_show прекрасно обрабатывает, почему GTK_TOGGLE_BUTTON()
не может правильно привести его тип?
(Кроме того, gtk_toggle_button_set_active не вызывает ошибок при компиляции, только во время выполнения)
Редактировать: Для ясности это кнопка gtktoggle (обратите внимание на разыменование и то, как оно теперь вызывает ошибку):
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