c gtk警告:初始化从指针生成整数

时间:2017-01-23 01:28:22

标签: c pointers gtk

如何从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);

我已经尝试了几种不同的方法,仍然无法得到它。

感谢。

2 个答案:

答案 0 :(得分:1)

char on = "y";

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

问题是您希望能够使用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值视为指针一定会产生非常糟糕的事情。< / p>

答案 1 :(得分:0)

这是我正在寻找的代码。

有关回调的代码。

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);
}    

来自function right()的相关片段

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]

我认为这是可以的,因为虽然可能有更好的方法来初始化指针,但指针却是预期的。

led_on = on;提供警告

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

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