【问题标题】:Void** Confusion for callbacksVoid** 回调混淆
【发布时间】:2011-12-02 06:41:26
【问题描述】:

我正在使用一个开源映射工具,它能够使用 g_io_add_watch 来监视文件描述符。我正在尝试查看标准输入文件描述符,并且我已经成功地能够在标准输入接收数据时调用回调。但是,我无法读取此数据。我正在尝试修改回调以接收在开源 api 的处理程序中描述的信息。

编辑** 我的问题首先是什么是 void** 以及在这种情况下如何使用它。我希望为我的回调函数提供您在下面看到的 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 callback_call_3(cb,p1,p2,p3) callback_call_args(cb, 3, p1, p2, p3)

这个函数是为各种数量的p的ex定义的。 callback_call_1(cb,p1) 也存在。谁能解释我如何让我的回调函数接收这些数据字段。调用 callback_call_3 的中间回调触发函数如下所示。

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

【问题讨论】:

  • 我不明白你的问题是什么,你尝试了什么,什么不起作用??

标签: c callback glib void-pointers


【解决方案1】:

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);正如您所解释的,将根据参数的数量调用适当的函数。

【讨论】:

    【解决方案2】:

    void** 是指向 void 指针的类型。

    至于如何在您的情况下使用它,您必须查阅文档。我无法从您发布的代码的 sn-p 中看出,变量名“p”也没有真正的帮助。

    编辑:至于提供原始数据的回调,回调函数没有任何参数。函数如何获取你的指针?

    Edit2:我明白了,这与 pcount 有关。但是回调的声明是错误的,因为它声明回调不接受任何参数...

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2012-02-01
      • 2012-10-15
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2016-11-16
      • 1970-01-01
      相关资源
      最近更新 更多