无法将用户数据结构传递给 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 回调的主要内容,如果未能解决你的问题,请参考以下文章