LINUX.ORG.RU

instance of invalid non-instantiatable type

 


0

1

Взялся я учить наконец-то GTK, но вот в программировании на Си я опыта не имею (весь опыт ограничен чтением К&Р), и у меня проблема возникла. Есть код:

#include <gtk/gtk.h>

typedef struct {
	GtkWidget * widget;
	void * cb;
	void * arg;
} action;

void cb_test(action * handler) {
	g_print("Test!\n");
	g_signal_connect(handler->widget, "clicked", G_CALLBACK( handler->cb ) , handler->arg );
}

int main (int argc, char **argv) {
	gtk_init(&argc, &argv);


	GtkWidget
		*window = gtk_window_new(GTK_WINDOW_TOPLEVEL)
		, *button = gtk_button_new_with_label("Test")
	;

	action button_click = {
		.widget = button
		, .cb = gtk_widget_destroy
		, .arg = window
	};
	g_signal_connect(button, "clicked", G_CALLBACK(cb_test), &button_click);

	gtk_container_add(GTK_CONTAINER(window), button);
	gtk_widget_show(button);
	gtk_widget_show(window);

	gtk_main();
	return 0;
}

При компиляции ничего не выдает, а при нажатии на кнопку:

Test!

(hello-world:4613): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `<unknown>'

(hello-world:4613): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

Опытные глаза, где же ошибка?

★★★★★

Последнее исправление: sphericalhorse (всего исправлений: 1)

Взялся я учить наконец-то GTK, но вот в программировании на Си я опыта не имею

Быстрее беги на Qt\C++

bhfq ★★★★★
()
Ответ на: комментарий от bhfq

Я просто уже боюсь, что никогда со скриптовых языков не убегу:)
Сейчас закидают яйцами, но скажу как есть, первый ЯП начал учить, вроде, в 7-ом классе, потом ещё один выучил, потом Си и потом ещё Питон в одиннадцатом классе (сейчас то есть). За это время написано куча кода на скриптовых языках, и несколько строчек на Си. У меня из-за этого комплекс неполноценности.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

в cb_test передать gpointer data и так использовать

g_signal_connect(data->handler->widget, «clicked», G_CALLBACK( data->handler->cb ) , data->handler->arg );

dhampire ★★★
()
Ответ на: комментарий от dhampire

Я читаю официальный Getting Started, но захотел немного отойти от темы, и получился такой код. Хочу конкретно в нем разобраться. Проблема моем коде не в том, что я плохо знаю Си, а в гткашных приколах?

sphericalhorse ★★★★★
() автор топика

Проблема была в том, что моя структура в коллбек передавалась не первым, а вторым аргументом (первым была ссылка на виджет).

Спасибо арчеводам за это.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Анон, ты толст. Или у нас разные понимания процесса разборки примеров.

sphericalhorse ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.