Hallo zusammen,
ja, ich habe bereits google bemüht, die Antworten haben aber irgendwie nicht funktioniert oder ich habe es einfach noch nicht verstanden.
Gibt es nicht einen eleganten Weg folgende Funktion mit einem "Array von Methoden" zu realisieren?
(Gerne mit ein wenig Erklärung)
int call_func(int funcnum) {
switch (funcnum) {
case 0:
return sc_0.tuwas();
break;
case 1:
return sc_1.tuwas();
break;
case 2:
return sc_2.tuwas();
break;
default:
{
Serial.println("Error in call_func");
return -1;
}
}
}
Ic hab's mal so probiert, aber es kommt nicht durch den Compiler
int call_func (int funcnum){
typedef int (*f_t)();
f_t functions[]={
sc_0.tuwas(),
sc_1.tuwas(),
sc_2.tuwas(),
};
return functions[funcnum]();
}
Tja...
Du beschreibst gekonnt, dass du in einer Sackgasse angekommen bist.
Aber leider hältst du den Kontext geheim.
z.B.: Was soll das überhaupt werden?
Wer ist sc_X?
Der Weg in Posting #4 funktioniert bestens (wenn man mal die Fehler beseitigt hat), ist im Prinzip nur eine Springtabelle wie du's überall hast.
Bei Klassen funktionierts nicht, weil die Adresse der Instanz der Klasse auch auf den Stack gepusht wird bevor die Methode angesprungen wird. Der 1. Parameter fehlt jetzt im 1. Posting - und den kann man auch nicht so einfach (ohne schwarze Magie) nachbilden, das mag der C++-Compiler gar nicht. Der Workaround schaut dann fast wie LISP-Code aus
Wie gesagt, es scheint sich hier eher um Instanzen zu drehen.
Nicht Funktionen.
Und der Methodenname ist auch immer gleich. Das ist sehr praktisch, da so mit einfachen Mitteln umsetzbar.
Ich hatte gedacht, dass meine Informationen ausreichen - scheinbar nicht!
Der Aufruf ist eine Methode in verschiedenen Klassen.
Alle Klassen machen komische Muster mit FastLED.
Alle Klassen sind unterschiedlich.
class scenario_xy {
int last_millis, delay_milli;
void efx() { // hier der Code hin
for (int i = 0; i < NUM_LEDS; leds[i++] = CRGB(random8(), random8(), random8()))
;
};
public:
void init() {
delay_milli = 200;
}
int tuwas() {
int m = millis();
if ((m - last_millis) < delay_milli) {
return 0;
}
last_millis = m;
efx();
return 1;
}
};
scenario_xy sc_xy;
Klingt nach einem Naturgesetz - kann ich aber nicht verifizieren, da ich durch ein Verringern der Geheimhaltung die Brauchbarkeit der Antworten nicht vergrößern konnte.
(Eine Seite des Terms hat sich also geändert die andere Seite blieb konstant)
Ich schrieb ja oben [quote="ettettette, post:1, topic:1353200"]
(Gerne mit ein wenig Erklärung)
[/quote]
Ohne auch nur eine rudimentäre Erklärung wenigstens eins der Beispiele komme ich nicht weiter.
Das Beispiel 15 scheint mir von Euch als zielführend angesehen zu werden - ich habe versucht, das zu übertragen, verstehe es aber nicht ganz - egal wie ich es mache, es hagelt Compilerfehler.
Liegt das viellicht an