Moin Moin,
ist es möglich die in der Struktur (cmd_t) befindliche Struktur
(cmdTable_t) schon am Anfang zu initalisieren?
Und nicht so ->
const cmdTable_t cmdTab[] = "..." ( wie weiter unten..)
1
typedefstruct
2
{
3
cmdTable_tcmdTable;
4
cmdRaw_tcmdRawData;
5
}cmd_t;
6
7
constcmdTable_tcmdTab[]=
8
{
9
{"set_kx","-setk",NULL},
10
{"unset_kx","-usetk",NULL},
11
12
{"get_v","-gvol",NULL},
13
{"get_i","-gcur",NULL},
14
{"get_p","-gpwr",NULL},
15
{"get_err","-gerr",NULL},
16
17
{"write_eep","-weep",NULL},
18
{"read_eep","-reep",NULL},
19
{"clear_eep","-ceep",NULL},
20
21
{"set_user","-suser",NULL},
22
{"set_sernr","-ssrn",NULL},
23
{"set_time","-stme",NULL},
24
};
Ich möchte meiner Funktion nicht unnötig zwei Parameter übergeben. Wenn
ich die Struktur schon am Anfang einmal initalisieren lasse ( const )
brauche ich später dort nichts mehr rein zu schreiben.
Frage ist nicht klar. Möchtest Du
- verschachtelte Strukturen initialisieren oder gar
- eine Struktur initialisieren, bevor sie im Programm bekannt ist
??
Meines Wissens nach, in C nicht möglich.
in C++ könnte das so aussehen:
1
structTest
2
{
3
constbytepin;
4
uint16_tcount;
5
Test(constbytepin):pin(pin),count(0){}
6
};
7
8
Testarray[]{2,3,4,5};
Das Test.pin stammt aus der Initialisierungsliste
Test.count wird auf 0 gesetzt
Falls dich das nicht befriedigt, gilt:
Markus F. schrieb:> Frage ist nicht klar.
Da nicht klar ist, was Du meinst, reduzier Dein Beispiel so weit es
geht, z.B.:
1
typedefstruct
2
{
3
cmdTable_tcmdTable;
4
cmdRaw_tcmdRawData;
5
}cmd_t;
6
7
constcmdTable_tcmdTab[]=
8
{
9
{"a","b",0},
10
{"c","d",0},
11
};
cmdTable_t und cmdRaw_t sind nicht bekannt. Egal, wir nehmen an, dass
erstere unten "richtig" gefüllt wurde.
Unten hast Du ein Array, oben nur ein Feld. Die beiden cmdTable_t haben
also nichts miteinander zu tun.
Möchtest du eine Instanz von cmd_t initialisieren? ja, das geht, z.B.
so:
1
cmd_tmyCmd={
2
{"e","f",0},/* cmdTable analog Deinem Beispiel */
3
{3,4,5,6,7}/* wie auch immer cmdRawData gefüllt werden muss */
4
}
da der erste Eintrag aber cmd*Table* genannt ist, meinst Du vermutlich
etwas anderes, als Du schreibst.
Damit "cmd_t cmd[]"
würde ich ja mehrere Strukturen von der Struktur ansich anlegen.
Was ich wollte sind mehrere Strukturen vom Member "cmdTable_t
cmdTable;".
Diese sollten dann halt mit einem Wert einmal initalisiert werden.
Sonst würde ich mit "cmd_t cmd[]" unnötig Speicherplatz verschenken.
Pseudocode
Jan H. schrieb:> So meine ich das..
Zumindest mir (aber da scheine ich nicht alleine zu sein, die Anderen
raten ja auch nur rum) ist deine Frage immer noch nicht klar. Im
Gegenteil.
Dein letztes Beispiel ist etwas ganz anderes, als das zuerst gepostete.
@Jan H. (janiiix3)
>Diese sollten dann halt mit einem Wert einmal initalisiert werden.>Sonst würde ich mit "cmd_t cmd[]" unnötig Speicherplatz verschenken.
Nicht wirklich. Denn cmt_t cmd braucht so oder so den vollen
Speicherplatz. Lediglich die Initialisierungsdaten landen dann halt
mehrfach im Flash und werdem bei der C-Init Sequenz in die RAM-Variable
kopiert. So what! Mußt du WIRKLICH so sehr Speicher sparen? Oder ist das
eher Einbildung.
Wenn du denn WIRKLICH meinst, das tun zu müssen, mußt du das zur
Laufzeit über eine Schleife und memcpy machen, dann reicht es, einmal
die Init-Daten in dein Array zu kopieren.
Kennst Du Pointer? Wenn ja, dann verweise immer dort, wo Du das gleiche
mehrfach haben möchtest, mit einem Pointer auf eine Instanz.
Wenn nein, dann formuliere einmal ein Beispiel aus und schreibe dazu,
was Du anders haben möchtest oder was nicht klappt.
Dein Pseudocode wäre in C übrigns:
Jan H. schrieb:
1
cmd_tcmd=
2
{
3
/* eigene Klammern für das Array zuerst */
4
{
5
{NULL,NULL,NULL},// [0]
6
{NULL,NULL,NULL},// [1]
7
{NULL},/* [2] Wenn nur noch Felder mit 0 kommen,
8
{ NULL }, /* [3] */
9
/* und auch die letzten 6 kannst Du weglassen, wenn 0 */
@Achim S. (achs)
>Kennst Du Pointer? Wenn ja, dann verweise immer dort, wo Du das gleiche>mehrfach haben möchtest, mit einem Pointer auf eine Instanz.
Nö, denn dann hast du nur viele Verweise (Pointer) auf eine Instanz. Das
ist NICHT das Gleiche, wie wenn man mehrere Instanzen mit den gleichen
Daten initialisieren will, denn danach will man den Inhalt der Instanzen
vielleicht auch ändern?
Falk B. schrieb:> Das> ist NICHT das Gleiche, wie wenn man mehrere Instanzen mit den gleichen> Daten initialisieren will, denn danach will man den Inhalt der Instanzen> vielleicht auch ändern?
Glaube ich nicht, denn:
Jan H. schrieb:> Wenn> ich die Struktur schon am Anfang einmal initalisieren lasse ( const )> brauche ich später dort nichts mehr rein zu schreiben.
lass bitte das bitfeld weg (wozu auch), also:
uint8_t dataInRawBuff;
Und statt .cmdRawBuff = ...
besser gernichts oder wenn überhaupt:
{{0}}
Zudem hast Du jeweils noch ein Komma am Ende zuviel (egal, obs vom
Compiler ignoriert wird oder nicht).
Fang einfach mit leeren Mengen an und initialisiere jeweils ein element
mehr. Und wenn das eine element mehr nicht klappt, dann lies dir die
Fehlermeldung durch. Und wenn Du damit nichts anfangen kannst, dann
poste sie hier. So ist das alles nur ein großer, nicht funktionierender
Matsch, der Dich und uns nicht weiter bringt.
name und instruction sind char-Arrays, keine Zeiger. Entsprechend kann
man sie nicht mit einem NULL-Zeiger initialisieren.
Ob das natürlich das ist, was Du wirklich haben willst, kannst nur Du
selbst wissen (uns verrätst Du's ja nicht).
Hallo Jan,
C Grundlagen, ist das selben.
Jan H. schrieb:>> .table_length = sizeof(table)/sizeof(*table),> Müsste das nicht so lauten?.table_length => sizeof(table)/sizeof(table[0]),
Karl M. schrieb:> Hallo Jan,>> C Grundlagen, ist das selben.>> Jan H. schrieb:>>> .table_length = sizeof(table)/sizeof(*table),>> Müsste das nicht so lauten?.table_length =>> sizeof(table)/sizeof(table[0]),
Ja natürlich.. Peinlich! Danke.