Es lohnt sich die <avr/pgmspace.h> mal anzusehen.
1 Dim int Array:
(explizierter Cast auf int)
#define SIZEOF(array) (sizeof(array)/sizeof(array[0]))
#define FOREACH(array,index) for(uint16_t index=0;index<SIZEOF(array);index++)
#define pgm_read_int(adress) ((int)pgm_read_word_near(adress))
#include <avr/pgmspace.h>
// 4 Elemente, je 2 Byte
const int datenfeld[] PROGMEM = {1,2,-3,-5};
void setup()
{
Serial.begin(9600);
FOREACH(datenfeld,i)
Serial.println(pgm_read_int(&(datenfeld[i])));
}
void loop() {}
2 Dim int Array:
(implizierter Cast auf int)
#define SIZEOF(array) (sizeof(array)/sizeof(array[0]))
#include <avr/pgmspace.h>
const int datenfeld[3][2] PROGMEM = {{1,-1},{2,-2},{3,-3}};
void setup()
{
Serial.begin(9600);
for(int i=0;i<SIZEOF(datenfeld);i++)
{
int wert = pgm_read_word_near(&(datenfeld[i][0]));
Serial.print(wert);
Serial.print(",");
wert = pgm_read_word_near(&(datenfeld[i][1]));
Serial.println(wert);
}
}
void loop() {}
Und das 2 Dimensionale nochmal, in einer anderen Form:
#define SIZEOF(array) (sizeof(array)/sizeof(array[0]))
#define FOREACH(array,index) for(uint16_t index=0;index<SIZEOF(array);index++)
#define pgm_array_int(feld) ((int16_t)pgm_read_word_near(&feld))
#include <avr/pgmspace.h>
const int datenfeld[3][2] PROGMEM = {{1,-1},{2,-2},{3,-3}};
void setup()
{
Serial.begin(9600);
FOREACH(datenfeld,i)
{
FOREACH(datenfeld[i],j) // oder auch ausreichend FOREACH(datenfeld[0],j)
{
Serial.print(pgm_array_int(datenfeld[i][j]));
Serial.print(",");
}
Serial.println();
}
}
void loop() {}
Frage, wenn Fragen offen sind …