Forum: Mikrocontroller und Digitale Elektronik Array unbekannter Länge


von Tobi88 (Gast)


Lesenswert?

Nabend zusammen.
Ich möchte ein Array erstellen deren Länger ich erst zur Laufzeit weiss. 
meine Frage komm ich da um die malloc Funktion herrum?

von Timmo H. (masterfx)


Lesenswert?

Du kannst das Array auch vorher mit der maximal vorkommenden Größe 
deklarieren. Ist zwar speicherverschwendung aber wenn du genug hast... 
Ansonsten halt malloc. Was stört dich daran?

von Peter II (Gast)


Lesenswert?

dann mach es einfach funktionslokal.

von user (Gast)


Lesenswert?

Du kannst es natürlich auch auf den Stack legen

von Tobias W. (wagnertobse)


Lesenswert?

Oder mit new:

int i = 20;
int *array = new int(i);

von T. roll (Gast)


Lesenswert?

Solche Dinge sollte ma alles seinlassen. Ein Controller is kein PC der 
fallsndas Duzend Giga wweg waere, nochmals beliebig viel Gigas von der 
Platte holen kann. Auf controllern sollte man dynamisches Memory 
generell vermeiden.

von Karl H. (kbuchegg)


Lesenswert?

Tobi88 schrieb:
> Nabend zusammen.
> Ich möchte ein Array erstellen deren Länger ich erst zur Laufzeit weiss.
> meine Frage komm ich da um die malloc Funktion herrum?

Natürlich.
Wenn es nur ein Array ist, dann allokiere es
* mit der maximal vorkommenden Länge
* mit der Länge, die du dir auf dem µC gerade noch leisten kannst

(je nachdem was zutrifft).

Mehr als diesen Speicher hast du sowieso nicht. Und mehr kann die malloc 
auch nicht besorgen.

von Peter S. (petershaw)


Lesenswert?

Warum an der Stelle keine linked-list nutzen?

von Harry L. (mysth)


Lesenswert?

T. roll schrieb:
> Solche Dinge sollte ma alles seinlassen. Ein Controller is kein PC der
> fallsndas Duzend Giga wweg waere, nochmals beliebig viel Gigas von der
> Platte holen kann. Auf controllern sollte man dynamisches Memory
> generell vermeiden.

Und warum?
Speicher ist immer begrenzt, egal ob man X Gigabyte oder 256 Byte hat.
Man muß in jedem Fall wissen (und verstehen) was man tut!
Es kann auch bei knappen Speicher durchaus gute Gründe geben Speicher 
dynamisch zu verwenden.

Harry

von Tobi88 (Gast)


Lesenswert?

Tobias Wagner schrieb:
> Oder mit new:
>
> int i = 20;
> int *array = new int(i);

das geht? dachte das wäre nur in java möglich

von Tobi88 (Gast)


Lesenswert?

ich brauche dies für ein Protokoll in dem ich keine Rohdaten mit einer 
festen Länge vorgeben. Ein Ausschnitt aus dem Protokoll soll ungefähr so 
aussehen:

|Anfang|LaengeRohdaten|Rohdaten|Ende|
-------------------------------------
 1Byte    1Byte       x-Byte   1Byte

Ich möchte aber nich ein Array mit 255 Byte anlegen wenn die rohdaten 
nur 10 byte haben.
ich möchte das Array mit Hilfe von "LaengeRohdaten" anlegen sodass das 
Array auch nur soo groß ist wie ich e für die Rohdaten brauche.


p.S dieser Auschschnitt spiegelt nicht das ganze Protokoll wieder 
sondern nur den relevanten Ausschnitt

von Karl H. (kbuchegg)


Lesenswert?

Tobi88 schrieb:

> Ich möchte aber nich ein Array mit 255 Byte anlegen wenn die rohdaten
> nur 10 byte haben.

Nochmal.
Hast du noch etwas in deinem Programm, welches du dynamisch verwalten 
musst?

