Du hast den Struct als Zeiger definiert. Ist das richtig?
Ich wäre so vorgegangen. Den Struct ganz "normal" als Variable, kein
Zeiger, definiert.
Dann einen pointer, der auf die Anfangsadresse des Structs zeigt
definiert.
Wenn man dann den pointer incrementiert, müsste er auf das nächste
Element zeigen.
Teddy schrieb:> Du hast den Struct als Zeiger definiert. Ist das richtig?>> Ich wäre so vorgegangen. Den Struct ganz "normal" als Variable, kein> Zeiger, definiert.> Dann einen pointer, der auf die Anfangsadresse des Structs zeigt> definiert.> Wenn man dann den pointer incrementiert, müsste er auf das nächste> Element zeigen.
Genau so habe Ich das getan. Das klappt eben nicht..
ist IMHO undefiniertes Verhalten, aber wenn du Dich darauf verlässt dass
die Element in der gleichen Reihenfolge und ohne padding hintereinander
im Speicher liegen und der Anfang des structs identisch mit seinem
ersten element ist, dann sollte es gehen.
Wenn der struct aber ehe nur die gleichen Element-typen (const char *)
beinhaltet solltest Du einfach ein array nutzen, dann klappts auch mit
der pointer-arithmetic :-)
micha schrieb:> ist IMHO undefiniertes Verhalten, aber wenn du Dich darauf> verlässt dass> die Element in der gleichen Reihenfolge und ohne padding hintereinander> im Speicher liegen und der Anfang des structs identisch mit seinem> ersten element ist, dann sollte es gehen.>> Wenn der struct aber ehe nur die gleichen Element-typen (const char *)> beinhaltet solltest Du einfach ein array nutzen, dann klappts auch mit> der pointer-arithmetic :-)
Wie würde das denn dann aussehen?
Jan H. schrieb:> micha schrieb:>> ist IMHO undefiniertes Verhalten, aber wenn du Dich darauf>> verlässt dass>> die Element in der gleichen Reihenfolge und ohne padding hintereinander>> im Speicher liegen und der Anfang des structs identisch mit seinem>> ersten element ist, dann sollte es gehen.>>>> Wenn der struct aber ehe nur die gleichen Element-typen (const char *)>> beinhaltet solltest Du einfach ein array nutzen, dann klappts auch mit>> der pointer-arithmetic :-)>> Wie würde das denn dann aussehen?>
1
>uniontest
2
>{
3
>DevBoard_tMessage;
4
>charuartMsg[];
5
>};
6
>
> So ungefähr?
Wenn die einzelnen C-Strings in DevBoard_t 0-terminated sind (wie es bei
C-Strings angenommen wird), dann wird nur der erste String in DevBoard_t
ausgegeben.
Edit: Sehe gerade, dass die Elemente in DecBoard_t gar keine char-Arrays
sind, dann geht das natürlich so eh nicht.
Warum gibst Du die C-Strings nicht einfach direkt aus, statt so ein
type-punning einzubauen (was zugegebenermaßen in C erlaubt und kein UB
ist).
Jan H. schrieb:> Ist es irgendwie möglich auf die einzelnen Strings in dieser Struktur> via. increment zu kommen?
Vielleicht ein Array mit benamten Indices anstatt Komponenten? Eine
Union wie oben genannt geht zwar auch, aber die Lesbarkeit solcher
Konstrukte ist nicht sooo toll.
Beispiel:
Johann L. schrieb:> Vielleicht ein Array mit benamten Indices anstatt Komponenten? Eine> Union wie oben genannt geht zwar auch, aber die Lesbarkeit solcher> Konstrukte ist nicht sooo toll.
Wie würde es denn mit einem "union" aussehen?
Johann L. schrieb:> Beispiel:> enum> {> ID_ProjectName,> ID_HardwareDate,> ID_MadeBy,> ID_Count> };>> typedef struct> {> const char *strings[ID_Count];> } DevBoard_t;>> const DevBoard_t Message => {> {> [ID_ProjectName] = "Project",> [ID_HardwareDate] = "Now",> [ID_MadeBy] = "Me"> }> };
Diese Lösung finde ich recht interessant.
Wie sieht es mit einem "String Array" aus? Kann Ich das da auch so
einfach einbinden?
Jan H. schrieb:> Diese Lösung finde ich recht interessant.> Wie sieht es mit einem "String Array" aus? Kann Ich das da auch so> einfach einbinden?
Das kommt auf die Anwendung an ob das besser ist:
1
enum{...};
2
3
#define MAX_LEN 10
4
5
typedefstruct
6
{
7
constcharstrings[ID_Count][MAX_LEN];
8
}DevBoard_t;
9
10
constDevBoard_tMessage=
11
{
12
{
13
[ID_ProjectName]="Project",
14
[ID_HardwareDate]="Now",
15
[ID_MadeBy]="Me"
16
}
17
};
18
19
externvoiduart_puts(constchar*);
20
21
constDevBoard_t*uartMsg=&Message;
22
23
voidfunc(constDevBoard_t*board)
24
{
25
for(inti=0;i<ID_Count;i++)
26
{
27
uart_puts(board->strings[i]);
28
}
29
30
constchar(*str)[MAX_LEN]=board->strings;
31
32
for(inti=0;i<ID_Count;i++)
33
{
34
uart_puts(*str++);
35
}
36
}
Ein Problem ist, dass die maximale String-Länge statisch bekannt sein
muss. Und während man ein const char* ändern und auf einen anderen
String zeigen lassen kann, ist das bei einem const char[] nicht so. Und
ohne das "const" brauch man ein strcpy um einen neuen String
hineinzubekommen. Dafür brauch man beim Zugriff eine Indirektion
weniger und keinen Platz zum Speichern der Adressen, allerdings gibt es
auch Verschnitt bei ungleich langen Strings.
Johann L. schrieb:> Jan H. schrieb:> Diese Lösung finde ich recht interessant.> Wie sieht es mit einem "String Array" aus? Kann Ich das da auch so> einfach einbinden?>> Das kommt auf die Anwendung an ob das besser ist:enum { ... };
Deine erste Lösung reicht mir. Scheint erstmal perfekt zu passen.