Forum: Mikrocontroller und Digitale Elektronik Dynamisches Array


von Hans M. (Gast)


Lesenswert?

Hallo und einen guten Tag zusammen...

Ich habe ein Array und seine größe als globale Variable definiert !

also:

unsigned char NUM_BYTES;
unsigned char array[NUM_BYTES];

Der Compiler meckert natürlich, da es sich nicht um eine feste 
Arraygröße handelt ! Ich bräucht maximal 19 BYTES, also müsste ich 
irgendwie einen Speicherbereich festlegen ! Wie würde das gehen ? mit 
malloc ?

Vielen Dank für eure Hilfe

von Sven W. (woehlb)


Lesenswert?

Mach doch einfach folgendes:

#define NUM_BYTES 19
unsigned char array[NUM_BYTES];

So sind zwar die 19Bytes ständig belegt,aber solange du keine 
Platzprobleme im RAM hast.

Tschau Sven!

von Sven W. (woehlb)


Lesenswert?

Würde ein malloc() auf einem Mikrocontroller ohne Betriebssystem den 
überhaupt funktionieren?

Tschau Sven!

von Falk B. (falk)


Lesenswert?

@ Hans M. (Gast)

>Der Compiler meckert natürlich, da es sich nicht um eine feste
>Arraygröße handelt ! Ich bräucht maximal 19 BYTES, also müsste ich
>irgendwie einen Speicherbereich festlegen ! Wie würde das gehen ? mit
>malloc ?

Und was hindert ich, einfach zu schreiben
1
unsigned char array[19];


???

Malloc geht theoretisch, der Aufwand ist aber nicht gerechtfertigt.

@ Sven Woehlbier (woehlb)

>Würde ein malloc() auf einem Mikrocontroller ohne Betriebssystem den
>überhaupt funktionieren?

Ja, ist auf den meisten vorhanden. Ist aber selten sinnvoll.

MFg
Falk

von Gast (Gast)


Lesenswert?

Für einen Speichermanager gehen mehr als 19Byte drauf, ´malloc wird sich 
also wahrscheinlich nicht lohnen.

von Karl H. (kbuchegg)


Lesenswert?

Falk Brunner wrote:

>>Würde ein malloc() auf einem Mikrocontroller ohne Betriebssystem den
>>überhaupt funktionieren?
>
> Ja, ist auf den meisten vorhanden. Ist aber selten sinnvoll.
>

Vor allem dürfte alleine die für malloc notwendige Verwaltungs-
information wahrscheinlich mehr Platz im SRAM beanspruchen
als die von Zeit zu Zeit nicht benutzten 8 oder 10 Bytes des
fix dimensionierten Arrays.

von Hans M. (Gast)


Lesenswert?

Hallo und danke für eure Antworten: Ich greife mal das von SVEN auf :

Mach doch einfach folgendes:

#define NUM_BYTES 19
unsigned char array[NUM_BYTES];

So sind zwar die 19Bytes ständig belegt,aber solange du keine
Platzprobleme im RAM hast.

Tschau Sven!
_____________

Kann ich dann nachträglich die Variable NUM_BYTES noch ändern ? Also 
irgendwo im Hauptprogramm ?

z.B

....
NUM_BYTES = 14;
....

???

Danke

von Johannes M. (johnny-m)


Lesenswert?

Hans M. wrote:
> Kann ich dann nachträglich die Variable NUM_BYTES noch ändern ? Also
> irgendwo im Hauptprogramm ?
NUM_BYTES ist keine Variable, sondern ein Präprozessor-Makro!

==> Empfehlung: C-Buch lesen...

BTW:
Kann C99 nicht sogar Arrays mit variabler Länge ohne malloc? (OK, dass 
das dann alles im Hintergrund läuft und dementsprechend nicht weniger 
Ressourcen braucht als mit malloc ist klar...)

von Matthias Kölling (Gast)


Lesenswert?

Mal eine bescheidene Frage - welchen Sinn sollte es machen, ein Array 
zur Laufzeit zu vertkleinern? Was willst Du mit den restlichen 5 Bytes? 
Selbst wenn der Speicher knapp ist, müßtest Du Dein Programm so 
organisieren, dass Du dann wonders mehr Speicher nutzt, wenn gerade die 
kleine Array-Größe gebraucht wird. Das macht in meinen Augen nur auf 
einem PC Sinn, wo mehrere Applikationen sich den Speicher teilen müssen 
und temporär große Datenmengen verarbeitet werden müssen.
Bei lokalen Variablen sollte es aber dennoch funktionieren, da bei denen 
die Größe zur Compilezeit nicht bekannt sein muß, da sie eh auf dem 
Stack oder in Registern abgelegt werden.

Gruß Matthias

von Rolf Magnus (Gast)


Lesenswert?

> BTW:
> Kann C99 nicht sogar Arrays mit variabler Länge ohne malloc?

Nein. Es kann allerdings lokale Arrays mit zwar fester, aber zur 
Laufzeit bestimmter Größe. Overhead sollte das kaum haben. Für globale 
Arrays funktioniert das logischerweise nicht, denn die existieren ja 
schon beim Start von main(), und zu diesem Zeitpunkt hätte man ja zur 
Laufzeit noch gar keine Größe vorgeben können.

von Johannes M. (johnny-m)


Lesenswert?

Rolf Magnus wrote:
>> BTW:
>> Kann C99 nicht sogar Arrays mit variabler Länge ohne malloc?
>
> Nein. Es kann allerdings lokale Arrays mit zwar fester, aber zur
> Laufzeit bestimmter Größe. Overhead sollte das kaum haben. Für globale
> Arrays funktioniert das logischerweise nicht, denn die existieren ja
> schon beim Start von main(), und zu diesem Zeitpunkt hätte man ja zur
> Laufzeit noch gar keine Größe vorgeben können.
Klar, bei globalen Arrays macht es keinen Sinn...

von David (Gast)


Lesenswert?

ein array ist grundsätzlich kein dymamischer datentyp. Bei 19 Elementen 
kanst du manipulieren was du wilst, du wirst dein ziel, reccourcen zu 
sparen sicher nicht erreichen, das gegenteil jeodch ziemlich sicher...

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.