我正在使用开源映射工具,它可以使用g_io_add_watch来监视文件描述符。我正在尝试查看stdin文件描述符,并且我已成功地能够在stdin接收数据时调用回调。但是我无法读取这些数据。我试图修改回调以接收开源api的处理程序中描述的信息。
编辑**我的问题首先是什么是无效**以及如何在这种情况下使用它。我希望我的回调函数能够提供为下面看到的readUserInput_two函数描述的参数,我需要通过下面描述的回调系统传递它。我很困惑,我需要传递什么作为我的void **,以允许当前实现传递这些参数。
看起来像这样
readUserInput_two(GIOChannel *ioch, GIOCondition cond, gpointer data)
我想将此指针存储到定义为
的回调中struct callback {
void (*func)();
int pcount;
enum attr_type type;
void *p[0];
};
在用于实例化回调的函数中,您提供以下参数
callback_new(void (*func)(void), int pcount, void **p)
在这个调用中,pcount是你的函数指针应该具有的参数数量,我相信void ** p要么是那些参数的类型还是某种类型的东西,但我似乎无法弄明白。
当回调被触发时,它会调用在一个看起来如此的define语句中定义的函数。
#define callback_call_3(cb,p1,p2,p3) callback_call_args(cb, 3, p1, p2, p3)
此函数定义为各种数量的p。 callback_call_1(cb,p1)也存在。任何人都可以解释我如何获得我的回调函数来接收这些数据字段。调用callback_call_3的中间回调fire函数看起来像这样。
static gboolean
navfocus_call_watch(GIOChannel * iochan, GIOCondition condition, gpointer t)
{
struct callback *cb=t;
if(cb->pcount == 1)//I added this if before it only had callback_call_0
{
callback_call_0(cb);
}
else if(cb->pcount == 4)
{
callback_call_3(cb,iochan,condition,t);
}
return TRUE;
}
答案 0 :(得分:2)
void **是指向void类型数据(无类型)的指针的指针。 void *用作泛型类型以指向任何类型变量的基址。在这种情况下,void **期望保存多个void *变量。你可以把它称为void数组。
有多种函数需要调用,这些函数基于callback_new()发送的参数数量。为方便起见,有一些宏。
您需要将这些参数嵌入到void ** p中。您可以为void ** p数组分配内存,如下所示:
void **p = malloc(10 * sizeof *p);
您需要按照被调用的最终函数所需的相同顺序嵌入它们。
说3参数功能:
p[0] = &iochan;
p[1] = &condition;
p[2] = &t;
现在将void ** p发送到callback_new(theFunctionPointer,3,p);如你所解释的那样,将根据参数的数量调用适当的函数。
答案 1 :(得分:1)
void**
是指向void的指针的类型。
关于如何在您的情况下使用它,您将不得不查阅文档。我无法从您发布的代码片段中看出,变量名称“p”也没有真正帮助。
编辑:关于回调被提供原始数据,回调函数没有任何参数。函数如何获得指针?
Edit2:我知道,这与pcount有关。但是回调的声明是错误的,因为它声明回调不带任何参数......