将 void (*)() 转换为 void (*)(无符号字符)

Convert void (*)() to void (*)(unsigned char)

本文关键字:void 无符号 字符 转换      更新时间:2023-10-16

我正在尝试将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));
}

错误:"强制处理程序"声明为返回函数 void 的函数 castHandler(voidFuncPtr handler((uint8_t gpio_num(

错误:未在此范围内声明"强制转换处理程序" gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler((;

有人可以帮助我吗?

您需要为每个 GPIO 维护一个处理程序表。类似于以下内容(未经测试和不完整 - 省略了一些初始化和错误检查(代码:

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 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)
);