Ja, struct dient dazu, Sachen zusammen zu fassen, welche zusammen gehören. Unterschiedliche Dinge. So hat man alles an einem Haken.
Arrays verwendet man für gleichartige Dinge.
Zudem kann struct noch viel mehr! (es ist der etwas naive Bruder von class)
Da readRainPixel() sowieso nur mit solchen Datensätzen arbeiten kann, habe ich es, schwups, in die Struktur integriert. So dass sich der Datensatz selber konstruiert, mit Daten füllt.
Zudem ist der Datensatz jetzt in der Lage sich selber auszugeben. Dadurch, dass es von Printable erbt, ist es ausdruckbar, bzw. kann es sich selber drucken. Es benötigt nur die eine Abhängigkeit "Wohin soll ich es drucken?"
Diese Abhängigkeit ist im Grunde global, da unser Serial global ist. Aber das weiß die Klasse nicht. Sie bekommt die Schnittstelle per "Parameter Injection" übergeben. Sie kann sich so auf JEDER Schnittstelle ausgeben, welche Print implementiert.
#include <Streaming.h> // die Lib findest du selber ;-)
Stream &cout = Serial; // cout Emulation für "Arme"
struct Datensatz: Printable
{
uint8_t rainPixel[12];
int8_t changer[4];
Datensatz() // Constructor
{
for(uint8_t i = 0; i < 4; i++)
{
for(uint8_t j = 0; j < 3; j++)
{
rainPixel[i * j] = 1 + i + j;
}
uint8_t upsite = 1;
changer[i] = upsite + i;
}
}
virtual size_t printTo(Print &p) const override
{
size_t len {0}; // anzahl ausgegebener Zeichen
len += p.println(F("rainPixel: "));
for(const uint8_t &data : rainPixel) len += p.println(data);
len += p.println();
len += p.println(F("changer: "));
for(const int8_t &data : changer) len += p.println(data);
len += p.println();
return len;
}
};
void rain(Stream &outStream)
{
/* lang version wahlweise
Datensatz d;
// outStream.print(d);
// d.printTo(outStream);
outStream << d << endl;
*/
// kurzversion wahlweise
// outStream.print(Datensatz());
// Datensatz().printTo(outStream);
outStream << Datensatz() << endl;
}
void setup()
{
Serial.begin(9600);
cout << F("Start: ") << F(__FILE__) << endl;
rain(cout);
}
void loop()
{
}