使用由结构指向的指针中的变量,该结构(该结构的)指针被发送到需要使用它的函数
Use a variable from pointer that is pointed by a struct which (that structs') pointer is sent to a function that needs to use it
好吧,这是一种指针感知。
所以.
我正在使用 gtk+
在 gtk 中,我这样定义按钮:
GtkWidget *button1, *button2;
所以我需要一个函数来做这件事。所以我创建了一个结构来保存指向它的指针
这里是:
typedef struct userdata{
GtkWidget *button1, *button2;
}userdata;
我将 struct 的指针指向 main 的指针:
userdata data;
data.button1 = button1;
data.button2 = button2;
然后我将这个结构与 gtk 事件一起使用:
g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(resetbuttonsize), &data);
问题来了。我想用我刚发送给函数的这些变量做一些事情,例如调整它们的大小,所以我做这样的事情:
void resetbuttonsize(GtkWindow *window, GdkEvent *event, gpointer data){
GtkWidget *button1 = data->button;
}
所以我可以做类似的事情:
gtk_widget_set_size_request(button1, 40, 40);
遗憾的是,我不能这样做 (GtkWidget *button1 = data->button;) 因为我得到以下编译器错误:
/media/dysk250/pmanager/testfile/main.cpp|59|error: ‘gpointer {aka void*}’ is not a pointer-to-object type|
谁能告诉我我做错了什么?
我是指针的新手,也许我可以解决单指针指针问题,但这对我的大脑来说太过分了,无法理解正在发生的事情以及为什么我使用的代码是错误的。
您需要将 void*
变量转换为可以取消引用的合适指针:
GtkWidget *button1 = static_cast<userdata*>(data)->button;
void* 类型的指针是通用指针。如果不将其转换为原始类型,则无法对其进行任何操作。
userdata* userData = static_cast<userdata*>(data);
GtkWidget* button1 = userData->button1;
GtkWidget* button2 = userData->button2;
如果您使用的是 void *
指针,请确保在必要时将其转换为特定的指针类型,如下所示。
void resetbuttonsize(GtkWindow *window, GdkEvent *event, gpointer data){
userdata * data1 = static_cast<userdata*>(data);
GtkWidget *button1 = data1->button1;
}
其次,您的结构 userdata
没有成员 button
,您必须使用 button1
或 button2
好吧,这是一种指针感知。
所以.
我正在使用 gtk+
在 gtk 中,我这样定义按钮:
GtkWidget *button1, *button2;
所以我需要一个函数来做这件事。所以我创建了一个结构来保存指向它的指针
这里是:
typedef struct userdata{
GtkWidget *button1, *button2;
}userdata;
我将 struct 的指针指向 main 的指针:
userdata data;
data.button1 = button1;
data.button2 = button2;
然后我将这个结构与 gtk 事件一起使用:
g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(resetbuttonsize), &data);
问题来了。我想用我刚发送给函数的这些变量做一些事情,例如调整它们的大小,所以我做这样的事情:
void resetbuttonsize(GtkWindow *window, GdkEvent *event, gpointer data){
GtkWidget *button1 = data->button;
}
所以我可以做类似的事情:
gtk_widget_set_size_request(button1, 40, 40);
遗憾的是,我不能这样做 (GtkWidget *button1 = data->button;) 因为我得到以下编译器错误:
/media/dysk250/pmanager/testfile/main.cpp|59|error: ‘gpointer {aka void*}’ is not a pointer-to-object type|
谁能告诉我我做错了什么? 我是指针的新手,也许我可以解决单指针指针问题,但这对我的大脑来说太过分了,无法理解正在发生的事情以及为什么我使用的代码是错误的。
您需要将 void*
变量转换为可以取消引用的合适指针:
GtkWidget *button1 = static_cast<userdata*>(data)->button;
void* 类型的指针是通用指针。如果不将其转换为原始类型,则无法对其进行任何操作。
userdata* userData = static_cast<userdata*>(data);
GtkWidget* button1 = userData->button1;
GtkWidget* button2 = userData->button2;
如果您使用的是 void *
指针,请确保在必要时将其转换为特定的指针类型,如下所示。
void resetbuttonsize(GtkWindow *window, GdkEvent *event, gpointer data){
userdata * data1 = static_cast<userdata*>(data);
GtkWidget *button1 = data1->button1;
}
其次,您的结构 userdata
没有成员 button
,您必须使用 button1
或 button2