64位系统,GINT_TO_POINTER(i)/ GPOINTER_TO_INT(p)

时间:2012-12-08 23:13:26

标签: c gtk glibc

我最难将一个整数传递给回调函数,因为g_signal_connect的最后一个参数需要是一个指针。这是我将信号连接到回调的地方:

for (i=0;i<10;i++)
{

    ...
    gtk_widget_set_events(tab_ebs[i],GDK_BUTTON_PRESS_MASK);
    g_signal_connect (G_OBJECT (tab_ebs[i]), "button_press_event", G_CALLBACK (tab_clicked_cb), GINT_TO_POINTER(i));

}

这是回调:

void tab_clicked_cb (gpointer p)
{
    printf("tab #%d clicked\n", GPOINTER_TO_INT(p));
}

我在stdout中得到的是以下陈述:

tab #6578976 clicked
tab #6579264 clicked
tab #6579552 clicked
tab #6579840 clicked

当我只有十个标签时。如何在64位系统上将整数传递给回调fcn?感谢。

2 个答案:

答案 0 :(得分:2)

那不是我的一半。结果我在回调函数中也错过了该事件的参数。这是有效的形式:

void tab_clicked (GtkWidget *widget, GdkEventButton *ev, gpointer p)
{
    printf("tab #%d clicked\n", GPOINTER_TO_INT(p));
}

答案 1 :(得分:0)

您的回调函数可能是错误的,大多数Gtk回调处理程序将发起事件的窗口小部件作为回调函数的第一个参数传递。所以它应该是例如。

void tab_clicked_cb (GtkWidget *widget, gpointer p)
{
    printf("tab #%d clicked\n", GPOINTER_TO_INT(p));
}

编辑,Gtk docs对于button_press_event的回调处理程序一点都不清楚,因为button_press_event的回调处理程序读取的文档没有收到任何参数。