gpt4 book ai didi

c - 如何设置指向结构的 Gtk gpointer?

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:38 25 4
gpt4 key购买 nike

我正在尝试通过编写一些函数来帮助我使用 Gtk 来让自己的生活更轻松(而且我很害怕做一顿饭)。感觉就像我很接近,但没有雪茄。

我已经定义了几个结构:

typedef struct action_param {
void (*action_ptr)();
gpointer parameter;
} action_param_type;

typedef struct document {
GtkWindow *parent_window;
void (*save_action_ptr)();
void (*open_action_ptr)();
gchar* filename;
void* filedata;
} document_type;

我有设置它们的函数:

document_type build_document_with_characteristics(GtkWindow *parent_window,
void (*save_action_ptr),
void (*open_action_ptr),
gpointer filename,
gpointer filedata) {
struct document doc;
doc.parent_window = parent_window;
doc.save_action_ptr = save_action_ptr;
doc.open_action_ptr = open_action_ptr;
doc.filename = filename;
doc.filedata = filedata;
return doc;
}

action_param_type set_action_with_parameter(void (*action_ptr), gpointer action_parameter) {
action_param_type action;
action.action_ptr = action_ptr;

/*** these two lines for testing */
struct document *mydata = action_parameter;
// g_print("%s",mydata->filename);

action.parameter = action_parameter;
return action;
}

GtkWidget* create_menuitem_with_parameters(void* parent_menu, char* label, struct action_param menuaction) {
GtkWidget *menuitem = gtk_menu_item_new_with_label(label);
gtk_menu_shell_append(GTK_MENU_SHELL(parent_menu), menuitem);
if (menuaction.action_ptr != NULL) {
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menuaction.action_ptr), &menuaction.parameter);
}
return menuitem;
}

调用如下:

struct document this_document = build_document_with_characteristics(GTK_WINDOW(window),&handle_save,&handle_open,"Test Title","Test Document");
create_menuitem_with_parameters(fileMenu, "Save", set_action_with_parameter(&show_save_dialogue,&this_document));

我现在的问题(我相信我会发现更多问题)是如果我取消注释 g_print 行(这是为了查看我是否正确填充了所有内容),我得到:

Segmentation fault: 11

我想知道问题是否出在这一行:

g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menuaction.action_ptr), &menuaction.parameter);

我觉得我刚刚错过了一些明显的东西 - 但它是什么?

最佳答案

您正在向回调传递一个临时指针。

GtkWidget* create_menuitem_with_parameters(void* parent_menu, char* label, struct action_param menuaction) 定义由副本传递的 menuaction。意思是create_menuitem_with_parameters返回后,g_signal_connect中传入的指针已经不存在了。您需要将 menuaction 对象存储在某处,并确保它在回调运行时有效。

关于c - 如何设置指向结构的 Gtk gpointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58590453/

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