将 void (*)() 转换为 void (*)(unsigned char)
Convert void (*)() to void (*)(unsigned char)
我正在尝试将 void (*)()
转换为 void (*)(unsigned char)
,但我的 C++ 知识还不够好。我搜索过,但找不到任何示例。所以我想创建一个函数的函数但是我得到了一些错误:
typedef void (* voidFuncPtr)();
void castHandler(voidFuncPtr handler)(uint8_t gpio_num)
{
handler();
}
void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode)
{
// typedef void (* voidFuncPtr)();
// typedef void (* gpio_interrupt_handler_t)(uint8_t gpio_num);
// typedef void (* gpio_interrupt_handler_t)(unsigned char)
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler));
}
error: 'castHandler' declared as function returning a function void
castHandler(voidFuncPtr handler)(uint8_t gpio_num)
error: 'castHandler' was not declared in this scope
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler));
有人可以帮助我吗?
为什么不直接写一个函数来做重定向呢
void redirectFunction(unsigned char)
{
handler();
}
然后
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY,redirectFunction);
编辑
也许在 C++ 中是这样的:
void redirectFunction(std::function<void()> handler, unsigned char)
{
handler();
}
void wibble() { }
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY,
std::bind(redirectFunction, _1, wibble)
);
您需要为每个 GPIO 维护 table 个处理程序。类似下面的代码(未经测试且不完整 - 省略了一些初始化和错误检查)代码:
typedef void (* voidFuncPtr)();
voidFuncPtr handlers[MAX_HANDLERS];
void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode)
{
handlers[pin] = handler;
}
void handleGPIO(unsigned char pin)
{
if (handlers[pin])
handlers[pin]();
}
void enableGPIOInterrupts(void)
{
/// Do this for each available pin
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, handleGPIO);
}
我正在尝试将 void (*)()
转换为 void (*)(unsigned char)
,但我的 C++ 知识还不够好。我搜索过,但找不到任何示例。所以我想创建一个函数的函数但是我得到了一些错误:
typedef void (* voidFuncPtr)();
void castHandler(voidFuncPtr handler)(uint8_t gpio_num)
{
handler();
}
void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode)
{
// typedef void (* voidFuncPtr)();
// typedef void (* gpio_interrupt_handler_t)(uint8_t gpio_num);
// typedef void (* gpio_interrupt_handler_t)(unsigned char)
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler));
}
error: 'castHandler' declared as function returning a function void castHandler(voidFuncPtr handler)(uint8_t gpio_num)
error: 'castHandler' was not declared in this scope gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler));
有人可以帮助我吗?
为什么不直接写一个函数来做重定向呢
void redirectFunction(unsigned char)
{
handler();
}
然后
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY,redirectFunction);
编辑
也许在 C++ 中是这样的:
void redirectFunction(std::function<void()> handler, unsigned char)
{
handler();
}
void wibble() { }
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY,
std::bind(redirectFunction, _1, wibble)
);
您需要为每个 GPIO 维护 table 个处理程序。类似下面的代码(未经测试且不完整 - 省略了一些初始化和错误检查)代码:
typedef void (* voidFuncPtr)();
voidFuncPtr handlers[MAX_HANDLERS];
void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode)
{
handlers[pin] = handler;
}
void handleGPIO(unsigned char pin)
{
if (handlers[pin])
handlers[pin]();
}
void enableGPIOInterrupts(void)
{
/// Do this for each available pin
gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, handleGPIO);
}