Hallo! Hab hier ein Problem, bei dem ich ein bischen auf der Leitung sitze... Ich habe mehrere Strings im Flash angelegt (a la "const unsigned char p_text1[] PROGMEM = blablabla") Um nun einen der Texte auswählen zu können, hätte ich folgendes vorgehabt: Ich definiere einen Pointer (volatile unsigned char *text), den ich dann per switch-Anweisung einem Textstring im Flash zuweise. z.B. switch (num) { case 0: text=p_text1; break; case 1: text=p_text2; break; } Der erzeugte Code läuft zwar, jedoch der Compiler gibt mir eine Warnung aus: "warning: assignment discards qualifiers from pointer target type" Was will er mir damit sagen oder besser: Was muß ich wie ändern, damit die Warnung nicht mehr auftritt? Danke schonmal im Vorraus! Gruß, Techniker
Der Pointer muss als "auf PROGMEM verweisend" deklariert sein, also volatile PROGMEM unsigned char *text const sollte er auch noch sein (ist ja nicht veränderbar, auf was er zeigt) also: volatile const PROGMEM unsigned char *text bzw, kürzer: PGM_P text; /Ernst
@Ernst: Bin leider erst heute dazugekommen, das auszuprobieren! Wenn ich den Zeiger mit "volatile const PROGMEM unsigned char *text" deklariere, so sagt mir der Compiler "error: assignment of read-only variable `text'" und bricht mit Exit Code 2 ab. Verwende ich jedoch PGM_P, so funktionierts! dummguck Hab mir dann mal das pgmspace.h angeschaut, aber dort ist auch nix besonderes gemacht. (oder ich habs übersehen?) Bin zwar glücklich, dass es mit PGM_P funktioniert, würde die deklaration aber gerne ausschreiben. :) Wäre um Tipps sehr dankbar! Gruß, Techniker
Ja, stimmt... der Kompiler wertet das __attribute((_progmem_)) für den Pointer aus, nicht für den Datentyp auf den der Pointer verweist, will also den pointer selbst in den progmem packen. Mit nem Typedef dazwischen gehts:
1 | typedef const unsigned char PROGMEM PROGCHAR; |
2 | PROGCHAR p_text1[]="Blubb"; |
3 | PROGCHAR * test; |
4 | |
5 | int main(void) { |
6 | test=p_text1; |
7 | ...
|
Dann würd ich aber lieber gleich die vordefinierten Typen aus der pgmspace.h verwenden... /Ernst
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.