2014-12-02 4 views
0

Я работаю над приложением smartwatch, написанным на C, и я пытаюсь передать указатель функции в качестве параметра в мои обработчики кнопок, чтобы он мог быть вызван из него. До сих пор я сделал следующее, но я получил сообщение об ошибке, заявив, что объект, который я вызываю, не является функцией.Передача функций как параметров для обработчиков кнопок в C

void func(){ 
    ... 
} 

static void select_click_handler(ClickRecognizerRef recognizer, void *context){ 
    context(); 
} 

static void click_config_provider(void *context) { 
    window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler); 
    window_set_click_context(BUTTON_ID_SELECT, context); 
} 

int main(void){ 
    ... 
    action_bar = action_bar_layer_create(); 
    action_bar_layer_set_click_config_provider(action_bar, click_config_provider); 
    action_bar_layer_set_context(action_bar, &func); 
} 

Документация:

action_bar_layer_create

action_bar_layer_set_click_config_provider

action_bar_layer_set_context

+0

, на какой строке происходит ошибка? – Bathsheba

+0

ошибка: называемый объект «контекст» не является функцией. При попытке вызвать его в 'select_click_handler' – Rakim

+0

' context' не является функцией, это 'void *'. Вы уверены, что контекст является функцией? Если это так, это вызовет приведение, но я подозреваю, что контекст является контекстом. – doctorlove

ответ

1

В select_click_handler() функция context является void * так что вам нужно типаж его соответствующим образом перед вызовом.

Предполагая context это func вы можете сделать это

static void select_click_handler(ClickRecognizerRef recognizer, void *context){ 
    ((void (*)(void)) context)(); 
} 

Кроме того, в этой строке action_bar_layer_set_context(action_bar, &func); вам не нужно & просто передать func не &func.

+0

как это сделать? – Rakim

+0

@Rakim, зависит от того, какой тип функции вы хотите вызвать. – Rohan

+0

@Rakim. Генератор прототипа функции - это '(тип возврата) (* имя функции) (список аргументов)' –

0
static void select_click_handler(ClickRecognizerRef recognizer, void *context){ 
context(); 
} 

В этом context переменная только указатель, а не функция. поэтому вам нужно придумать или определить его правильно, чтобы использовать его для вызова функции.

Но вы передаете указатель функции в качестве аргумента. поэтому, я надеюсь, что эти ссылки помогут вам

Function pointer as an argument

1

В C void* используется во многих местах, чтобы стоять в течение общего указателя, который может быть либо указатель на переменную или указатель на функцию. Вы используете последний.

В точке использования вам необходимо указать листинг это правильный тип, иначе время выполнения не будет знать, что делать. В вашем случае правильный тип - это функция, которая не принимает аргументов и возвращает void.

Для этого используйте вызывающий сайт ((void (*)(void *))context)(); в пределах select_click_handler

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