2012-08-14 23 views
2

Я использую openCV и нуждаюсь в некоторой функции обратного вызова. Эти функции callback просто принимают ограниченные параметры. Итак, если мне нужно больше переменных для этой функции, я должен сделать глобальные переменные и повернуть их между функциями.C: массив void *

Например, здесь есть функция обратного вызова:

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

Создайте структуру со всеми вашими данными в ней, а затем нарисуйте ее на 'void *'? – GWW

+0

http://stackoverflow.com/questions/7262012/array-of-void-pointers-in-c – perilbrain

+0

@LuchianGrigore ах, да, мы знаем размер (void *). Прости. но я все еще не могу использовать как: '(void *) a [];' – hqt

ответ

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. */ 
3

Вы можете сделать массив void * потому указатель имеет определенный размер, тем не менее, вы не можете использовать эти указатели, не бросая их.

1

Вам необходимо отправить void *, который указывает на структуру с вашими параметрами. В функции обратного вызова при разыгрывании этого типа (недействительный *) обратно в STRUCT * с вашим Params, как это:

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 и бросьте его адрес (ничтожный *):

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

mouse_callback((void*) &myparams); 
+0

Нет необходимости в отливке. –

+0

Правильно ... (void *) & params, когда вызов функции не требуется. Но он разъясняет, что это происходит, подумал.Но нужны ли данные «(paramsstruct *)» или, по крайней мере, лучше написанный код ;-) – SDwarfs

+0

Ни один актер не нужен, ни проясняет что-либо вообще. Правила неявного преобразования являются и должны быть понятны любому программисту на C, и очевидно, что тип локальной переменной 'param' будет в любом случае. –

Смежные вопросы