在g_signal_connect中将整数作为gpointer传递

时间:2019-04-18 15:37:33

标签: c gtk3

我尝试找到类似的问题,但找不到任何解决方案。

我有一个使用GTK3用C编写的软件,并且我正在尝试为在GUI上按下按钮建立回调。该代码应该传递一个整数作为参数,以使我的回调函数知道要引用哪个GUI窗口。

void main_gui()
{
    int number = 5;

    g_signal_connect(button,
                    "clicked",
                    G_CALLBACK(callback_func),
                    (gpointer*) &num);
}

void callback_func(gpointer *data)
{
    int number;
    number = (int*)data;
    printf("Number: %d\n", number);
}

问题是,每当我尝试将数字转换为整数并通过打印语句检查数字时,它都会返回错误的数字。

1 个答案:

答案 0 :(得分:0)

首先,该功能实际上需要一个gpointer*还是仅一个gpointer?后者似乎更有可能,因为gpointervoid *

第二,您要传递局部变量&number的地址,而不是其值。不要那样做局部变量在堆栈上,一旦函数退出(在调用回调之前发生),该变量可能就不存在。只需将强制类型转换为值传递即可:(gpointer)number然后,当您要使用它时,将其强制返回:(int)data

这是更新的代码:

void main_gui()
{
    int number = 5;

    g_signal_connect(button,
                    "clicked",
                    G_CALLBACK(callback_func),
                    //(gpointer*) &num);
                    (gpointer)number);
}

//void callback_func(gpointer *data)
void callback_func(gpointer data)
{
    int number;
    //number = (int*)data;
    number = (int)data;

    printf("Number: %d\n", number);
}