我遇到了一个非常令人困惑的错误,因为我可能在措辞或类型句柄方面犯了一个小错误,或者这可能是一个更复杂的问题
基本上,我想在Buf_IO(HAL_StatusTypeDef IO)
上创建这个函数,它可以接受两个输入中的一个HAL_SPI_Transmit
或HAL_SPI_Recieve
这两者都被定义为
HAL_StatusTypeDef HAL_SPI_Transmit/*or Recieve*/(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
所以在我的代码中,我定义了如下的函数指针
HAL_StatusTypeDef (FuncPtr*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t) = IO;
其中IO是我的函数的自变量然而,由于某种原因,我得到错误
invalid conversion from 'HAL_StatusTypeDef (*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t)' {aka 'HAL_StatusTypeDef (*)(__SPI_HandleTypeDef*, unsigned char*, short unsigned int, long unsigned int)'} to 'void (*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t)' {aka 'void (*)(__SPI_HandleTypeDef*, unsigned char*, short unsigned int, long unsigned int)'}
为了清楚起见,这是我在.cpp文件中声明函数的方式
void MAX_Interface::Buf_IO(HAL_StatusTypeDef IO)
{
HAL_StatusTypeDef (FuncPtr*)(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t) = IO;
uint8_t* buf_ptr = (uint8_t*) &OBuf;
HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_RESET);
FuncPtr(h_SPI, buf_ptr, 3, 100);
HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_SET);
}
我确实理解我可能过于复杂了,因为我之前只写了两个不同的函数来传输接收信号,但我希望让我的代码更简洁,并在这个过程中学到一些东西,所以如果你能想到一个,请随意提出一个更优雅的解决方案?
在C++中,应该使用using
指令来定义函数签名。using
类似于C语言中的typedef
,但使其可读性更强。
using IO = HAL_StatusTypeDef(SPI_HandleTypeDef*, uint8_t*, uint16_t, uint32_t);
请注意,IO现在是函数签名本身的别名,而不是指向函数的指针。
现在,在您的函数中,您使用它作为IO*
来指定参数是一个函数指针:
void MAX_Interface::Buf_IO(IO* funcPtr)
{
uint8_t* buf_ptr = (uint8_t*) &OBuf;
HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_RESET);
funcPtr(h_SPI, buf_ptr, 3, 100);
HAL_GPIO_WritePin(GPIOB, h_CS, GPIO_PIN_SET);
}