ein mix von Zahlen und Funktionen passt semantisch nicht in ein Array.
Was aber sauber geht, ist eine Struktur mit Zahlen und einem Pointer auf eine Funktion.
Dann kann man aus dieser Struktur auch ein Array machen.
oder eben ein Array mit lauter Pointer auf Funktionen.
Mach mal einen ganz kleinen Sketch aus dem ersichtlich ist, was du wirklich brauchst.
einarry[] = {1,2,3};
int x = einarray[2]
switch (x)
{
case 3:
funktion();
break;
}
Du kannst weitere case anlegen oder alle andern weglassen.
So ähnlich ginge das auch mit if/else if/else mit dem Unterschied, das Du dann mehrere Bedingungen definierst und ggfls. erst alle durchlaufen werden, bevor Du am letzten else bist, oder schlimmstenfalls sich Bedingungen gegenseitig ausschliessen.
Danke für die Antworten. Mit If/Else/Switch hatte ich bisher alles lösen können, aber das frisst viel Speicher. Im Grunde überlege ich, wie man eine Menüstruktur macht, mit zB 3 Menüs mit jeweils 8 Menüeinträgen, gesteuert über 3 Buttons UP/DOWN/SELECT.
Das lässt sich sehr einfach mit einem mehrdimensionalen Array aufbauen, bin dann aber durch Datentypen begrenzt, und kann keine Untermenüs ohne If/Switch aufrufen.
Ich habe mir Beispiele für Strukturen angesehen, kanns aber nicht nachvollziehen, gibts dazu eine grafische Erklärung die mir vielleicht weiterhelfen könnte?
Man lernt keine Sprache durch Beispiele.
Man lernt daraus nur das kopieren der Fehler/Schwächen des Autors.
evtl. Du solltest dein modernes C++ Buch befragen
struct Menu
{
int tata;
void tuwas(Print &p)
{
p.println(tata);
}
};
Menu test[] {2,56,42};
void setup()
{
Serial.begin(9600);
test[2].tuwas(Serial);
}
void loop()
{
}
Hi Combie, danke für das Beispiel, größtenteils kann ich es nachvollziehen. Aber wie kann ich damit ein codesparendes Menü aufbauen?
Normalerweise nehme ich ein paar arrays her, eins für Menütitel/Einträge, eins für die Werte, dann für min/max Werte und evtl Schrittweite (um wieviel bei Knopfdruck hoch/runter gezählt wird). Dann noch ein byte für Menü, und eins für das jeweilige Untermenü. Ein Knopfdruck sieht dann etwa so aus: ++array[menü][untermenü], gefolgt von Überprüfung der min/max Werte. Sehr minimalistisch, aber auch unflexibel. Will ich in einem Untermü keine Werte hoch/runterzählen, sondern in eine Methode springen, stehe ich an. Also gibt es keine Art Zeiger, die bei jedweder Art von Zugriff auf die Speicheradresse meines Arrayeintrags (++,--,..) in eine Methode springt?
Felder enthalten gleichartige Elemente, also alles int oder uint32_t. Strukturen können hingegen verschiedenartige Elemente enthalten, also beispielsweise int, uint32_t und sogar Methoden gemischt. Das Feld einer Struktur ist die erste Dimension, die Elemente der Struktur quasi die zweite.
Mein Problem bei der Struktur ist, dass ich nicht weiß wie ich den Code bei Knopfdruck ohne viel If/Switch gestalten kann.
Bisher reichten nur ein paar Zeilen Code mit Arrays, vorausgesetzt es werden nur Werte im Array hoch/runtergezählt. Um Funktionen aufzurufen, und auch die Zahlenwerte von diesen Menüeinträge am Display zu verbergen, brauchts dann viel If/Switch, oder gehts eleganter?
Ich habe es bereits beschrieben: Bei Knopfdruck einfach ++array[menü][untermenü]. Genauer müsste es heißen ++wert[menü][menüeintrag].
Wenn ich zB in Menü 1, Eintrag Nr 2 keinen Wert hochzählen, sondern eine Methode aufrufen möchte, schreibe ich if(menü == 1 && menüeintrag == 2) machwas(); else ++wert[menü][menüeintrag];
Habe ich dann zB im Menü 2 und 3 noch ein paar Funktionsaufrufe, wird der Code recht groß.