Forum: Compiler & IDEs AVR-GCC: Array wird nicht initialisiert


von Sortland (Gast)


Lesenswert?

Hi,

ich nutze in meinem Programm eine Tabelle, welche in einem Headerfile 
protocol.h initialisiert wird:
1
PROGMEM const unsigned short speedMap[1974]={1,2,2,3,3,3,...};

protocol.h wird natürlich auch in meiner main.c includiert. Wenn ich den 
Krempel jetzt aber im AVR-studio-Simulator laufen lasse, dann ist das 
Array komplett leer, sprich mit 0 initialisiert.

Woran kann das liegen? Wo bleiben meine Tabellenwerte?

Danke!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sortland schrieb:
>
1
PROGMEM const unsigned short speedMap[1974]={1,2,2,3,3,3,...};

Syntax error.

> protocol.h wird natürlich auch in meiner main.c includiert.

Nur dort?

> Wenn ich den
> Krempel jetzt aber im AVR-studio-Simulator laufen lasse, dann ist das
> Array komplett leer, sprich mit 0 initialisiert.

Leider sieht man hier nur eine kaputte Zeile, nicht den anderen 
"Krempel".

Erstelle bitte ein Minimalbeispiel, um das Problem zu reproduzieren.

Compiler-Version?

von Klaus W. (mfgkw)


Lesenswert?

ja, entweder zegen, wie du es versuchst an einem kompletten Beispiel, 
oder erst das lesen:
http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Evtl. versuchst du ja über speedMap[...] an die Werte zu kommen.
Das wäre falsch, weil die Werte nicht über einen Zeiger im Datenraum zu 
holen sind, sondern über pgm_read...()-Funktionen.

von Sortland (Gast)


Lesenswert?

Klaus W. schrieb:
> sondern über pgm_read...()-Funktionen.

OK, das war's - danke!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sortland schrieb:
>
1
PROGMEM const unsigned short speedMap[1974]={1,2,2,3,3,3,...};

Und warum nicht gleich
1
const __flash uint16_t speedMap[1974] = { 1, ...};
Verunstaltet dann die Quelle auch nicht mehr durch pgm_read-Geraffel.

von Stefan K. (stefan64)


Lesenswert?

Das solltest Du nicht im .h File stehen haben. Wenn das .h File in 
mehreren Quellen eingebunden wird, wird speedMap[] entsprechend oft 
angelegt.

Besser in einem .c anlegen und im .h mit extern ... darauf verweisen.

Gruß, Stefan

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


Lesenswert?

Stefan K. schrieb:
> Wenn das .h File in mehreren Quellen eingebunden wird, wird speedMap[]
> entsprechend oft angelegt.

Nicht, solange nicht auch noch "static" davor steht.

Sinnvoll ist es trotzdem nicht, das im Headerfile anlegen zu wollen.

Ansonsten würde ich Johanns Rat folgen und das auf aktuellen Compilern
auf __flash umstellen.  Der PROGMEM-Kram war ein Notnagel, um die Zeit
zu überbrücken, bis Johann eine richtige Implementierung im Compiler
realisiert hat. :)

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.