2015-09-13 2 views
1

Я работаю над улучшением реакции, вызванной внутри PJON. Это коммуникационная шина для Arduino, которую я пишу в c: https://github.com/gioblu/PJONКак передать указатель на функцию typedef в качестве параметра?

У меня есть некоторые проблемы с определением указателя на новый тип функции (typedef), который получает int (length) и указатель на массив байт (* полезная нагрузка):

В файле .h я объявляю функции типа приемника:

typedef void (* receiver)(uint8_t length, uint8_t *payload); 

класс PJON содержит также:

receiver _receiver; 

Установщик позволит пользователю установить функцию будет вызываться автоматически:

void PJON::set_receiver(receiver *r) { 
    _receiver = r; 
} 

Пользователь будет только объявить функцию:

receiver led_blink(uint8_t length, uint8_t *payload) { 
    digitalWrite(13, HIGH); 
    delay(30); 
    digitalWrite(13, LOW); 
    Serial.println("SUCCESS"); 
}; 

и передать его в инкубаторе:

network.set_receiver(led_blink); 

Когда система получает сообщение:

this->_receiver(data[1] - 4, data + 2); 

Вызывает функцию, передающую фактические параметры.

Это сообщение об ошибке я получаю от компилятора:

PJON.ino: In function 'void setup()': 
PJON.ino:14:33: error: no matching function for call to 'PJON::set_receiver(void (* (&)(uint8_t, uint8_t*))(uint8_t, uint8_t*))' 
PJON.ino:14:33: note: candidate is: 
In file included from PJON.ino:1:0: 
C:\Users\gio\Desktop\Arduino Software\arduino-1.6.0\libraries\PJON/PJON.h:115:10: note: void PJON::set_receiver(void (**)(uint8_t, uint8_t*)) 
    void set_receiver(receiver *r); 
     ^
C:\Users\gio\Desktop\Arduino Software\arduino-1.6.0\libraries\PJON/PJON.h:115:10: note: no known conversion for argument 1 from 'void (*(uint8_t, uint8_t*))(uint8_t, uint8_t*) {aka void (*(unsigned char, unsigned char*))(unsigned char, unsigned char*)}' to 'void (**)(uint8_t, uint8_t*) {aka void (**)(unsigned char, unsigned char*)}' 

Я не могу понять, где ошибка !!

+0

Это не C! И если это Arduino, это также не C++ – Olaf

+0

Указатели функций-членов не подходят для этого обратного вызова. Вы должны сделать функцию статической. –

+0

Спасибо вам за быстрый ответ. Почему не c ?? И, какая функция должна быть статической ??? Я знаю, что проводка не C и C++, но это код из библиотеки, которую я пишу, очевидно, содержит часть проводки, если вы ее включаете, но я думаю, можно считать C –

ответ

1
typedef void (* receiver)(uint8_t length, uint8_t *payload); 

это определяет идентификатор receiver, чтобы быть типом указателя к функции с заданной сигнатурой (обратите внимание на звездочку в ЬурейеМ). Так

void PJON::set_receiver(receiver *r) { 
    _receiver = r; 
} 

будет на самом деле ожидать указатель на указатель на функцию. (оставьте здесь звездочку, и он должен выразить то, что вы изначально имели в виду)

Это все, что я могу сказать наверняка, насколько это совместимо с C и/или C++ ... arduino имеет свой собственный (несколько похожий) язык , как уже отмечалось в комментариях - это все еще другой язык.

+0

Выполнение того, что вы предложили Я получаю это сообщение об ошибке: В функции 'ничтожной настройки()': ошибки: неправильное преобразование из «пустоты (* (*) (uint8_t, uint8_t *)) (uint8_t, uint8_t *) {ака недействительные (* (*) (unsigned char, unsigned char *)) (unsigned char, unsigned char *)} 'to' receiver {aka void (*) (unsigned char, unsigned char *)} '[-fpermissive] I n файл включен из PJON_reborn_rx.ino: 1: 0: ошибка: инициализирующий аргумент 1 из 'void PJON :: set_receiver (receiver)' [-fpermissive] void set_receiver (приемник r); –

+0

Вы уверены, что звездочка перед тем, как 'payload' находится в вашей первоначальной строке' typedef'? в сообщении об ошибке предлагается определить «приемник» как 'typedef void (* receiver) (uint8_t length, uint8_t полезная нагрузка);' ... но, возможно, я тоже что-то пропустил. –

+0

Да, звездочка есть, как вы говорите, но теперь я думаю, может быть, проблема заключается в том, как передать параметр внутри библиотеки: это -> _ приемник (данные [1] - 4, данные + 2); data - массив из uint8_t, может быть, я должен передать его как указатель? этот-> приемник (данные [1] - 4, * данные + 2); –

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