2

我正在使用openCV并且需要一些回调函数。这些callback函数只接受有限的参数。因此,如果我需要为这些函数提供更多变量,我必须创建一个全局变量并在函数之间转换它。

例如,这里是回调函数:

    void mouse_callback(int event, int x, int y, int flags, void* param);
// params : addition parameter, and just one, I need more parameters for this callback.
// but cannot, so make global variable.

而且因为我不应该这样做(制作全局变量),所以我决定制作数组,(void*)但我担心 C 无法做到这一点,因为每个成员的大小可能不同。

我的问题是:我们可以制作(void *)的数组吗,如果没有,我该如何克服我的问题:使用回调函数并且不需要制作全局变量。

谢谢 :)

4

3 回答 3

7

定义一个struct能够保存所有必要值并将其地址作为param参数传递的:

struct my_type
{
    int i;
    char c;
};

void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
    struct my_type* t = param;
}

不确定注册机制是什么,但您需要确保指向的对象的生命param周期在回调函数的调用期间有效:

struct my_type* mouse_param = malloc(sizeof(*mouse_param));
mouse_param->i = 4;
mouse_param->c = 'a';

register_mouse_callback(my_mouse_callback, mouse_param);

具体来说,不要这样做:

{
    struct my_type mouse_param = { 4, 'a' };
    register_mouse_callback(my_mouse_callback, &mouse_param);
} /* 'mouse_param' would be a dangling pointer in the callback. */
于 2012-08-14T16:12:19.473 回答
3

您可以制作数组,void *因为指针具有确定的大小,但是,您不能在不强制转换的情况下使用这些指针。

于 2012-08-14T16:12:15.140 回答
1

您需要发送一个指向带有参数的结构的 void* 。在回调函数中,您使用如下参数将此类型 (void*) 转换回 struct*:

typedef struct {
  int event;
  int x;
  int y;
  int flags;
} params;

void mouse_callback(void *data) {
   params* param  = (params*) data;
   // now you can use param->x or param->y to access the parameters
}

要传递参数,您需要创建一个 paramstruct 并将其地址转换为 (void*):

paramstruct myparams;
myparams.x = 2;
myparams.y = 1;

mouse_callback( (void*) &myparams );
于 2012-08-14T16:16:59.273 回答