c - 在 g_signal_connect 中将整数作为 gpointer 传递

标签 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);
}

问题是每当我尝试将数字转换为整数并检查数字(通过 print 语句)时,它都会返回不正确的数字。

最佳答案

首先,该函数实际上采用 gpointer* 还是仅采用 gpointer?后者似乎更有可能,因为 gpointer 是一个 void *

其次,您传递的是局部变量 &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);
}

关于c - 在 g_signal_connect 中将整数作为 gpointer 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55749456/

相关文章:

c++ - gtkmm 和 FileChooserButton 无法获取文件名

python - 如何将内联图像添加到 PyGObject 3?

c - haskell FFI : Calling FunPtrs

css - 如何使用 CSS 设置 GtkLabel 的样式?

linux - 获取 VTE 搜索中的模式匹配数

c - 使用 GtkClipboard 获取 URL

c++ - 在所有版本的 C 和 C++ 中,有符号、无符号、长整型和短整型都是有效类型吗?

c - 我在哪里可以找到 unix 上 C 中的头文件

c++ - 以线程安全的方式在C/C++中从时区名称字符串转换时区偏移

mysql准备语句: Update query