2016-12-30 3 views
0

Ich versuche eine Aufgabenliste zu erstellen, die später in main loop() im Aufgabenplaner verwendet werden soll. Ich habe versucht, Konstruktor zu verwenden, aber Compiler wirft einen Fehler could not covert '{doKeypad,2000,0}' from '<brace-enclosed initializer list>' to 'Task'Array-Konstruktor mit Funktionszeigern?

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() ... 

Was ist der einfachste Weg, dies zu erreichen wäre? Ich kann eine Funktion ausführen, um das Aufgabenarray manuell zu füllen, aber es sieht hässlich aus und es ist nicht sehr lesbar. Ich habe einige ähnliche Fragen gesehen, aber sie waren über Klassen und zu kompliziert für mich:/

+2

Haben Sie eine Forward-Deklaration für die Funktionen? –

+0

Es ist auch nur eine stilistische Präferenz, aber wenn ich einen Funktionszeiger initialisieren möchte, benutze ich den Adressoperator '& functionname', genau wie ich es machen würde, wenn ich einen Datenzeiger mache. Der Name der bloßen Funktion wird zu einem Zeiger zerfallen, aber es ist einem Leser nicht so klar, dass es sich um einen Funktionszeiger im Gegensatz zu einem Funktionsobjekt eines Typs handelt. –

+0

Auf einem C++ - Compiler, vorausgesetzt, die richtigen Prototypen, kompiliert es gut für mich: http://rexttester.com/RXVP25357 Vielleicht unterstützt Ihr Compiler nicht den C++ - Standard? –

Antwort

0

Sehen Sie, wenn Ihr Compiler für einen Konstruktor sucht:

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

Oh, ich habe es. Der Fehler ist in der Struktur:

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

Nachdem es entfernt wird, kompiliert es in Ordnung.

+0

Ahh ja. Und warum der Konstruktor das Problem mildert. Eins oben. – lakeweb

+0

Aggregateigenschaft ändert sich in dieser Hinsicht von C++ 11 zu C++ 14. In C++ 11 verhindert diese Initialisierung in der Klasse, dass die Klasse ein Aggregat ist. In C++ 14 trifft das nicht mehr zu. – Jarod42

Verwandte Themen