2017-01-23 49 views
0

如何从gpointer获取变量以便我可以使用它。c gtk警告:初始化从指针产生整数

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

这里是回调部分 与= “Y” 炭的线;给出警告:初始化将指针整数,未作施放[-Wint转换]

的gsignal行给出警告:投给指针从不同大小的整数[-Wint到指针铸]

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

我试过这几种不同的方式,仍然不能得到它。

感谢。

回答

1
char on = "y"; 

声明on作为保持单个char。字符串不止一个char,因此您需要将它们存储为指向char或指向char s的指针。

问题是你想用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不足以存储指针,因此将指针视为值会产生非常糟糕的结果。

+0

感谢您的回复andlabs。是的,我看到这个太迟了,正在编辑我的帖子,而你回答。我还编辑了代码并进行了编译。该帖子已被更新为代码,因为它是现在,我认为你的权利,我也有一个错误的功能right()。生病消化你的话,并试图解决问题。当我得到它时,我会给打勾。 – fernny500

+0

谢谢答复和lalabs。我不明白的是char on =“y”,如果它在我初始化之前没有存在,它是如何从一个指针变成一个int的。我希望我声明并初始化一个不是指针的变量。你可能会看到我想要做的事情。我是否以错误的方式处理它? 如何语法回调线的gpointer数据参数我可以使用一些帮助。在right()中出错了,使用了错误的,buf设置为250,所以这就解释了这一点。我很乐意让GTK的一面正确。试图解释警告; – fernny500

+0

试图解释警告;希望也有帮助! – andlabs

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

而且从功能权限()

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] 

同样有可能是更好的方法,但目的是为了传递一个变量不是指针。我已经测试了几次,并没有失败,所以生病了。