Funktion in Array einbauen

Hallo,

Ist es möglich eine Funktion in ein Array einzubauen?

Z.b.: einarray[] = {1, 2, funktion}

Int x = einarray[2]; // springe zu Funktion

void funktion() {
Serial.print("Hallo");
}

Ist das möglich, und wenn ja, kann man die funktion auch mit zb ++meinarray[2] aufrufen?

Liebe Grüße

Hallo Kolbi

Nein, dass ist nicht möglich.

Verwendet werden können aber Member-Functions in structured-arrays.

Hallo,
erkläre doch bitte mal genauer, was du damit erreichen möchtest.

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.

1 Like

Ja, außerdem:
Strukturen können neben Daten auch Funktionen (Methoden) enthalten, sind dann (fast) dasselbe wie Klassen.

Im übrigen ist bei einer Funktion neben dem Namen auch relevant, welche Datentypen die Aufrufparameter haben.

Das sehe ich auch so. Ein Array wirst du vermutlich nicht brauchen.

Ich sehe da einen Ansatzpunkt.
switch/case

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.

1 Like

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

}

Ich glaube da fehlt ein Wort.

Nur ein Buchstabe.

1 Like

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?

Du kannst beide ++ Operatoren überladen bzw. selbst implementieren.
Dann machen sie was du willst.

Die Prosa verstehe ich nicht.

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.

und damit hast du schon deine Struktur ...
menütitel
Wert
min
max
Schrittweite

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?

Kann ich dir nicht beantworten, da ich deine Vorstellungen nicht verstehe.

dann mach mal einen Sketch mit ein paar Zeilen Code mit Arrays und 3 Funktionen die aufgerufen werden sollen.

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ß.

Das frisst nicht viel Speicher. Viel mehr Speicher geht auf deine Strings drauf.

Zeige doch einfach mal deinen Code. Dann ist es einfacher über Optimierungen zu sprechen.