Danke. Ich war mir nicht sicher, wie das am besten gehen kann, was möglich ist, auch da die Zeichenketten unterschiedliche Längen haben... Irgendwann dachte ich, es ist besser es mit einem Array von Pointern auf Zeichenketten zu versuchen, das o.g. Beispiel funktioniert ja auch, nur war meine Hoffnung das sich das noch vereinfachen lässt für die Initialisierung, und das ist ja der Fall - perfekt!
bekomme ich das komplett auf allen Ebenen bei der Deklaration mit Nullen gefüllt, ähnlich wie hier:
uint8_t test1[2]={0,0};
und, wenn - dann wie? Ansonsten bleibt ja nur eine Schleife bei der Initialsierung, oder?
Oder ich mache ein Feld das genauso groß ist wie main_t, füttere das mit Nullen und mache einen Typecast, aber auch sehr unschön, zumal das sicher unter gewissen Umständen auch gut schief gehen kann...
Versuchen, ist eigentlich die falsche Strategie.
Ein C Grundlagenbuch auswendig zu lernen, ist deutlich erfolgversprechender.
Ich durfte das vor Jahrzehnten mal tun, und die Früchte dessen kann ich auch Heute noch ernten. Selbst wenn ich mittlerweile fast ausschließlich auf dem C++ Schiffchen fahre.
bekomme ich das komplett auf allen Ebenen bei der Deklaration mit Nullen
gefüllt, ähnlich wie hier:
uint8_t test1[2]={0,0};
und, wenn - dann wie? Ansonsten bleibt ja nur eine Schleife bei der
Initialsierung, oder?
Sollte mit einem memset(&test, 0, sizeof(test)) machbar sein.
Allerdings würde ich dir perspektivisch empfehlen, die C++-Notationen zu nutzen, anstatt das gute alte Herumgepointere. Arduino mag zwar eingeschränkt sein, was die Container betrifft auf den kleinen Controllern, aber sowas hier sollte auch als C++-Strukturdefinition gehen, glaube ich, zumindest ab C++20:
1
struct sub_t
2
{
3
uint8_t a : 5 = 0;
4
uint8_t b : 3 = 0;
5
};
Kann sein, dass du dafür -std=c++20 mitgeben musst.
Der avr-gcc ist da recht unflexibel. Das direkte Anlegen eines Arrays von Strings geht nur im RAM.
Im Flash muß man dazu ein zweidimensionales Array anlegen, d.h. alle Strings mit der maximal benötigten Länge. Das ist typisch aber kein Problem, da Flash ja reichlich vorhanden ist.
Hier mal ein Beispiel aus meinem Kommandoparser:
1
#define CMD_SIZE 16
2
3
typedefcharcmd_str_t[CMD_SIZE];
4
5
typedefvoid(*func)(void);
6
7
typedefstruct
8
{
9
cmd_str_tcmd;
10
cmd_str_tcmd_short;
11
funcfunc;
12
}command_t;
13
14
externcommand_tconstcmd_table[]PROGMEM;
15
16
command_tconstcmd_table[]PROGMEM=
17
{
18
{MODULE_CMD_INFO,"i",cmd_info},
19
{MODULE_CMD_SERIALNO,"sn",cmd_serno},
20
{MODULE_CMD_RESET,"re",cmd_reset},
21
{MODULE_CMD_EECLEAR,"epc",cmd_eeclear},
22
{"","",0},
23
};
Die Zugriffe müssen auch abweichend vom Datasegment mit den Spezialfunktionen erfolgen (pgm_read_byte, pgm_read_word, strcmp_P usw.).
Der Keil C51 kann das deutlich besser. Da ist es kein Unterschied, ob RAM oder Flash. Das entsprechende Schlüsselwort "code", "xdata" usw. reicht für alles, was nicht im default Datasegment liegt.