gpt4 book ai didi

c - 如何将指针作为参数传递给 typedef 函数?

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:12 25 4
gpt4 key购买 nike

我正在努力改进 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com