AVR-GCC: Pointer auf Flash-Array

OP #1402039
Hallo zusammen,

ich habe bereits die Forensuche benutzt, leider nichts passendes 
gefunden. Ich möchte mit dem AVR-GCC und Tiny24 einen Pointer auf ein 
Flash-array - für ein Blinken der LED zuständig - anlegen.

prog_uint8_t blink_slow[] PROGMEM = {
 BLINK_GREEN, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE,
 BLINK_NONE, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE};
prog_uint8_t blink_med[] PROGMEM = {
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_GREEN, BLINK_NONE,
 BLINK_NONE, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE};
prog_uint8_t blink_fast[] PROGMEM = {
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_GREEN, BLINK_GREEN,
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_NONE, BLINK_NONE};
prog_uint8_t* blinker;

Wenn ich das Byte nun so lade.
>readByte = pgm_read_byte(&blink_fast[blinker_pos]);
geht alles prächtig.

Ich möchte aber auf den Array per Pointer zugreifen.
>blinker=&blink_fast;
>readByte = pgm_read_byte(blinker[blinker_pos]);

In diesem Fall motzt GCC und der Blinker funktioniert nicht. Wie muss 
ich nun den Pointer auf das Array definieren, dass es funktioniert?

Vielen Dank für Eure Hilfe!

Michael
Klar motzt der gcc. Im ersten Fall machst Du alles richtig und übergbist 
die Adresse des Chars:

> readByte = pgm_read_byte(&blink_fast[blinker_pos]);

Im zweiten fall wird aber der Char selbst übergeben, obwohl ein Zeiger 
datauf erwartet wird.

> readByte = pgm_read_byte(blinker[blinker_pos]);

Schreib also ein & vor blinker[blinker_pos] analog zur ersten Version, 
um seine Adresse zu bekommen.

MfG Mark
OP
Vielen Dank, das klappt jetzt schon mal. Aber GCC motzt immer noch wegen 
dem Assignment/Zuweisung auf meinen Pointer:
main.c:103: warning: assignment from incompatible pointer type

prog_uint8_t* blinker;
blinker=&blink_lowbatt;
readByte = pgm_read_byte(&blinker[blinker_pos]);

Was kann ich gegen die Warnung unternehmen?
> main.c:103: warning: assignment from incompatible pointer type

Zeig mal deine ganzen Datentypen
Welches ist Zeile 103?

> blinker=&blink_lowbatt;

Der Name des Arrays alleine fungiert schon als Spezifikation für die 
Startadresse des Arrays

  blinker = blink_lowbatt;


(Ein C-Buch wäre angebracht, da steht das und noch 1000 andere 
wissenswerte Dinge drinnen)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.