【问题标题】:c gtk warning: initialization makes integer from pointerc gtk 警告:初始化从指针生成整数
【发布时间】:2017-01-23 01:28:21
【问题描述】:

如何从 gpointer 中获取变量以便使用它。

void
right_y (GtkButton *button, gpointer on)
{
   right(on);
}

这里是回调部分 带有 char on = "y"; 的行给出警告:初始化从没有强制转换的指针生成整数 [-Wint-conversion]

gsignal 行给出警告:从不同大小的整数转换为指针 [-Wint-to-pointer-cast]

char on = "y";
button = gtk_button_new_with_label ("Led On");                        
g_signal_connect (button, "clicked", G_CALLBACK (right_y), (gpointer) on);

我尝试了几种不同的方法,但仍然无法获得它。

谢谢。

【问题讨论】:

    标签: c pointers gtk


    【解决方案1】:
    char on = "y";
    

    声明on 持有一个 char。字符串不止一个char,因此您需要将它们存储为指向char 的指针或指向chars 的数组。

    问题是您希望能够使用on 执行的操作确定要使用的正确类型。但我想鉴于帖子中错误的性质,您已经知道这一点并且对gpointer 感到困惑。

    gpointer基本上是

    typedef void *gpoiner;
    

    这就是为什么您不需要使用gpointer 指定*。不要让这愚弄你;当您在 gpointer 旁边使用其他指针类型时,您仍然需要在其他指针类型上使用 *

    g_signal_connect() 行也是错误的; gpointer on 毫无意义。

    如果你仍然不明白我在说什么,请告诉我。


    好吧,那为什么呢

    char on = "y";
    

    吐出消息

    warning: initialization makes integer from pointer without a cast [-Wint-conversion]
    

    ?

    "y" 是一个指针。它计算为const char * 类型的表达式。指针可能会驻留在可执行文件的代码部分,无法修改(因此是const)。

    char 是整数,而不是指针。除非您明确要求,否则您通常不应该能够将指针值推入整数,因为您最终可能会使用太小而无法存储指针的整数类型。 (在必要的时候,C 标准提供了intptr_tuintptr_t。)在这种情况下,你没有问,所以编译器想确定你真的是想推指针的地址在char

    请注意有关使用比必要的更小的整数的部分。这就是为什么您的 g_signal_connect() 行会打印它所做的警告:char 不足以存储指针,因此将 char 值视为指针必然会产生非常糟糕的事情。

    【讨论】:

    • 感谢和实验室的回复。是的,我看到的太晚了,在你回复的时候正在编辑我的帖子。我还编辑了代码并编译了。该帖子已更新为现在的代码,我认为您的权利我在函数 right() 中也有错误。我会消化你说的话并尝试解决问题。当我开始的时候我会打勾。
    • 感谢和实验室的回复。我不理解的是char on =“y”,如果在我初始化它之前它不存在,它是如何从指针变成int的。我希望我是在声明和初始化一个变量而不是指针。您可能会看到我正在尝试做什么。我会以错误的方式去做吗?如何语法化回调行的 gpointer 数据参数我可以使用一些帮助。 right() 有错误,使用了错误的,buf 设置为 250,这样就解释了。我很高兴能把 gtk 的事情做好。
    • 试图解释警告;希望也有帮助!
    • 是的,非常有帮助,我认为指针“y”位于 gtk 标头中的某个位置甚至更深的位置,因为它不在我编译的任何代码中。最后一个问题。此窗口中的其他一些按钮可以很好地连接和断开蓝牙插座到 arduino。 gtk 可以传递实际的常量和变量,例如滑块值中的整数或按钮中的常量,还是只处理指针。
    • 信号只能携带指针。如果您愿意,可以将指针传递给小部件。或者,如果您有 GObjects 控制您的 Arduino,您可以将 GObject 属性绑定在一起;不过,这要先进得多,而且评论太复杂了。 GTK+ 头文件中也没有“y”;它是由编译器创建的。 const char *mystring = "y";mystring 设置为某个内存地址,例如mystring[0] == 'y'mystring[1] == '\0'。该内存地址由编译器决定;它将成为编译后的二进制映像的一部分,并在每次执行时复制到 RAM 中。这就是 C 字符串的工作原理。
    【解决方案2】:

    这是我正在寻找的代码。

    关于回调的代码。

    char *on = 'n';
      button = gtk_button_new_with_label ("Led On");                        
      g_signal_connect (button, "clicked", G_CALLBACK (right_y),  on);
    

    用户功能的代码。

    static void
    right_y (GtkButton *button, gpointer on)
    {
       int led_on = on;
       right(led_on);
    }    
    

    以及来自函数 right() 的相关 sn-p

    void right(char state) {
       buf[0] = state;
       int  bytes_written  = 0;  
       bytes_written  = write(s, buf, strlen(buf));   
    } 
    

    char *on = 'n'; 行给出警告

    initialization makes pointer from integer without a cast [-Wint-conversion]
    

    我认为这没问题,因为虽然可能有更好的方法来初始化指针,但指针是我们想要的。

    int led_on = on; 行给出警告

    initialization makes integer from pointer without a cast [-Wint-conversion] 
    

    同样可能有更好的方法,但目的是传递变量而不是指针。试了好几次都没有失败,所以我接受它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多