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

ああはい。なぜコンストラクターが問題を緩和するのですか? 1つアップ。 – lakeweb

+0

これに関する集約プロパティの変更は、C++ 11からC++ 14に関連しています。 C++ 11では、クラスの初期化によってクラスが集約されることはありません。もはやC++では真ではありません。 – Jarod42

関連する問題