C:无效的数组*

时间:2012-08-14 16:09:50

标签: c void-pointers

我正在使用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 *)数组,如果没有,我怎样才能克服我的问题:使用回调函数而不需要创建全局变量。

谢谢:)

3 个答案:

答案 0 :(得分: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. */

答案 1 :(得分:3)

你可以创建void *数组,因为指针有一个确定的大小,但是,如果没有强制转换它们就不能使用这些指针。

答案 2 :(得分: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 );