g_hash_table_lookup () не принимает переменную в качестве параметра - PullRequest
1 голос
/ 30 апреля 2011

Рассмотрим следующий код:

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

1 Ответ

0 голосов
/ 01 мая 2011

Возможно, что-то удалило последнюю ссылку на вашу кнопку переключения между моментом, когда она была добавлена ​​в хеш-таблицу, и когда вы вызываете set_active() для нее?

Но я думаю, что более вероятно, что вы не получите указатель, который вы думаете, что вы. Ваш трюк разыменования *GTK_TOGGLE_BUTTON(g_hash_table_lookup(...)) ничего не говорит вам об указателе, хранящемся в хеш-таблице; GTK_TOGGLE_BUTTON() приводит любой указатель к GtkToggleButton *, поэтому независимо от разыменования вы всегда получите что-то, что компилятор считает структурой GtkToggleButton.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...