C-Problem mit Arrayzugriff im FLASH, AVR

Gast #2241164
Lesenswert?

Auf ein Array im FLASH greife ich wie folgt zu:

Variante 1

DDR[0] = pgm_read_byte( number[1][0] ) ;

Ergebnis: 0


Variante 2 (Value ist 1)

DDR[0] = pgm_read_byte( number[value][0] ) ;

Ergebnis: 26

Erhalte aber bei beiden Varianten nicht die Werte aus der Tabelle.
Was mache ich falsch?


Hier das Array:

prog_char number [8][3] =
  {
   {0x00, 0x00, 0x00},
   {0x04, 0x00, 0x00},
   {0x00, 0x00, 0x00},
   {0x01, 0x04, 0x00},
   {0x01, 0x02, 0x00},
   {0x01, 0x02, 0x04},
   {0x01, 0x02, 0x03},
   {0x03, 0x00, 0x00},
  } ;

Compiler GCC f. AVR. Controller ATTiny13V.
Gast #2241228
Lesenswert?

Wenn ich eine reine Adressberechnung verwende geht es - aber auch nur im 
Prinzip.

DDR[0] = pgm_read_byte( number + 0) ;
DDR[1] = pgm_read_byte( number + 1) ;
DDR[2] = pgm_read_byte( number + 2) ;

Hier taucht ein neues Problem auf - das Programm geht jeweils 3 Bytes 
weiter! Bedingt durch die zweidimensionale Definition?

number + 0 * 3,
number + 1 * 3,
number + 2 * 3,

usw.

Wenn ich ein eindimensionales Array verwende ist dies kein Problem, aber 
bei mehrdimensionalen ist das ziemlich doof.
#2241231
Lesenswert?

@  Hans (Gast)

>Funktioniert 'leider' nicht.

Dann ist deine Arraydefinition Schrott, weil du schlauer sein wolltest 
und einen eigenen Datentyp falsch definiert hast.

So ist es richtig.
1
char number [8][3] PROGMEM =
2
  {
3
   {0x00, 0x00, 0x00},
4
   {0x04, 0x00, 0x00},
5
   {0x00, 0x00, 0x00},
6
   {0x01, 0x04, 0x00},
7
   {0x01, 0x02, 0x00},
8
   {0x01, 0x02, 0x04},
9
   {0x01, 0x02, 0x03},
10
   {0x03, 0x00, 0x00},
11
  } ;

> Ist aber auch verständlich, da number...
>bereits eine Adresse ist,

Keine Sekunde. number[1][0] ist der INHALT.

> so dass die Angabe von '&' nicht sinnvoll ist.

Und ob. Hab ich vor kurzem sehr ausführlich prorammiert, und es lief 
sehr gut.

MFG
Falk
Gast #2241246
Lesenswert?

> Dann ist deine Arraydefinition Schrott, weil du schlauer sein wolltest
> und einen eigenen Datentyp falsch definiert hast.

Immer langsam mit den Pferden: Der Typ prog_char stammt nicht von mir, 
sonder stammt aus <avr/pgmspace.h>, die zu WinAVR gehört.

> Keine Sekunde. number[1][0] ist der INHALT.

Ich habe geschrieben, dass number eine Adresse ist, nicht das 
numer[1][0] eine ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren