Unterschiedliches Verhalten des Code zwischen nicht/dynamisch erstellten Arrays

Hi,

ich habe in meinen Tisch zwei Infinitiy-Mirrows eingebaut und die beiden LED-Strips werden mit einen Arduino angesteuert. die Led-Bänder im Infinity-Mirrow sind zwei Ellipsen. Ich möchte nun einen Lichtpunkt mit Schwanz also eine Art Schlange von links nach rechts wandern lassen. Ich habe auch was programmiert was super funktioniert.
Nun wollte ich ein Upgrade durchführen, sodass ich nun einen Farbverlauf in die Schlange machen kann. Ich will also eine Farbe1 und ne Farbe2 wählen und der Arduino soll mir eine Tabelle ausspucken, die die rgb-Werte der einzelnen Punkte in der Schlange halten. Diese Funktion, die mir drei Arrays ausspuckt (für jede Grundfarbe rot, grün, blau) funktioniert nur das eigentliche Programm verhält sich dann komisch.
Beim Code (angehängt) ist nun die neue Funktion die Probleme macht auskommentiert und so funktioniert der Code auch. wenn ich nun aber ColorTable in setup auskommentiere werden zwar die Arrays passend erstellt (sind im obigen code per Hand ausgefüllt) jedoch verhält sich die Schlange komisch. wenn nun die Schlange startet bewegt sie sich ganz normal wie sie sollte im ersten Strip nach rechts zum zweiten Strip. Aber sobald die erste LED im zweiten Strip angesteuert werden soll ist auf einmal ein Art delay von 1000ms drinnen und keine LED im 2.Strip geht an. Nach einer Ewigkeit (wegen den unerklärlichen delay) kommt die Schlange dann wieder in Strip 1, läuft nach links "prallt" ab und geht wieder nach rechts und wieder dasselbe Problem. Ich verstehe beim besten Willen nicht wieso es sich so verhält auch im Seriellen Monitor ist nichts Ungewöhnliches zu sehen.
Hat jemand eine Idee was da los seinen kann? Weil die Funktion, die den Fehler verursacht erstellt nur Arrays und die Funktion die Anzeigt (ShowDot) geht mit diesen Arrays genau gleich um, unabhängig ob die Schlange gerade auf den ersten oder zweiten Strip ist. Aber wieso geht dann alles auf Strip1 aber nicht auf Strip2?

MFG

dot_1.1.ino (9.31 KB)

Ich sehe noch nicht mal, wo Arrays dynamisch erzeugt werden.

LEDid = 44 - (posLED-27);

da würden mich mal die Serial Ausgaben interessieren, die du dir da so generierst...

ja die Arrays werden befüllt, sorry.
Im Anhang eine Textdatei mit den Ausgaben im Serielen Monitor (von einen Hin und Her).
Sind die Ausgaben mit ColorTable auskommentiert (sollte ja keinen Unterschied machen)

Serieller Monitor-output.txt (19 KB)

Ich habe den Fehler gefunden.
Das Array Helligkeit habe ich erstellt ohne anzugeben, wie viele Elemente es halten kann und irgendwie hat das das Problem verursacht. Mir ist immer noch schleierhaft, wieso dann überhaupt die Arrays rot, gruen und blau fehlerfrei erstellt werden konnten und wieso dann das rechte Band nicht funktioniert während das linke fehlerfrei alles angezeigt hat.
Vielleicht hat ja einer ne Idee, Danke aber für eure Hilfe und Bemühungen.

Mir ist immer noch schleierhaft,

Lerne die Äquivalenz von Zeiger und Arrays in C++!
Sonst wirst du immer wieder in solche selbst aufgestellten Fallen tappen.
Nur Wissen und Erfahrung kann dich schützen.

Merke:
Wenn ein Programmteil die Daten von einem anderen Programmteil überschreibt, dann wird ein Programmteil korrekt funktionieren (zumindest siehts von weitem so aus) und der andere Teil wird versagen.
In der nächsten Sekunde kann es dann genau andersrum aussehen, ohne dass du was angefasst hat.

