【问题标题】: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使用结构所指向的指针中的变量,该结构(该结构的)指针被发送到需要使用它的函数
【发布时间】:2016-08-29 12:09:31
【问题描述】:

Welp,这是一种指针感知。
所以。
我正在使用 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|

谁能告诉我我做错了什么? 我是指针的新手,也许我可以解决单指针指针,但这对于我的大脑来说太难理解正在发生的事情以及为什么我使用的代码是错误的。

【问题讨论】:

    标签: c++ pointers struct gtk pointer-to-pointer


    【解决方案1】:

    您需要将void* 变量转换为可以取消引用的合适指针:

    GtkWidget *button1 = static_cast<userdata*>(data)->button;
    

    【讨论】:

    • 感谢您的回答,它确实有效 :) 所以这意味着程序使用发送到函数的数据,因为它是一个“指针”结构,而不是您程序期望的普通结构?
    • @KarolSzustakowski void* 类型的指针是一个 generic 指针,它可以指向任何东西。同时它没有任何类型信息,除了它是一个指针。这就是为什么您必须将其转换为特定类型的原因。它常用于 C 代码中(记住 Gtk 是 C 工具包,而不是 C++)。
    【解决方案2】:

    void* 类型的指针是通用指针。如果不将其转换为原始类型,则无法对其进行任何操作。

    userdata* userData = static_cast<userdata*>(data);
    GtkWidget* button1 = userData->button1;
    GtkWidget* button2 = userData->button2;
    

    【讨论】:

      【解决方案3】:

      如果您使用void * 指针,请确保在必要时将其转换为特定的指针类型,如下所示。

      void resetbuttonsize(GtkWindow *window, GdkEvent *event, gpointer data){
          userdata * data1 = static_cast<userdata*>(data);
          GtkWidget *button1 = data1->button1;
      }
      

      其次,您的结构userdata 没有成员button,您必须使用button1button2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多