Wein nein, dann lege es statisch an.
Du hast in deinem µC nicht mehr Bytes zur Verfügung als er hat. Ob 
dieser Speicher jetzt brach liegt, oder ob du diesen Speicher in ein 
fixes Array steckst, welches immer existiert, ist Jacke wie Hose. Du 
sparst dir aber selbst und deinem µC eine Menge Ärger, wenn du das tust.
Denn was tust du denn, wenn du von malloc den Speicher nicht bekommst?

Und nur so als Hinweis: du wirst von malloc WENIGER Speicher zugeteilt 
bekommen, als du durch statische Allokierung erreichen kannst. Denn die 
dynamisch allokierten Speicherblöcke verwalten sich ja auch nicht von 
alleine.

Ganz abgesehen davon, dass die Verwaltung einfacher ist.

> Ich möchte aber nich ein Array mit 255 Byte anlegen
> wenn die rohdaten nur 10 byte haben.

Aber 255 können vorkommen?
Wenn ja, dann musst du auch damit rechnen, dass dem so ist und ein 
entsprechendes Array bereitstellen.
Da ist es einfacher, IMMER ein Array der Länge 255 zu haben, von dem 
dann halt nur 10 Bytes benutzt werden.
Dann hast du wenigstens Zahlen mit denen du rechnen und operieren kannst 
anstatt irgendwelcher Speicheranforderungen, die gut gehen können oder 
auch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Der springende Punkt ist das Worst-Case-Szenario.
Damit muss dein Programm klar kommen. Alles andere ist dann nur noch 
Vereinfachung dieses Worst-Case Szenarios. Und wenn dann eben 
Speicherbereiche nicht benutzt werden, dann werden sie halt nicht 
benutzt. Aber ob die jetzt nicht allokiert sind, oder ob sie 
programmtechnisch gesehen zum Array gehören - ist Jacke wie Hose.

Interessanter wird es, wenn derselbe Speicher zu verschiedenen Zeiten zu 
unterschiedlichen Zwecken benötigt wird. Aber selbst dann kann man das 
mit einer union wunderbar handhaben. Genau das ist die ursprüngliche 
Idee hinter einer union.

von Masl (Gast)


Lesenswert?

Im gcc-Forum gab es letzte Woche das Selbe Thema.

Heraus kam, das nichts für dynamische Allokierung spricht, aber vieles 
für statische.

von petar (Gast)


Lesenswert?

Tobi88 schrieb:
> Tobias Wagner schrieb:
>> Oder mit new:
>> int i = 20;
>> int *array = new int(i);
> das geht? dachte das wäre nur in java möglich
In C++ gibt es new, in C allerdings nicht.

Bsp:
http://www.willemer.de/informatik/cpp/dynamic.htm

von Purzel H. (hacky)


Lesenswert?

Wieviele der Rohdaten koennen denn kommen ? Ein Stueck, oder mehr?
Falls nur ein Stueck, dann alloziere die 255 bytes fest. Dh statisch.

von Patrick B. (p51d)


Lesenswert?

Dynamsiche Speicherverwaltung ist nur bei grossen Controllern sinnvoll 
(z.B. ARM), da es doch einiges an Aufwand bedeutet, diesen zu erstellen, 
dann zu Prüfen ob du ihn bekommen hast und was machen falls nicht.
Hinzu kommt noch die Heap-Fragmentierung, wenn du an mehreren Stellen 
dynamisch arbeitest...
Ich vermeide wenn möglich selbst bei den ARM-Controllern und C++ 
dynamische Arrays, obwohl es oft Situationen gibt, bei denen es durchaus 
Sinn machen würde. Aber hier hast du keinen PC der mit RAM nur so 
Überquilt... (was ist heute Standart? >8GB...)

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

der einzige Grund für dynamische Speicherverwaltung wäre, dass ein 
Speicher, der für Aufgabe A gebraucht wird, zu einem andern Zeitpunkt 
für Aufgabe B genutzt werden kann - aber nur dann, wenn völlig 
ausgeschlossen ist, dass beide Aufgaben gleichzeitig zu bearbeiten sind. 
In allen anderen Fällen interessiert nur die maximale Grösse, entweder 
steht die zur Verfügung oder eben nicht, dann handelt es sich um eine 
Fehlkonstruktion und das wird sich auch irgendwann bemerkbar machen.

Gruss Reinhard

