Ich arbeite gerade daran mein 2 8x8 RGB LED Matrixen mit 5 74hc595 Schieberegistern gesteuert zu bekommen (mit Multiplexing). Hierzu habe ich eine allgemeine Klasse programmiert, bei der man Größe und ein paar weitere Details zur Matrix eingibt und sie dann mit einfachen Befehlen ansteuern kann.
Nun zu meiner Frage:
Ich habe im header der Klasse ein Array initialisiert, ohne Größenzuweisung.
byte BytesToSend[];
In der Erzeugung einer Instanz soll diese Größe dann festgelegt werden, wie mach ich das?
Ich habe bereits folgendes ausprobiert:
BytesToSend[groesse];
Hat jedoch nicht funktioniert
Ich hoffe jemand kann mir helfen,
J77J
P.S.: Tut mir leid falls ich beim Aufbau meines Beitrags was falsch gemacht habe, ist mein erster Beitrag.
Ein dynamisches Array kann mit New oder malloc dimensioniert werden. Die Variable ist dann nur ein Pointer auf die eigentlichen Daten, Du könntest auch schreiben
byte *BytesToSend;
Dynamischer Speicher scheint aber einige Probleme mit der Implementierung zu haben, sollte nach Möglichkeit vermieden werden. Wonach richtet sich denn Deine Dimensionierung?
Ein Template Beispiel mit Arrays habe ich in meiner Wühlkiste.
Es wird in der Klasse ein Array angelegt.
Sowohl Type der Arrayelemente , als auch Anzahl, wird bei der Instanziierung angegeben.
Dieses Beispieltemplate implementiert eine rudimentäre Stapel (LiFo) Funktionalität.
Irgendwelche Schutz- oder Bereichsüberschreitungssicherungen sind nicht eingebaut.
template < typename T, int N >
class Stapel
{
private:
T elemente[N];
int StapelZeiger;
public:
Stapel()
{
StapelZeiger = 0;
}
void push(T element)
{
elemente[StapelZeiger++]=element;
}
T pop()
{
return elemente[--StapelZeiger];
}
int count()
{
return StapelZeiger;
}
};
Stapel<byte,20> bytestapel; // Platz für 20 Byte Elemente
Stapel<unsigned long,5> ulstapel; // Platz für 5 unsigned long Elemente
void setup()
{
Serial.begin(9600);
Serial.println("Bytestapel");
bytestapel.push(1);
bytestapel.push(200);
bytestapel.push(300); // wertebereichsüberschreitung, sagt 44 (300-256)
Serial.println(bytestapel.pop());
Serial.println(bytestapel.pop());
Serial.println(bytestapel.pop());
Serial.println();
Serial.println("ULstapel");
ulstapel.push(1);
ulstapel.push(5467354);
Serial.println(ulstapel.pop());
Serial.println(ulstapel.pop());
}
void loop()
{
}
Ich hoffe ich versteh die Frage richtig. Die Größe hängt von 3 Inputs ab, im Endeffekt ist die Große im Bereich 1 - 10, jedenfalls normalerweise.
Wenn Du ein so kleines Arrays brauchst dann definiere es mit der max Größe und benutze nur einen Teil. Das ist dann am einfachsten und spart auch noch viel Platz im Flasch.
Könnte gut sein, dass da einiges doppelt implementiert wird.
Erstaunlicher weise nicht!
Wenn das ein und der selbe Datentype ist, werden die Methoden im Flash nicht doppelt angelegt.
Ob das unter allen Umständen so ist, kann ich nicht sagen.
Wenn sich die Datentypen unterscheiden, dann natürlich.
Aber da gibts sowieso keine Alternative, das wäre bei normalen Funktionen auch so. Müsste man dann halt nur von Hand erledigen.
Templates sind lediglich Code Generatoren. Wenn man nur eine Klasse damit erzeugt ist der Code der da raus kommt absolut identisch wie wenn man das Array in der Klasse fest vorgibt. Wenn man allerdings mehrere verschiedene Klassen erzeugt, wird auch mehr Code generiert. Das ist natürlich der Fall wenn es man mit verschiedenen Datentypen macht, aber hier auch wohl wenn man zwei Objekte mit verschiedenen Größen erzeugt. Dann generiert man wahrscheinlich zwei Klassen. Das ließe sich hier mit malloc()/new verhindern, aber es hört sich auch nicht danach an das man das bräuchte. Wenn er die Größe des Arrays aber erst zur Laufzeit angeben will (statt die Größe irgendwo im Code zu definieren), geht das nur mit dynamischen Speicher.