Array als Rückgabewert

Hallo,

kurze Frage. Da ich die meisten Lichteffekte mit einer Hilfsfunktion bewältige, wollte ich fragen, ob es möglich ist, einen Array als return zurückzuliefern.

void rainbow() {
	uint8_t rainbowWidth = menuSettings[indexMenuSettings];
	uint16_t duration = menuDuration[indexMenuDuration];

	byte colorshift;
	byte hue[NUM_LEDS];

	// Farbverschiebung
	colorshift = (255 * millis() / duration) % 255;
	for(int i = 0; i < NUM_LEDS; i++)	{
		hue[i] = (i * 255 / rainbowWidth + colorshift) % 255;
	}
}

Falls nein, oder sinnfrei, oder recht aufwenig, belasse ich es dann, dieses in den glob Vars zu deponieren.

Eine weitere Frage, die mir vllt Serenfly beantworten kann bezüglich enum. Hab enum bereits einmal getestet.

Die Frage ist, geht es irgendwie, dass ich mit enum direkt Funktionen aufrufen kann? Funktionen sind inzwischen soweit ohne Parameter da sie Global gesteuert werden.

Irgenwie sowas wie enum

enum modus
{
  func0,
  func1,
  func2,
  func3,
} stateModus;

Zwei Möglichkeiten:

1.) Du legst das Array vor dem Methoden-Aufruf an und übergibst einen Pointer und die Größe. So funktionieren fast alle C String Funktionen
2.) Du deklarierst das Array in der Methode als static. Dann kannst du einen Pointer zurückgeben, da der Speicher gültig bleibt

Wegen dem zweiten:
Du willst da eher ein Array aus Function Pointern. Dann kannst du vielleicht enums nehmen um einen aussagekräftigen Namen für die Indices zu haben.

EDIT:
Das hier geht:

void func1()
{
  Serial.println("Funktion 1");
}

void func2()
{
  Serial.println("Funktion 2");
}

void loop()
{
   enum { FUNC1, FUNC2 };
   void (*functions[2])(void);

   functions[0] = func1;
   functions[1] = func2;

   //oder: void (*functions[])(void) = { func1, func2 };

   functions[FUNC1]();
   functions[FUNC2]();
}

Wegen dem enum hatten wir uns mal unterhalten, damals war es so nicht möglich wegen den Parametern?

Hintergrund ist, das mir die switchcase zu lästig ist zu pfelgen und die if-variante ineffezienter ist. Wenn ich das richtig verstanden habe, ist es für den Compiler/µC einfacher ein switchCase zu verwalten da es sich hierbei um eine Wahrheitstabelle handelt, welche auch bei entsprechender Größe automatisch optimiert wird. Bei einem If fragt er jede Anweisung ab.

Du kannst schon auf enums switchen, da in C enums frei in Integer konvertierbar sind. Compiler-maßig, wird das oft mit einer Sprungtabelle gemacht. Man weiß über die Labels auf welchen Befehl man springen muss und dann kommt einfach ein absoluter Sprung auf die entsprechenden Befehle.

Haben oben mal etwas Code für ein Array aus Function Pointern mit Ansprechen über Enums geschrieben. Weiß nicht ob du sowas gemeint hast.

Hallo,

wie Du Arrays dynamisch anlegen kannst habe ich hier beschrieben. Die Pointer auf diese Arrays kannst Du dann an Funktionen übergeben oder auch von einer Funktion als Rückgabewert erhalten.

Den Aufruf der einzelnen Funktion über ein Array aus Funktionspointern habe ich hier erklärt. In meinem Beispiel werden vier verschiedene Funktionen für die vier Grundrechenarten einfach so

  for(int i = 0; i < 4; i++) {
      func[i](a, b);
  }

aufgerufen. Auf diese Art und Weise könntest Du Dir Pointer auf Deine verschiedenen gewünschten Funktionen erzeugen und diese, wenn es sein muss über switch...case, aber vielleicht sogar einfach in einer Schleife, wie in meinem Beispiel, aufrufen.

Ich hoffe, das hilft Dir weiter, falls noch Fragen bestehen, frag einfach. Hoffentlich ist das ok, wenn ich einfach die Links angebe, aber alles was ich da geschrieben habe, hier nochmal schreiben ist ja auch nicht so sinnvoll.

Gruß,
Ralf

Dynamische Arrays braucht man eigentlich nur wenn die Größe zur Compile-Zeit nicht fest steht. Wenn man immer eine feste Anzahl von Werten zurück geben will, ist es einfach es einfach static zu deklarieren.

Werde es mir gleich alles mal durchlesen. Schoneinmal danke :wink: