Я работаю над улучшением реакции, вызванной внутри 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*)}'
Я не могу понять, где ошибка !!
Это не C! И если это Arduino, это также не C++ – Olaf
Указатели функций-членов не подходят для этого обратного вызова. Вы должны сделать функцию статической. –
Спасибо вам за быстрый ответ. Почему не c ?? И, какая функция должна быть статической ??? Я знаю, что проводка не C и C++, но это код из библиотеки, которую я пишу, очевидно, содержит часть проводки, если вы ее включаете, но я думаю, можно считать C –