我正在努力改进 PJON 内部触发 react 的方式。这是我在 c 中编写的 Arduino 的通信总线系统:https://github.com/gioblu/PJON
我在定义指向接收 int(长度)的新型函数(typedef)的指针和指向字节数组(*payload)的指针时遇到了一些麻烦:
在 .h 文件中,我声明了接收器类型函数:
typedef void (* receiver)(uint8_t length, uint8_t *payload);
PJON 类还包含:
receiver _receiver;
setter 将让用户设置函数将被自动调用:
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");
};
并将其传递给 setter :
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*)}'
我不明白哪里错了!!
最佳答案
typedef void (* receiver)(uint8_t length, uint8_t *payload);
这将标识符 receiver
定义为指向具有给定签名的函数的指针类型(注意 typedef 中的星号)。所以
void PJON::set_receiver(receiver *r) {
_receiver = r;
}
实际上需要一个指向函数指针的指针。 (此处省略星号,它应该表达您最初的意思)
就与 C 和/或 C++ 兼容而言,这就是我可以肯定地说的全部……正如评论中已经指出的那样,arduino 有自己的(有点相似)语言——它仍然是一种不同的语言。
关于c - 如何将指针作为参数传递给 typedef 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550862/