Funktionsaufruf mit Variable im Namen

Hallo! :slight_smile:

Ich möchte gerne wie folgt eine Funktion aufrufen, die im Namen eine Variable enthält:

int i = 1;

funktion_i();
^

void funktion_1()
{
...
}

Zum Sinn und Zweck des Ganzen, ich möchte 64 Prozesse gleichzeitig laufen lassen. Und da das nicht geht löse ich die einzelnen Schleifen auf. Ist jetzt ein wenig kompliziert das zu erklären...

Ich glaube: Du möchtest Arrays verwenden.
Entweder mit Instanzen deiner Tasks, oder mit Zeigern auf Funktionen.

Wenn ich die Zahlen in dem Array inkrementieren kann,

dann ja! :slight_smile:

jmo1977:
Wenn ich die Zahlen in dem Array inkrementieren kann,

Mir scheint du bist auf einem Irrweg.

Lass uns bitte zurückgehen, an die Stelle, bevor du falsch abgebogen bist.

Also nochmal:
Was willst du erreichen?
Beschreibe nicht den Weg, sondern das Ziel!

64 Prozesse?
Was sollen die tun?

jmo1977:
Wenn ich die Zahlen in dem Array inkrementieren kann,

Der Index wird inkrementiert. Schau dir erst mal an was ein Funktionszeiger ist

using funcPtr = void(*)();

PROGMEM const funcPtr functions[] = { func_1, func_2, func_3 };
const unsigned int NUMBER_OF_FUNCTIONS = sizeof(functions) / sizeof(functions[0]);

void setup()
{
  Serial.begin(9600);

  for (unsigned int i = 0; i < NUMBER_OF_FUNCTIONS; i++)
  {
    funcPtr func = (funcPtr)pgm_read_word(&functions[i]);

    if (func != NULL)
      func();

    delay(500);
  }
}

void loop()
{
}

void func_1()
{
  Serial.println("Function 1");
}

void func_2()
{
  Serial.println("Function 2");
}

void func_3()
{
  Serial.println("Function 3");
}

Ansonsten kann es wie gesagt sein dass du dich hier auf einem Irrweg befindest weil du dich schon auf eine Lösung festgelegt hast

Also:

Ich habe einen Block von 64 RGB-LEDs seriell in einer Dasy-Chain hintereinander geschaltet.
Wenn man von einer normalen Regenbogenanzeige ausgeht, durchläuft jede LED 1536 Steps.

Jetzt soll LED 1 mit Step1 starten. Gleichzeitig startet LED 2 mit Step 24, LED 3 mit Step 48 usw. bis LED 64 mit Step 1536.

Danach wird jede LED um einen Step inkrementiert. Wenn die Stepzähler 1536 erreicht haben, fangen sie wieder bei 1 an.

Hätte eine Lösung, wenn ich eine Funktion mit einer Variablen im Namen aufrufen könnte und diese Variable inkrementieren könnte. Dazu würde ich 1536 kleine Funktionen schreiben. Ich weiß, dauert länger... :slight_smile:

Hi

Denke, Du willst die RGB-Werte lieber berechnen, da bei 1536 Zwischenschritten a 3 Byte für R,G,B schon einiges an Speicher weg geht.
Der Farbanteil der Einzelfarben wird ja irgend einer Gesetzmäßigkeit unterliegen - wenn Du Die hast, bist Du fast schon fertig.

Dann per Schleife von 1-64 (oder 0-63) den LEDs die RGB-Werte des Index-Wert übergeben.
LED1 = Index, Index=(Index+24)%1536
LED2 = Index, Index=(Index+24)%1536
...

Danach die LEDs aktualisieren und zum nächsten Index (denke, fängt dann bei 2 an)

MfG

Hätte eine Lösung, wenn ich eine Funktion mit einer Variablen im Namen aufrufen könnte und diese Variable inkrementieren könnte. Dazu würde ich 1536 kleine Funktionen schreiben. Ich weiß, dauert länger... :slight_smile:

No!

Stopf deine LED Zustände in ein Array, und iteriere mit einem Automaten über das Array.

Dann brauchst du kleine 1500 Funktionen, sondern nur eine(oder vielleicht auch 2).

Ich habs jetzt mit einem Array hinbekommen.

Jetzt muß ich nur noch 3x 1536 Werte in das Array schreiben. Abe ich denke, da hilft mir Edit+ bei....

Danke für Eure Anregungen !

Rechne mal kurz durch, ob Du genügend Speicher dafür hast.

Gruß Tommy

Es kam wie es kommen mußte.....

Zu wenig Arbeitsspeicher. Hat jemand mal nen Gigabyte RAM für mich? :slight_smile:

Weiß jemand zufällig, welcher Arduino den größten Arbeitsspeicher hat?

64 RGB LED, am UNO, ist kein Problem!

Nee...
Du hast einen Bock im Konzept.

Ich könnte das Monster-Array auf ein I2C-EEPROM oder auf eine SD-Karte auslagern...

Klicke-die-Klack, hab mir eine EEPROM-Platine aus China für 1 Taler bestellt...

Vergiss das mit dem Array. Dein Ansatz ist vollkommen falsch

Ach..
Arrays ist schon ok...

Aber offensichtlich nicht so wie geplant!

Eben sachte ich noch:

Lass uns bitte zurückgehen, an die Stelle, bevor du falsch abgebogen bist.

Es funktioniert jetzt.

Hab die Arrays um Faktor 2 reduziert, indem ich nur jeden 2. Wert nehme.
Das menschliche Auge kann diese kleinen Farbunterschiede sowieso nicht wahrnehmen.

Ich verwende dazu den Arduino Mega 2560. Der hat genügend Speicher...

Beratungsresistenz ist auch eine Tugend.
Und warum einfach, wenns umständlich auch geht!

Hi

postmaster-ino:
Der Farbanteil der Einzelfarben wird ja irgend einer Gesetzmäßigkeit unterliegen - wenn Du Die hast, bist Du fast schon fertig.
MfG

Aber man kann auch einen ausgewachsenen PC nehmen, Der hat zumindest ausreichend Speicher oder gar eine HDD :wink:

MfG