Großes Array via wahlweiser Funktion füllen

Hallo,

ich würde gerne per patternWahl das ausgabePattern mit einem von drei wählbaren Pattern füllen.

#define ALL_LEDS 150

CRGB ausgabePattern[ALL_LEDS];
byte patternWahl = 2;

switch (patternWahl)
{
case 1:
  ausgabePattern = animation01();
  break;
case 2:
  ausgabePattern = animation02();
  break;
case 3:
  ausgabePattern = animation03();
  break;
}

CRGB animation01()
{
  CRGB animation01_pattern[ALL_LEDS];
  berechnungDesPatterns01();
  return animation01_pattern;
}

CRGB animation02()
{
  CRGB animation02_pattern[ALL_LEDS];
  berechnungDesPatterns02();
  return animation02_pattern;
}

CRGB animation03()
{
  CRGB animation03_pattern[ALL_LEDS];
  berechnungDesPatterns03();
  return animation03_pattern;
}

Macht man das so und falls nicht, wie dann?

Gruß Chris

Im Beitrag hier führe ich drei Animationen zusammen. Leider hast Du da nicht drauf reagiert :frowning:

Oh- stimmt. Danke. Dann werde ich mir das zunächst einmal zu Gemüte führen..

Gruß Chris

Es gibt da viele Möglichkeiten, je nachdem was Du tatsächlich möchtest.

Im einfachsten Fall alle Muster in ein const Array packen, und dann mit patternWahl als Index auswählen.
Wenn Du Funktionen möchtest, die können direkt in ausgabePattern reinschreiben, dafür ist keine Zuweisung notwendig. Eine Zuweisung braucht man nur, wenn ausgabePattern ein Pointer ist, der dann auf das ausgewählte Array zeigen soll.

Wie wird das Pattern denn weiterverwendet, Codeschnipsel?

ausgabePattern = animation01();

Die Funktion könnte einen Zeiger auf ein (statisches) Array zurückliefern.
Aber leider nicht dein CRGB ausgabePattern[] überschreiben.
(Oder geht das inzwischen mit c++11 ?)

Ich würde sowas bauen:

void animation01(CRGB* ausgabePattern);

michael_x:
(Oder geht das inzwischen mit c++11 ?)

Nein. So grundlegende Sachen sind noch wie immer :slight_smile:

:stuck_out_tongue:
dann bin ich ja beruhigt ( diesmal zur Sicherheit mit :slight_smile: )

michael_x:
Ich würde sowas bauen:

void animation01(CRGB* ausgabePattern);

Müsste es nicht void animation01(CRGB &ausgabePattern); heissen, sprich call-by-reference?

Gruß Chris

Array-Variablen sind Zeiger auf das erste Element. Das solltest du inzwischen wissen.

Hm.. ok, schade.

Gruß Chris

Wieso schade? Es ist ja call-by-reference. Allerdings mit Zeigern statt Referenzen und es geschieht automatisch, da die Array Variable in einen Zeiger zerfällt.

Ich meinte "schade, dass jeweils nur das erste Element eines Array so übergeben werden kann".

Gruß Chris

Oh, je. Es wird ein Zeiger auf das erste Element übergeben! Auf das gesamte Array kannst du wie üblich mit [] zugreifen.

Danke soweit.

Gruß Chris

Was übrigens gehen würde wäre das:

void animation01(CRGB (&ausgabePattern)[ALL_LEDS]);

Das hat den Vorteil, dass dann sizeof() korrekt funktioniert. Aber bringt auch nichts da man die Größe einfacher mit ALL_LEDs schon hat. Das sieht man nicht oft, da man Funktionen meistens so schreiben möchte dass man Arrays beliebiger Größe übergeben kann. Hier würde es aber gehen.

Ansonsten ist es aber das übliche Prinzip in C, dass du bei den ganzen Standard C Funktionen siehst: wenn man einen Puffer mit irgendetwas füllen möchte übergibt man ihn vorher an die Funktion.