Vielleicht hat ja einer ne Idee,

Irrelevant!
Machs einfach richtig.
Nicht anfangen Fehler zu begründen.

Nachtrag:

Hier mal eine schnelle Analyse:

#include <Streaming.h>
#include <CombieTypeMangling.h>

using namespace Combie::TypeTraits;


template<typename T> void zeigMir()
{
  Serial << "Es ist ein Array:         " << is_array<T>()          << endl;
  Serial << "Es ist ein Pointer:       " << is_pointer<T>()        << endl;
  Serial << "Es ist signed:            " << is_signed<T>()         << endl;
  Serial << "Es ist unsigned:          " << is_unsigned<T>()       << endl;
  Serial << "Es ist integral:          " << is_integral<T>()       << endl;
  Serial << "Es ist arithmetic:        " << is_arithmetic<T>()     << endl;
  Serial << "Es ist void:              " << is_void<T>()           << endl;
  Serial << "Es ist nullptr:           " << is_nullptr<T>()        << endl;
  Serial << "Es ist float:             " << is_floating_point<T>() << endl;
  Serial << "Es ist const :            " << is_const<T>()          << endl;
  Serial << "Es ist volatile:          " << is_volatile<T>()       << endl;
  Serial << "Groesse im Speicher:      " << sizeof(T)   << " Byte" << endl;
}




void setup() 
{
  Serial.begin(9600);
  Serial << endl << endl;
  
  float  helligkeitA[] ={};
  float  helligkeitB[3]={1.2,3.5,5.7};
  float *helligkeitC ={};


  
  Serial << "helligkeitA" << endl;
  zeigMir<decltype(helligkeitA)>();
  Serial << endl;


  
  Serial << "helligkeitB" << endl;
  zeigMir<decltype(helligkeitB)>();  
  Serial << endl;
  

  
  Serial << "helligkeitC" << endl;
  zeigMir<decltype(helligkeitC)>();  
  Serial << endl;
  
}

void loop() 
{

}

Die Ausgabe:

helligkeitA
Es ist ein Array:         0
Es ist ein Pointer:       0
Es ist signed:            0
Es ist unsigned:          0
Es ist integral:          0
Es ist arithmetic:        0
Es ist void:              0
Es ist nullptr:           0
Es ist float:             0
Es ist const :            0
Es ist volatile:          0
Groesse im Speicher:      0 Byte

helligkeitB
Es ist ein Array:         1
Es ist ein Pointer:       0
Es ist signed:            0
Es ist unsigned:          0
Es ist integral:          0
Es ist arithmetic:        0
Es ist void:              0
Es ist nullptr:           0
Es ist float:             0
Es ist const :            0
Es ist volatile:          0
Groesse im Speicher:      12 Byte

helligkeitC
Es ist ein Array:         0
Es ist ein Pointer:       1
Es ist signed:            0
Es ist unsigned:          0
Es ist integral:          0
Es ist arithmetic:        0
Es ist void:              0
Es ist nullptr:           0
Es ist float:             0
Es ist const :            0
Es ist volatile:          0
Groesse im Speicher:      2 Byte

Wie man sieht, hat helligkeitA einen komischen/kaputten/unvollständigen Datentype, für den noch nicht mal Speicher reserviert wird, oder werden kann.

helligkeitB ist wie zu erwarten ein Array mit der richtigen Größe

helligkeitC ein Zeiger auf float oder auf erste Element eines float Array.
Auch dieser Zeiger hat die richtige Größe

float helligkeitA[] ={};
helligkeitA ist ein "nicht Array", weil keine Elemente angegeben sind

float helligkeitA[];
Hier jammert der Kompiler:
error: storage size of 'helligkeitA' isn't known

CombieTypeMangling.zip (4.78 KB)