Void **回调混乱

时间:2011-12-02 06:41:26

标签: c callback glib void-pointers

我正在使用开源映射工具,它可以使用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;
}

2 个答案:

答案 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有关。但是回调的声明是错误的,因为它声明回调不带任何参数......