Forum: Compiler & IDEs Merkwürdigkeit mit PROGMEM Array


von Rene B. (themason) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe ein kleines Problem das ich nicht so ganz verstehe.
Ich habe eine C-Datei in der Daten abgelegt sind (ein UCHAR und ein 
UINT-Array). Beim Compilieren der Datei erhalte ich folgende Warnung :
"only initialized variables can be placed into program memory area".
Aber ich habe das Array doch initialisiert, oder sehe ich da was falsch 
?!
(Nicht über das FLASHMEM im Code wundern. Es gibt ein Makro das aus 
FLASHMEM PROGMEM macht, und selbst wenn ich es händisch mache kommt 
diese Fehlermeldung).
Hintergrund des ganzen ist das ich die Funktion uiGLCDGetBitmapDataSize 
nicht nutzen kann da sie angeblich nicht definiert ist (im Headerfile 
ist diese allerdings definiert und wird auch korrekt von allen anderen 
Modulen includiert, Kompiliere ich das ganze ohne das glcd_data modul 
meckert der Compiler das er aucBitmapData nicht kennt). Da das Array 
angeblich nicht korrekt initialisiert ist wird wohl auch anscheinend die 
sizeof-Operation wegoptimiert und somit die ganze Funktion (was mir 
allerdings merkwürdig vorkommt).
Was kann das für ein Fehler sein ?! (zumal ich in einem anderen Stand 
des Projektes genau die selbe Datei nutze und das Compilieren dort keine 
Probleme macht)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 0x00, };
      ^

> 0x317E, };
        ^

von (prx) A. K. (prx)


Lesenswert?

Lass mal in
  extern U8 aucBitmapData [] FLASHMEM;
  extern U16 auiBitmapAdrIndexAndSize [] FLASHMEM;
das FLASHMEM weg.

von (prx) A. K. (prx)


Lesenswert?

Stefan B. schrieb:

>> 0x00, };
>       ^

Ist zulässig.

von (prx) A. K. (prx)


Lesenswert?

Rene Böllhoff schrieb:

> UINT-Array). Beim Compilieren der Datei erhalte ich folgende Warnung :
> "only initialized variables can be placed into program memory area".

Bei Fehlermeldungen hilft es, wenn man rauskriegt, auf welche Zeile sich 
die bezieht. Das steht sogar manchmal dabei!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

const  U8 aucBitmapData [] FLASHMEM = {

const  U16 auiBitmapAdrIndexAndSize [] FLASHMEM = {

von Rene B. (themason) Benutzerseite


Lesenswert?

erstmal danke für die antworten.

also das , } ist zulässig. das mach ich seit eh und je so und da hat 
noch kein compiler drüber gemeckert.
das extern xxx FLASHMEM sollte aber auch kein thema sein (zumindest lies 
sich das in der vorherigen version einwandfrei kompilieren).
das die zeilennummer dabeisteht hab ich schon gemerkt :-) deshalb bin 
ich ja so verwirrt, da in der zeile ja wirklich eine initialisierung des 
arrays steht, der compiler aber das gegenteil behauptet.

von Oliver (Gast)


Lesenswert?

> Process Exit Code: 0
> Time Taken: 00:19

Ich kann anstellen, was ich will, deinen Fehler bekomme ich nicht 
reproduziert. Das Problem liegt nicht in den Zeilen Code, die du hier 
gezeigt hast.

Oliver

von Rene B. (themason) Benutzerseite


Lesenswert?

Ich hab mir erstmal damit geholfen den compilierbaren Software-Stand 
dahingehend upzudaten das er dem derzeitigen SW-Stand entspricht. Es 
lies sich auch ohne Fehler Compilieren. Allerdings habe ich beim 
weiteren programmieren den Fehler erneut gehabt (diesmal mit einer 
anderen Tabelle).
Diesmal habe ich zwar nicht den Fehler "only initialized variables can 
be ..." erhalten, sondern dafür "invalid application of 'sizeof' to 
incomplete type of blabla []".
der eigentliche witz ist aber :
kopiere ich die betreffende tabelle in das selbe modul benenne diese um 
(und auch die variable in sizeof) funktioniert das ganze. das kann es 
aber nicht sein (da ich die tabelle dann ja zweimal bräuchte.
also so langsam glaub ich ist da im winavr (ich hab den 20081124rc3) ein 
bug drin ist.
komischerweise bekomme ich den fehler nur wenn ich sizeof auf eine 
flash-tabelle anwende. aber im prinzip sollte es ja egal sein.
ein versuch mit "const" davor ist leider auch gescheitert.
ich denke ich muß wirklich den winavr (und wenn ich schonmal dabei bin, 
mein avrstudio) updaten. kann das evtl. der grund sein das ich diese 
merkwürdigen effekte bekomme ?!

von Rene B. (themason) Benutzerseite


Lesenswert?

also irgendwie versteh ichs nicht ... selbst der neue winavr (20090313) 
hat dieses komische verhalten.
ich hab mir im moment damit geholfen das ich den benötigten code direkt 
in dem modul platziert habe indem auch die tabellen liegen. liegen die 
tabellen außerhalb des moduls habe ich keine chance mit sizeof darauf 
zuzugreifen.
ist das normales verhalten. vllt dadurch bedingt das ich im headerfile 
"extern xxxx [] FLASHMEM" stehen hab ?!
irgendwie steh ich aufm schlauch ...

von Oliver (Gast)


Lesenswert?

>Diesmal habe ich zwar nicht den Fehler "only initialized variables can
>be ..." erhalten, sondern dafür "invalid application of 'sizeof' to
>incomplete type of blabla []".

Der Fehler ist ein Fehler, und den solltest du für nicht im Flash 
liegende Tabellen bekommen.

Beitrag "sizeof  geht nicht"

Oliver

von Oliver (Gast)


Lesenswert?

grrr..

Der Fehler ist ein Fehler, und den solltest du AUCH für nicht im Flash
liegende Tabellen bekommen.

von Rene B. (themason) Benutzerseite


Lesenswert?

ok ... ich hätte vllt mal compiler spielen sollen ... :-S

von Oliver (Gast)


Lesenswert?

Wobei die saubere Lösung für das Problem ja schon ganz oben in deinem 
Code enthalten ist. Eine eigene Funktion im der Datei, die auch das Feld 
enthält, und die die Größe zurückgibt. OOP lässt grüßen.

Oliver

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.