2016-12-30 86 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