将void(*)()转换为void(*)(unsigned char)

时间:2017-11-16 18:22:37

标签: c++ function-pointers

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

错误:'castHandler'声明为函数返回函数void   castHandler(voidFuncPtr handler)(uint8_t gpio_num)

     

错误:未在此范围内声明'castHandler'        gpio_set_interrupt(pin,GPIO_INTTYPE_EDGE_ANY,castHandler(handler));

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您需要为每个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);
}

答案 1 :(得分:0)

为什么不写一个函数来进行重定向,即

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)

);