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