gpt4 book ai didi

c - 在回调函数中访问 GTK 小部件的结构时如何避免段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:45 24 4
gpt4 key购买 nike

我有一个需要访问多个 GTK 小部件的回调函数。为了实现这一点,我试图将指针发送到打包在结构中的相关 GTK 小部件作为回调函数的参数(而不是使用全局变量来启用访问)。为了以一种很好的方式构建数据,我使用了指向 GTK 小部件的指针结构的指针结构。

我的问题是在回调函数中尝试读取或写入 GTK 小部件时出现段错误。我怎样才能避免这种情况?因为我刚刚开始学习 C 和 GTK,所以我的方法可能完全不合适,所以我也很感激关于从回调函数访问多个 GTK 小部件的更一般问题的指示。

在尝试解决问题时,我设法将出现问题的代码归结为以下内容。更改微调按钮的值时会出现段错误。如果让 widget_change_value 中的最后一行改为执行,它也会出现段错误。

/* Compile with gcc foo.c `pkg-config --cflags --libs gtk+-2.0` */
#include <gtk/gtk.h> /* Get e.g. via sudo apt-get install libgtk2.0-dev */

typedef struct {
GtkWidget *widget;
} s_input;

typedef struct {
s_input *input;
} s_data;

void widget_change_value(s_data *data) {
/* Segfault when trying to read from data */
int number = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->input->widget));

/* /\* Segfault when trying to write to data *\/ */
/* gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->input->widget), (gdouble) 2.0); */
}

int main(int argc, char *argv[])
{
GtkWidget *window;
s_input input;
s_data data = { &input };

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

input.widget = gtk_spin_button_new_with_range(0, 3, 1);
gtk_container_add(GTK_CONTAINER(window), input.widget);
g_signal_connect(GTK_OBJECT(input.widget), "value_changed", GTK_SIGNAL_FUNC(widget_change_value), (gpointer *) &data);

gtk_widget_show_all(window);
gtk_main();

return 0;
}

最佳答案

你的崩溃是因为你的回调函数的原型(prototype)全错了。

你有:

void widget_change_value(s_data *data);

但是查看文档,<a href="http://developer.gnome.org/gtk3/stable/GtkSpinButton.html#GtkSpinButton-value-changed" rel="noreferrer noopener nofollow">value-changed</a>信号处理程序回调声明为:

void user_function(GtkSpinButton *spinbutton, gpointer user_data);

您需要添加缺少的小部件指针参数。

还有:

  1. 您的回电应该是static ,因为它对于它所在的 C 文件非常本地化。
  2. 您不需要将内容转换为 gpointer .
  3. Actor (gpointer *)是双重错误,因为您传递的是要转换为 &data 的指针( gpointer ) ,不是“指向 gpointer 的指针”。星号是错误的。但是,正如我上面所说,整个 Actor 阵容毫无意义,应该被删除。
  4. 考虑移植到较新的 GTK+ 版本,您正在使用一些过时的东西(例如 GTK_OBJECT() 而不是 G_OBJECT()GTK_SIGNAL_FUNC() 而不是 G_CALLBACK())。

关于c - 在回调函数中访问 GTK 小部件的结构时如何避免段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com