Das mag sein......
Sagt was ähnliches....
Mein Grundsatz lautet, zumindest einer davon:
Gleiches in ein Array, verschiedenes in eine Struktur.
Und für mich sind Grafikdaten ganz was anderes, wie x-y Positionen.
Etwas Konzeptionell anderes.
In C++ verwendet man bevorzugt Referenzen.
Pointer haben ein Geschmäckle.
Das habe ich weder gesagt, noch gemeint.
Nicht mal im Ansatz.
Hier mal, wie das in etwa bei mir aussehen würde, mit der Gefahr, dass du auch damit wenig anfangen kannst.
#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"
/*
const byte Life_0[] PROGMEM = {
6, // Länge
0, // 0 = Daten unterschiedlich 1 = Daten gleich 2 = Daten alternieren
120, // Pos. X [0 ... 127]
7, // Pos. Y [0 ... 7]
0x21, 0x20, 0xF9, 0x20, 0x21, 0x00,
};
*/
enum class GMode:byte{unterschiedlich,gleich,alternierend};
struct Position
{
byte x;
byte y;
};
struct Grafik
{
byte dataSize;
GMode mode;
Position pos;
byte data[];
};
void ausgabe(const Grafik &grafik)
{
cout << F("dataSize: ") << pgm_read_byte(&grafik.dataSize) << endl;
cout << F("mode: ");
switch(GMode(pgm_read_byte(&grafik.mode)))
{
case GMode::unterschiedlich : cout << "unterschiedlich"; break;
case GMode::gleich : cout << "gleich"; break;
case GMode::alternierend : cout << "alternierend"; break;
}
cout << endl;
cout << F("x: ") << pgm_read_byte(&grafik.pos.x) << endl;
cout << F("y: ") << pgm_read_byte(&grafik.pos.y) << endl;
byte size = pgm_read_byte(&grafik.dataSize);
for(unsigned i = 0; i<size; i++) cout << _HEX(pgm_read_byte(&grafik.data[i])) << endl;
cout << endl;
}
// Kurzschreibweise
const Grafik Live_0 PROGMEM {6,GMode(0),{120,7},{0x21, 0x20, 0xF9, 0x20, 0x21, 0x00}};
//alternative Schreibweise
const Grafik Live_1 PROGMEM {
dataSize: 7,
mode: GMode::unterschiedlich,
pos: Position{ x: 120, y: 7},
data: {0x21, 0x20, 0xF9, 0x20, 0x21, 0x00, 0x42}
};
void setup()
{
Serial.begin(9600);
cout << F("Start: ") << F(__FILE__) << endl;
ausgabe(Live_0);
ausgabe(Live_1);
}
void loop()
{
}