簡體   English   中英

將void(*)()轉換為void(*)(unsigned char)

[英]Convert void (*)() to void (*)(unsigned char)

我正在嘗試將void (*)()轉換為void (*)(unsigned char)但是我對C ++的了解還不夠。 我進行了搜索,但找不到任何示例。 所以我想創建一個函數function但出現了一些錯誤:

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

有人能幫我嗎?

您需要維護每個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)

);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM