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