www.mikrocontroller.net

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


Autor: johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void dataflash_read(int8_t address1, int8_t address2, int8_t address3, uint8_t bytes)
{
}

In der Funktion brauche ich ja nun ein Array von der Größe "bytes".
Kann ich das einfach mit
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 ;)

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
johannes schrieb:

> In der Funktion brauche ich ja nun ein Array von der Größe "bytes".
> Kann ich das einfach mit
>
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.)

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte eigentlich funktionieren... Siehe auch GCC Manual: 6.18 Arrays of 
Variable Length

http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Variab...

Autor: johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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
void dataflash_read(int8_t address1, int8_t address2, int8_t address3, uint8* data, uint8_t bytes)

MfG Mark

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Einige C-Dialekte erlauben das.

Es ist im C99-Standard festgeschrieben.

Autor: johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.