Forum: Compiler & IDEs Array mit variabler Größe


von johannes (Gast)


Lesenswert?

Hallo,

ich bin im C programmieren nicht so fit, deshalb habe ich nun mal eine 
Frage.
Ich bin gerade darüber einen Atmel Dataflash mit einem AVR anzusprechen.
Dazu habe ich eine Funktion dataflash_read(), der ich als Parameter die 
Adresse der zu lesenden Bytes übergebe, und die Anzahl die gelesen 
werden sollen.
Also so:
1
void dataflash_read(int8_t address1, int8_t address2, int8_t address3, uint8_t bytes)
2
{
3
}

In der Funktion brauche ich ja nun ein Array von der Größe "bytes".
Kann ich das einfach mit
1
int8_t data[bytes]
initalisieren?

Oder müsste ich das mit malloc() machen? Geht das auf einem AVR 
überhaupt?

Ich hoffe ich versteht mein Problem und könnt mir einen Tipp geben ;)

von Mark .. (mork)


Lesenswert?

Solange das Array lokal ist, kannst Du es mit int8_t data[bytes]; 
anlegen. Initialisiert wird hierbei jedoch garnichts, bei Bedarf muss 
der Inhalt manuell mit einer Schleife gesetzt werden.

MfG Mark

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

johannes schrieb:

> In der Funktion brauche ich ja nun ein Array von der Größe "bytes".
> Kann ich das einfach mit
>
1
int8_t data[bytes]
> initalisieren?

Einige C-Dialekte erlauben das. Beachte aber, daß der Gültigkeitsbereich 
von data der einer lokalen Variablen ist und der Speicher vom Stack 
genommen wird, nicht vom Heap. Du kannst so einen Zeiger also nicht aus 
der Funktion zurückliefern (und wenn doch, ist der Inhalt des Speichers 
undefiniert bzw, beim Schreiben in das Array von ausserhalb des 
Gültigkeitsbereichs ist Absturz vorprogrammiert.)

von Mano W. (Firma: ---) (manow)


Lesenswert?

Sollte eigentlich funktionieren... Siehe auch GCC Manual: 6.18 Arrays of 
Variable Length

http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Variable-Length.html#Variable-Length

von johannes (Gast)


Lesenswert?

Hallo,

danke, das hat mir schonmal weitergeholfen ;)
Nur ich möchte gerne einen Zeiger auf das Array zurückliefern, oder das 
ganze Array..
Wie mache ich das dann am besten? Weil global kann ich das Array ja 
nicht anlegen, da ich die Länge nicht weiß..
Wäre nett wenn ihr mir da nocheinmal helfen könntet :)

johannes

von Mark .. (mork)


Lesenswert?

johannes schrieb:
> Nur ich möchte gerne einen Zeiger auf das Array zurückliefern, oder das
> ganze Array..

Entweder malloc() benutzen (auf einem AVR eher unüblich), oder der 
Funktion ein Array bereitstellen, sodass diese ihn erst garnicht anlegen 
muss, also
1
void dataflash_read(int8_t address1, int8_t address2, int8_t address3, uint8* data, uint8_t bytes)

MfG Mark

von Klaus W. (mfgkw)


Lesenswert?

Entweder in der Funktion mit malloc() allokieren (was auf einem
MC eher ... ähm .. weniger gern gesehen wird, vorsichtig
ausgedrückt), oder der Aufrufer muß bereits genug vereinbaren und
übergibt den Speicher.

Ein Notnagel wäre, den Aufrufer einfach raten zu lassen und wenn
er zuwenig übergibt, meldet die Funktion einen Fehler (bzw. sagt,
wieviel nötig wäre) und der Aufrufer muß es nochmal probieren.

Besser geht es in C nicht.
Auf einem PC würde man einfach in der Funktion allokieren, und
der Aufrufer müsste sich irgendwann um die Freigabe kümmern, was
auch oft schief geht wenn der Programmierer doof ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Einige C-Dialekte erlauben das.

Es ist im C99-Standard festgeschrieben.

von johannes (Gast)


Lesenswert?

Hallo,

ich werde es nun so machen wie Mark es vorgeschlagen hat.
> Entweder malloc() benutzen (auf einem AVR eher unüblich), oder der
> Funktion ein Array bereitstellen, sodass diese ihn erst garnicht anlegen
> muss, also
> void dataflash_read(int8_t address1, int8_t address2, int8_t address3, uint8* 
data, uint8_t bytes)

So ist es, denke ich, am einfachsten, weil wenn ich die Funktion aufrufe 
weiß ich ja schon wie groß das Array ist, kann es "anlegen" und an die 
Funktion übergeben.
Danke für den Tipp ;)


johannes

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.