Pointer zur Laufzeit auf versch. Strings im Flash setzen

Gast #363980
Lesenswert?
• ▲
▼
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
Gast #363982
Lesenswert?
• ▲
▼
@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
#363983
Lesenswert?
• ▲
▼
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.