将struct传递给回调函数

时间:2015-10-11 00:58:11

标签: c linux gtk glib

我试图传递多个变量(gtkentry和FILE):

struct data callback_params;
callback_params.entry = gtk_entry_new();
callback_params.file = config_file;
gtk_container_add(GTK_CONTAINER(content_area), callback_params.entry);
g_signal_connect(dialog,"response",G_CALLBACK (add_new_set),&callback_params);

void add_new_set(GtkDialog *dialog, gint response_id, gpointer callback_params)
{
    g_print(gtk_entry_get_text(callback_params.entry));
}

编译时,我收到以下错误:

file.h:7:45: error: request for member 'entry' in something not a structure or union
    g_print(gtk_entry_get_text(callback_params.entry));

我是否需要投射gpointer

1 个答案:

答案 0 :(得分:0)

您在不兼容的类型之间进行转换。假设您正在使用GTK,gtk_entry_get_text()的原型是:

const gchar * gtk_entry_get_text (GtkEntry *entry);

同时,您的函数声明gpointerglib转换为:

typedef void* gpointer;

换句话说,您正在尝试访问void指针的成员。编译器无法计算您想要的偏移量或类型,因此会抛出错误。

您需要做的是将gpointer转换为适当的类型,然后将其作为指向结构的指针访问以下是如何使用当前函数执行此操作的示例:

void add_new_set (GtkDialog *dialog, gint response_id, gpointer callback_params) {
    g_print (gtk_entry_get_text (((struct data *) callback_params)->entry));
}

这里,struct data *将void指针强制转换为指向类型为struct的{​​{1}}的指针,之后data取消引用指针并返回相应的字段。