GTK3 将结构传递给回调函数 - 发生异常,分段错误
Posted
技术标签:
【中文标题】GTK3 将结构传递给回调函数 - 发生异常,分段错误【英文标题】:GTK3 Passing Struct to Callback Function - Exception has occurred, segmentation error 【发布时间】:2022-01-11 17:59:05 【问题描述】:我在任何函数之外创建了一个结构:
//create structure
typedef struct _LabelPointers
GtkWidget *readstringslabel;
GtkWidget *snoteslabel;
GtkWidget *fnoteslabel;
GtkWidget *genericnoteslabel;
GtkWidget *tabslabel;
GtkWidget *chordslabel;
MyLabelPointers;
然后,我在调用函数内部创建了一个标签结构:
//create structure of widget label pointers (to be passed to functions)
MyLabelPointers labelpointers;
labelpointers.readstringslabel = gtk_label_new("0");
labelpointers.snoteslabel = gtk_label_new("0");
labelpointers.fnoteslabel = gtk_label_new("0");
labelpointers.genericnoteslabel = gtk_label_new("0");
labelpointers.tabslabel = gtk_label_new("0");
labelpointers.chordslabel = gtk_label_new("0");
然后,我连接回调如下,传递&labelpointers
:
g_signal_connect(G_OBJECT (window), "key_press_event",G_CALLBACK(pressspacebar), &labelpointers);
调用函数如下,接受*labelpointers
:
gboolean pressspacebar (GtkWidget *widget, GdkEventKey *event, MyLabelPointers *lpointers)
然后我尝试更新labelpointers->readstringslabel
中的文本,如下所示:
gtk_label_set_text(GTK_LABEL(lpointers->readstringslabel), cdata);
或如:
gtk_label_set_text(GTK_LABEL(lpointers->readstringslabel), "NEW DATA");
它全部编译并运行,直到我得到“发生异常,分段错误”。就在错误之前,我打印到 shell 如下:
cout<<"before\n";
cout<<"lpointers.readstringslabel = "<<lpointers->readstringslabel<<"\n";
cout<<"lpointers.readstringslabel = "<<&lpointers->readstringslabel<<"\n";
cout<<"type = " << typeid(lpointers->readstringslabel).name() << "\n";
然后得到:
before
lpointers.readstringslabel = 0x4
lpointers.readstringslabel = 0x7fffffffd570
type = P10_GtkWidget
我希望这些信息足以帮助我解决这个我已经工作了三天的问题。不幸的是,即使是谷歌也没有帮我解决这个问题。
【问题讨论】:
请尝试提供一个完整且最小的示例来重现您的问题。 我已经确定这是一个线程问题。我在一个函数中创建了窗口,称为基于如果您将结构创建为堆栈变量 (MyLabelPointers labelpointers
),则会在函数结束时将其丢弃,并且在调用回调时不再可用。您必须使用(g_new()
类似函数)动态分配您的结构 - 然后在不再需要时使用 g_free()
。
【讨论】:
谢谢。我最终创建了全局小部件并避免传递这些指针/变量。这对我有用。再次感谢。以上是关于GTK3 将结构传递给回调函数 - 发生异常,分段错误的主要内容,如果未能解决你的问题,请参考以下文章