Forum: Mikrocontroller und Digitale Elektronik Konstantes Array


von Thomas (Gast)


Lesenswert?

Hallo, ich möchte gerne ein konstantes array erstellen und die array 
größe und den inhalt durch einzellne defines erstellen.

sollte so aussehen

#define liste 520
#define liste 542
#define liste 650
...

=> int array[3] = { 520, 542, 650 }

es muss jetzt kein define sein. Die liste sollte jedoch im Flashspeicher 
liegen und die werte sollten zur kompilierzeit eingefügt werden. Die 
reihenfolge ist egal. Ist so etwas möglich?

Gruß
Thomas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Je nach verwendetem Controller geht das so:
1
#define liste1 520
2
#define liste2 542
3
#define liste3 650
4
...
5
6
const int array[] = { liste1, liste2, liste3 };

oder so
1
#define liste1 520
2
#define liste2 542
3
#define liste3 650
4
...
5
6
const int array[] PROGMEM = { liste1, liste2, liste3 };

Beim Lesezugriff ist im ersten Falle (von-Neumann) gar nichts zu 
beachten, im zweiten Falle (AVR, Harvard) müssen die progmem-Funktionen 
verwendet werden, siehe 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

von Thomas (Gast)


Lesenswert?

Danke für die Antwort. Gibt es auch eine möglichkeit ohne die länge zu 
kennen. So dass man nicht wissen muss ob jetzt die nächste zahl liste1 
oder liste5 ist?

von holger (Gast)


Lesenswert?

>Gibt es auch eine möglichkeit ohne die länge zu
>kennen.

Ein Array unbekannter Länge kann der Compiler nicht anlegen.

von B. S. (bestucki)


Lesenswert?

Thomas schrieb:
> Die liste sollte jedoch im Flashspeicher liegen

Du musst im Handbuch des Compilers nachschauen, wie das genau deklariert 
wird. Evt. ist noch ein Zusatz nötig. Bei einigen wird bei "const" zwar 
eine Konstante angelegt, ist dann aber im RAM gespeichert.

von Thomas (Gast)


Lesenswert?

Das ist mir bewust ... aber er würde die länge ja kennen wenn er alle 
#defines liste* gefunden hat.

von raute (Gast)


Lesenswert?

Thomas schrieb:
> Das ist mir bewust ... aber er würde die länge ja kennen wenn er alle
> #defines liste* gefunden hat.
Siehst du in Rufus' Code irgendwo Längenangaben? Das einzige Array mit 
fester Länge steht in deinem Code.

von Anja (Gast)


Lesenswert?

beim AVR z.B. so:
1
   PROGMEM const uint16_t TestPattern[*] =
2
   {
3
#include "testpat.inc"
4
   };

in "testpat.inc" stehen dann alle Werte mit Komma getrennt.
1
/* 1st sequence */
2
7, 6, 7, 5, 7, 3, 7, 4, 7, 7, 7, 7, 7, 7, 0,
3
/* 2nd sequence */
4
7, 7, 7, 7, 7, 7, 0,
5
/* 3rd sequence */
6
4, 0
Gruß Anja

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.