无法将用户数据结构传递给 GTK 回调

Posted

技术标签:

【中文标题】无法将用户数据结构传递给 GTK 回调【英文标题】:Unable to Pass a Structure of User Data to GTK Callbacks 【发布时间】:2021-11-21 03:32:50 【问题描述】:

虽然已经回答了关于这种情况的类似问题,但我被困住了。

我正在使用结构将数据传递给 GTK 回调。结构定义为

typedef struct List_Stores 
    GSList * list_store_master; 
    GSList * list_store_temporary; 
    List_Builder_Struct * list_builder_struct; 
 List_Store_Struct;

我在函数中声明结构。

List_Store_Struct list_store_struct;

此结构通过引用传递给在框中制作按钮的函数。

GtkWidget *accounts_buttons_hbox = make_buttons(&list_store_struct);

make_buttons 内部我使用连接信号

g_signal_connect(button, "clicked", G_CALLBACK(revert), list_store_struct);

函数revert内部我要检查结构的内容。

static void revert(GtkWidget* widget, gpointer data) 
    List_Store_Struct* list_store_struct = (List_Store_Struct *) data;

    /* The following lines point to nothing or give the debugger message Cannot access memory at address 0xblahblah */
    GtkListStore * list_store = (list_store_struct->list_builder_struct)->list_store;
    GSList * list_store_master = list_store_struct->list_store_master;
    GSList * list_store_temporary = list_store_struct->list_store_temporary; 

调试器显示指针list_store_struct指向一个空的内存位置;我无法访问该结构的成员。此外,尝试访问结构的成员会导致分段错误。

将此结构传递给回调以便我可以访问结构的成员的正确方法是什么?

【问题讨论】:

GSList *list_store_master;GSList *list_store_temporary;List_Builder_Struct *list_builder_struct; 在哪里初始化?目前,成员只是未初始化的指针。 (避免'*'"->" 后面的空格) 这些成员在 struct 声明之前不久被初始化。我在连接信号的地方看到了结构的内容;我在回调中丢失了它们。 如果在您填写GtkWidget *accounts_buttons_hbox = make_buttons(&list_store_struct); 后,列表被填充,但是当您按下按钮并且"clicked" 信号触发revert() 回调时,您的列表消失了——那么您可能有一个堆栈代码中的粉碎问题未显示。因为您的信号和revert() 函数看起来不错。由于List_Store_Struct list_store_struct; 在堆栈上创建结构,因此如果发生任何堆栈粉碎(例如数组溢出或调用未定义行为破坏堆栈的类似问题),它将被破坏 很好的建议,听起来很正确。 TBH 我对 GTK 中的引用计数器和其他内存分配方案并不完全清楚,所以我可能需要理顺这些。谢谢。 【参考方案1】:

如我原来的帖子中所述,我试图将一个指向用户定义结构List_Store_Struct 的指针传递给回调函数。尽我所能,回调无法正确地将传递的gpointer 转换为指向List_Store_Struct 的指针。

我后来了解到 GTK 提供了一个类型GPtrArray。虽然可能不是为我的用例设计的,但将 void 指针传递给 GPtrArray 的实例会在回调中干净地强制转换,并且我能够访问辅助指针位置的数据。

【讨论】:

以上是关于无法将用户数据结构传递给 GTK 回调的主要内容,如果未能解决你的问题,请参考以下文章

将其他参数传递给gtk函数

FLTK:按下哪个按钮 - 将数字传递给按钮的回调(lambda)

通过DOM元素数据集将回调传递给js

将额外变量传递给回调函数

如何获取模态中的数据ID,然后将其传递给ajax?

Vuejs将动态数据从父组件传递给子组件