Forum: Mikrocontroller und Digitale Elektronik Arduino / C++ Array "verländern" / Vector


von Yannik (Gast)


Lesenswert?

Hi,

ich habe ein kleines Arduino Problem..

Und zwar schreibe ich grade eine Library für LED Strips..

Die Klasse soll ein Array "modes[]" beinhalten,so dass jedem Modus eine 
Nummer (eines Effktes) zugeordnet werden kann..

Wie viele Modi es geben soll, soll natürlich für den User frei wählbar 
sein.
Ich kann also (auch aus Speichergründen) kein beliebig großes Array, 
definieren, was der User dann füllen kann..

Ich bräuchte also etwas, was wie ein Array arbeitet, ich aber nach 
belieben das Array verlängern kann. Soweit ich weiß ist das mit normalen 
Arrays nicht möglich?!

In C++ gibt es wohl die Klasse Vector, die genau das kann, wie es mir 
scheint, aber in Arduino gibt es diese Vektoren nicht...
Siehe hier : http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Vector

Gibt es eine möglichkeit soetwas in Arduino umzusetzten?

von Noch einer (Gast)


Lesenswert?

Früher hatten wir dafür malloc() benutzt. Z.B.

int *nodes;
nodes = (int[]) malloc(anzahl*sizeof(int));

Klassen wie std::vector machen intern im Prinzip das selbe.

von tmomas (Gast)


Lesenswert?

Die Verlandung von Arrays scheint bisher kein allzugroßes Problem zu 
sein, sonst stünde davon sicher was in diesem Artikel: 
http://de.wikipedia.org/wiki/Verlandung

scnr

von Cyblord -. (cyblord)


Lesenswert?

Yannik schrieb:

> Wie viele Modi es geben soll, soll natürlich für den User frei wählbar
> sein.
> Ich kann also (auch aus Speichergründen) kein beliebig großes Array,
> definieren, was der User dann füllen kann..

Das stimmt nur, wenn du den gesparten Speicherplatz für weniger Modi, 
anderweitig nutzen willst. Also wenn du ein Konzept wie: Entweder viele 
Modi, aber dafür wenig Daten pro Modus, oder aber wenig Modi und dafür 
viele Daten pro Modus anbieten willst.

Ansonsten definiertst du ein Array so groß wie eben die maximal mögliche 
Anzahl an Modi und der Rest bleibt ungenutzt.

> Gibt es eine möglichkeit soetwas in Arduino umzusetzten?
Ja, genau wie Vector und List Klassen das machen.

Du definierst ein Array fester größe und hälst die Anzahl der Elemente 
darin ebenfalls fest. Reicht die Array-Größe nicht mehr, wird ein neues 
Array mit mehr Speicher alloziiert, alle Daten vom alten ins neue Array 
kopiert und die Zeiger wieder korrekt eingestellt. Beim schrumpfen 
ebenso möglich.

Aber auf nem kleinen Controller eher schlecht, weil wenig Speicher.
Also erst mal prüfen ob es keine Möglichkeit gibt, das ganze statisch zu 
machen.

: Bearbeitet durch User
von Yannik (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Also erst mal prüfen ob es keine Möglichkeit gibt, das ganze statisch zu
> machen.

Hmm, so weit war ich auch schon..

Also Byte reicht völlig aus, dann wird es denke ich in der Praxis nicht 
mehr als 20 Modi geben. Es wird aber zusätzlich noch bis zu 15 Instanzen 
dieser Klasse geben.. Das sind mal eben 300Byte, die den Ram 
vollmachen.. Die werden ein mal am Anfang des Codes festgelegt und dann 
sind se nur noch zum nachgucken ;)

Obwohl ihr natürlich an einer Stelle Recht habt.. Im Worst Case, also 20 
Modi bei 15 Elementen, muss das ganze vom Speicherplatz her ja auch 
funktionieren.. Dem entsprechend kann man auch gleich immer das 
komplette Array nutzen..

Naja, ich werde es wohl erstmal mit festen Grenzen probieren..
Trotzdem danke!

von Cyblord -. (cyblord)


Lesenswert?

Yannik schrieb:

> Obwohl ihr natürlich an einer Stelle Recht habt.. Im Worst Case, also 20
> Modi bei 15 Elementen, muss das ganze vom Speicherplatz her ja auch
> funktionieren.. Dem entsprechend kann man auch gleich immer das
> komplette Array nutzen..

Eben. Und dann ist der ganze dynamische Ansatz völlig für die Katz.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.