www.mikrocontroller.net

Forum: Compiler & IDEs Merkwürdigkeit mit PROGMEM Array


Autor: Rene B. (themason) Benutzerseite
Datum:
Angehängte Dateien:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 0x00, };
      ^

> 0x317E, };
        ^

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mal in
  extern U8 aucBitmapData [] FLASHMEM;
  extern U16 auiBitmapAdrIndexAndSize [] FLASHMEM;
das FLASHMEM weg.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:

>> 0x00, };
>       ^

Ist zulässig.

Autor: A. K. (prx)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
const  U8 aucBitmapData [] FLASHMEM = {

const  U16 auiBitmapAdrIndexAndSize [] FLASHMEM = {

Autor: Rene B. (themason) Benutzerseite
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Rene B. (themason) Benutzerseite
Datum:

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

Autor: Rene B. (themason) Benutzerseite
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grrr..

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

Autor: Rene B. (themason) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ... ich hätte vllt mal compiler spielen sollen ... :-S

Autor: Oliver (Gast)
Datum:

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

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.