Передача user_data в сигнале GTK (Глупость какая-то)

Модератор: Модераторы разделов

Аватара пользователя
PM85
Сообщения: 77

Передача user_data в сигнале GTK

Сообщение PM85 »

Казалось бы простой момент, а найти причину проблемы не могу.
Определяется сигнал так:

Код: Выделить всё

gint tt = 23;
gtk_signal_connect (GTK_OBJECT (tree_views[T_SPECIALITY]), "row-activated",
        GTK_SIGNAL_FUNC (test2), GINT_TO_POINTER (tt));


И сам сигнал:

Код: Выделить всё

void test2 (GtkWidget *widget, gpointer user_data)
{
    printf ("test = %d,\n", GPOINTER_TO_INT (user_data));
}


Всё отлично подключается, событие работает, но user_data нормально НЕ получается.
результат сигнала: test = 136461632, и такая ерунда :mellow:

Казалось бы вот официальный пример для функции gtk_signal_connect:

Код: Выделить всё

static void button_clicked_int (GtkButton* button, gpointer func_data)
{
    g_print ("button pressed: %d\n", GPOINTER_TO_INT (func_data));
}

/* By calling this function, you will make the g_print above
 * execute, printing the number passed as `to_print'. */
static void attach_print_signal (GtkButton* button, gint to_print)
{
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
        GTK_SIGNAL_FUNC (button_clicked_int),
        GINT_TO_POINTER (to_print));
}


Может проблема в том, что интерфейс в Glade'е описан? Но в нём нет такого сигнала для этого виджета.
Не могу понять что в этих 3х строках не так.
Помогите. За ранее благодарен.
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Передача user_data в сигнале GTK

Сообщение halturin »

136461632 (dec) = 0x8223D40 (hex)

стойкое ощущение что берется & от твоего tt, хотя твои GINT_TO_POINTER это всего-то макросы приведения типа, т.е. заявлены как (gpointer) (your_data). Попробуй для начала просто указать (gpointer) tt. Хотя... есть какое-то ощущение что ты в 64 разрядах сидишь. Это так? если да, то внимательней надо читать документацию, ибо:

#define GINT_TO_POINTER(i) ((gpointer) (i))

Stuffs an integer into a pointer type.

Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE IN ANY WAY SHAPE OR FORM. These macros ONLY allow storing integers in pointers, and only preserve 32 bits of the integer; values outside the range of a 32-bit integer will be mangled.
Спасибо сказали:
Аватара пользователя
PM85
Сообщения: 77

Re: Передача user_data в сигнале GTK

Сообщение PM85 »

Нет, система 32х битная. и пробовал по-разному уже и (gpointer)tt и указатель передавать (gpointer)&tt. Всё одно - результат тот же
Спасибо сказали:
Аватара пользователя
PM85
Сообщения: 77

Re: Передача user_data в сигнале GTK

Сообщение PM85 »

Код: Выделить всё

int aa = 7;
gpointer bb = GINT_TO_POINTER (aa);
printf ("test = %d,\n", GPOINTER_TO_INT (bb));


Этот код работает. Тут дело - в сигнале.

Попробовал сделать как в примере - на GtkButton::clicked - СРАБОТАЛО!
Значит проблема в том, что у меня GtkTreeView::row-activated
Только в чём..?
Спасибо сказали:
Аватара пользователя
PM85
Сообщения: 77

Re: Передача user_data в сигнале GTK

Сообщение PM85 »

Всё, решил.

Конечно причиной была моя собственная глупость.
Из doc'а:

Код: Выделить всё

"row-activated"
            void        user_function      (GtkTreeView *treeview,
                                            GtkTreePath *arg1,
                                            GtkTreeViewColumn *arg2,
                                            gpointer user_data);


Не знал что у user_functions бывают вариации по параметрам.
Спасибо сказали: