Array Größe definieren

Hallo Community!

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?

In der Erzeugung einer Instanz soll diese Größe dann festgelegt werden, wie mach ich das?

Mit Klassen Templates!

Alternativ:
Das Array, bzw. einen Zeiger darauf und eine Größenangabe, dem Konstruktor übergeben.

Erstmal danke für die schnellen Antworten!

Wonach richtet sich denn Deine Dimensionierung?

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.

Mit Klassen Templates!

Alternativ:
Das Array, bzw. einen Zeiger darauf und eine Größenangabe, dem Konstruktor übergeben.

Ich weis leider von beidem nicht was es ist und wie es funktioniert :confused: Könntest du vielleicht ein paar Codebeispiele schicken?

J77J

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() 
{
}

Vorteile:

  1. Nix dynamische Speicherverwaltung
  2. Die IDE zeigt den korrekten Speicherbedarf

Wonach richtet sich denn Deine Dimensionierung?

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.

Grüße Uwe

uwefed:
und spart auch noch viel Platz im Flash.

Hmm ...
Wo ist die Flash verplemperung ?

Wo ist die Flash verplemperung ?

Stapel<int,1> und Stapel<int,2> sind zwei Klassen.
Könnte gut sein, dass da einiges doppelt implementiert wird.

Uwes Vorschlag verplempert allerdings sogar RAM, was meist schlimmer ist :wink:

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.

Werden die Funktionen New oder malloc nicht nicht eingebunden wenn sie nicht verwendet werden?

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 wir wie ich hier verstanden habe über ein Array mit max 10 Elementen reden dann sind 9 bis 36 byte (je nach verwendeten Datentyp) verplempert.

@combie
Wieviel Ram und Flash zusätzlich verbraucht Dein Template Beispiel im vergleich zu einem 10 Element-Array wo nur 1 Element verwendet wird?

Grüße Uwe

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.