2016-12-30 89 views
0

我想創建一個任務列表,它應該在主循環()後面的任務調度器中使用。我試圖用構造函數,但編譯器會引發錯誤 could not covert '{doKeypad,2000,0}' from '<brace-enclosed initializer list>' to 'Task'帶有函數指針的數組構造函數?

struct Task{ 
    void (*proc)();      // Process callback 
    unsigned long dly;     // delay in ms 
    unsigned long mls = 0;    // last run in millis() 
}; 

Task task[] = {       // This is much more readable 
    {doKeypad, 2000, 0},    // but it does not work :) 
    {doPower, 10, 0}, 
    {doDallas, 800, 0}, 
    {doLcd,  500, 0} 
}; 

void doKeypad(){ 
    // some code here... 
} 
// rest of code follows - doPower(), doDallas() ... 

什麼將是實現這一目標的最簡單的方法?我可以做一個函數來手動填充任務數組,但它看起來很醜,並且不太可讀。我已經看到了一些類似的問題,但他們對類和太複雜,我:/

+2

您是否有前瞻性聲明功能? –

+0

另外,它純粹是一種文體偏好,但是當我想初始化一個函數指針時,我使用操作符'&functionname'的地址,就像我製作數據指針時一樣。裸函數的名字會衰減到一個指針,但是讀者不清楚你正在處理函數指針而不是某種類型的函數對象。 –

+0

在C++編譯器上,假設正確的原型,它對我來說編譯得很好:http://rextester.com/RXVP25357也許你的編譯器不支持C++標準? –

回答

0

看看你的編譯器是尋找一個構造函數:

typedef void(*aproc) (); 
struct Task{ 
    void (*proc)();      // Process callback 
    unsigned long dly;     // delay in ms 
    unsigned long mls = 0;    // last run in millis() 
    Task(aproc a, unsigned long b, unsigned long c) { proc= a; dly= b; mls= c; } 
}; 
1

哦,我知道了。錯誤是在結構中:

struct Task{ 
    void (*proc)(); 
    unsigned long dly; 
    unsigned long mls = 0; // < There should not be = 0 
}; 

刪除它後,它編譯罰款。

+0

啊是的。以及爲什麼構造函數可以緩解這個問題。一個。 – lakeweb

+0

在這方面從C++ 11到C++ 14的聚合屬性更改。在C++ 11中,類中的初始化避免將類作爲聚合。在C++ 14中不再是這樣。 – Jarod42