Предупреждение о типах компиляции и ошибки - PullRequest
0 голосов
/ 29 апреля 2011
if(xmlStrEquals(cur->name, (const xmlChar *) "check")) // Find out which type it is
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, xmlGetProp(cur,"name"))),(gboolean) xmlGetProp(cur,"value"));

else if(xmlStrEquals(cur->name, (const xmlChar *) "spin"))
    gtk_adjustment_set_value(GTK_ADJUSTMENT (gtk_builder_get_object (builder, xmlGetProp(cur,"name"))),(gdouble) xmlGetProp(cur,"value"));

else if(xmlStrEquals(cur->name, (const xmlChar *) "combo"))
    gtk_combo_box_set_active(GTK_COMBO_BOX (gtk_builder_get_object (builder, xmlGetProp(cur,"name"))),(gint) xmlGetProp(cur,"value"));

3 приведенные ниже ошибки соответствуют приведенным выше 3 if.

main.c:125: warning: cast from pointer to integer of different size
main.c:130: error: pointer value used where a floating point value was expected
main.c:139: warning: cast from pointer to integer of different size

Если вы позволите мне извлечь оскорбительные части:

(gboolean) xmlGetProp(cur,"value")
(gdouble) xmlGetProp(cur,"value")
(gint) xmlGetProp(cur,"value")

Почему эти типы приводят к таким ошибкам? Как я могу их исправить?

Попытка использовать (gboolean *) и т. Д. Полученные предупреждения от gtk в соответствии с:

warning: passing argument 2 of ‘gtk_toggle_button_set_active’ makes integer from pointer without a cast
/usr/include/gtk-2.0/gtk/gtktogglebutton.h:82: note: expected ‘gboolean’ but argument is of type ‘gboolean *’
error: incompatible type for argument 2 of ‘gtk_adjustment_set_value’
/usr/include/gtk-2.0/gtk/gtkadjustment.h:93: note: expected ‘gdouble’ but argument is of type ‘gdouble *’
warning: passing argument 2 of ‘gtk_combo_box_set_active’ makes integer from pointer without a cast
/usr/include/gtk-2.0/gtk/gtkcombobox.h:99: note: expected ‘gint’ but argument is of type ‘gint *’

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Функция xmlGetProp возвращает строку (как xmlChar *):

Поиск и получение значения атрибута, связанного с узлом. Это делает подстановку сущности,Эта функция ищет в объявлении атрибута DTD значения #FIXED или значения по умолчанию, если только использование DTD не отключено.
[...]
Возвращает : значение атрибута или NULL, если не найдено.Вызывающий должен освободить память с помощью xmlFree ().

Вызывающий отвечает за синтаксический анализ этой строки в любой форме (с плавающей запятой, целым числом, логическим значением, ...).Также обратите внимание, что вызывающий также ответственен за освобождение возвращенной строки xmlChar *.

Чтобы исправить вашу проблему, вам нужно преобразовать строку в то, что вам нужно, обычным способом.И не забудьте xmlFree возвращенные строки.

0 голосов
/ 30 апреля 2011

Я исправил это так:

(gboolean) *xmlGetProp(cur,"value")
(gdouble) *xmlGetProp(cur,"value")
(gint) *xmlGetProp(cur,"value")

До сих пор не знаю, почему это сработало, но я могу догадаться.

...