c GTK g_signal_connect 使用数据域
c GTK g_signal_connect using the data field
使用 g_signal 连接,我尝试使用 "data" 字段传递一个简单字符 'S' 的参数。
???(我想我明白该字段不是用于数据,而是用于指向数据的指针。)???
无论如何,我有这样的代码:
g_signal_connect (G_OBJECT(b_save), "clicked", my_test, (gpointer) 'S');
像这样调用代码:
void my_test(GtkMenuItem *menuitem, gpointer data)
{
printf("Pointer variable contains: %p\n", data);
}
我不确定 my_test 应该接受两个参数还是一个?
我不确定如何打印指向的值 'S'。
(在我调用的函数 my_test 中,我如何获得 'S'?)
'S'
是一个字符常量。与字符串文字不同,字符常量不可寻址,它们只是伪装的数字。因此回调中的数据参数不包含指向 'S'
的指针(不超过它可以包含指向常量 1
的指针),而是将常量的值重新解释为 gpointer
.
如果您的 C 实现保证整数和指针之间的一对一映射,您可以保留您的设置,并像这样打印您的回调:
printf("Data variable contains: %c\n", (char)data); // char and NOT char*
如果你想传递地址,那么你需要传递一些存储的地址。更重要的是,在执行回调之前不会过期的存储。动态分配内存可能是最好的,但您也可以传递静态变量的地址:
static char data = 'S';
g_signal_connect (G_OBJECT(b_save), "clicked", my_test, &data);
// ...
printf("Data variable contains: %c\n", *(char*)data); // Now data is a pointer to a single character.
使用 g_signal 连接,我尝试使用 "data" 字段传递一个简单字符 'S' 的参数。
???(我想我明白该字段不是用于数据,而是用于指向数据的指针。)???
无论如何,我有这样的代码:
g_signal_connect (G_OBJECT(b_save), "clicked", my_test, (gpointer) 'S');
像这样调用代码:
void my_test(GtkMenuItem *menuitem, gpointer data)
{
printf("Pointer variable contains: %p\n", data);
}
我不确定 my_test 应该接受两个参数还是一个? 我不确定如何打印指向的值 'S'。 (在我调用的函数 my_test 中,我如何获得 'S'?)
'S'
是一个字符常量。与字符串文字不同,字符常量不可寻址,它们只是伪装的数字。因此回调中的数据参数不包含指向 'S'
的指针(不超过它可以包含指向常量 1
的指针),而是将常量的值重新解释为 gpointer
.
如果您的 C 实现保证整数和指针之间的一对一映射,您可以保留您的设置,并像这样打印您的回调:
printf("Data variable contains: %c\n", (char)data); // char and NOT char*
如果你想传递地址,那么你需要传递一些存储的地址。更重要的是,在执行回调之前不会过期的存储。动态分配内存可能是最好的,但您也可以传递静态变量的地址:
static char data = 'S';
g_signal_connect (G_OBJECT(b_save), "clicked", my_test, &data);
// ...
printf("Data variable contains: %c\n", *(char*)data); // Now data is a pointer to a single character.