von Tobi88 (Gast)


Lesenswert?

Also derzeit brauche wirklich nur ca 10 Byte Rohdaten. Da ich aber nich 
weiss welche Funktionen  hinzukommen und ich gerne das ding abwaerts 
kompatibel gestalten wuerde. Waere es schoen das empfangyarray zur 
laufzeit erstellen zu lassen.

von Karl H. (kbuchegg)


Lesenswert?

Tobi88 schrieb:
> Also derzeit brauche wirklich nur ca 10 Byte Rohdaten. Da ich aber nich
> weiss welche Funktionen  hinzukommen und ich gerne das ding abwaerts
> kompatibel gestalten wuerde. Waere es schoen das empfangyarray zur
> laufzeit erstellen zu lassen.

Du hast es immer noch nicht.
Das ist alles nicht die entscheidende Frage.
Die entscheidende Frage lautet: Welche Datengröße kann maximal 
vorkommen?

Du MUSST dich bei kleinem begrenztem Speicher auf irgendeine 
Maximalgröße festlegen. Ob du willst oder nicht.
Denn bei irgendeiner Größe ist der vorhandene Speicher nun mal zu Ende. 
Was du ganz sicher nicht haben willst, ist ein Programm von dem niemand 
sagen kann, wo seine Grenzen liegen. Entweder das Programm kann maximal 
Datensätze von 256 Bytes bearbeiten oder es kann das nicht. Entweder das 
Maximum liegt bei 128 oder es tut es das nicht (weil kleiner). Aber 
irgendeine garantierte Größe brauchst du. Niemand hat etwas davon, wenn 
du heute Datensätze mit einer Länge von 128 Bytes noch bearbeiten kannst 
und wenn der Benutzer dann (ich erfinde jetzt mal was) 5 Adressen 
eingegeben hat, dann sinkt diese Grenze auf 100 Bytes. Davon hat keiner 
was. Bei einem µC geht es in der Regel um GARANTIERTE Werte. Bei einem 
PC ist das anders. Der hat ein virtuelles Memory Management. Wenn deine 
Daten den physikalisch verfügbaren Speicher sprengen, dann geht die 
Verarbeitung etwas langsamer (weil die Festplatte zum Speichern mit dazu 
genommen wird), aber das Programm läuft nach wie vor weiter. Bei einem 
µC in der AVR-Klasse hast du diesen Luxus aber nicht. Entweder das 
Programm kommt mit der Datenmenge klar, oder es schmiert ab. Und genau 
deswegen WILL man garantierte Größen haben.

Ob das Hinzufügen von Funktionen an deinem Speicherverbrauch noch etwas 
verändert, hängt nicht zuletzt auch vom µC ab (über den du noch nichts 
gesagt hast). Bei einem AVR kannst du Programmcode hinzufügen, wegen der 
Harvard-Architektur, das ändert deswegen am Speicherverbrauch im SRAM 
nicht viel.

Werden die verfügbaren SRAM-Größen größer als 2 oder 4 KByte (um mal 
eine Größenordnung zu nennen), dann entspannt sich die Situation 
zusehends. Aber mit wenig SRAM muss man ein wenig konservativer an die 
Sache rangehen. Da gilt dann nur noch: Was hab ich verfügbar und wieviel 
brauche ich im schlimmsten Fall.

von Ralph (Gast)


Lesenswert?

Masl schrieb:
> Heraus kam, das nichts für dynamische Allokierung spricht, aber vieles
> für statische.

Da kann man nur Zustimmen.



Und noch dazu die Fehlersuche die bei dynamischer verwaltetem Ram nötig 
wird, willst du nicht wirklich machen.

Du weißt dann nie an welcher Stelle du mit dem Debugger einen Wert 
nachlesen kannst. Was steht gerade Wo. Warum steht im Stack plötzlich 
eine 0x0000 wo eigentlich die Rücksprungaddresse der letzten Funktion 
stehen müsste,......



Das sieht dann anders aus wenn man mal auf Controllern unterwegs ist, 
die eine MMU und einem passendes Betriebssystem haben.

Hier wären wir dann aber bei größeren ARM oder X86 Prozessoren.

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.