Hallo zusammen, ich habe zwei structs. Der Typ des einen structs liegt fest - ich kann ihn nicht ändern. Den Typ des zweiten Structs kann ich frei festlegen. Ich will einen Zeiger auf einen dieser beiden Structs durch den Inhalt unterscheidbar machen. Im C-Quelltext also ungefähr so:
1 | // Struct mit unveraenderlicher Struktur
|
2 | typedef struct fixedstruct_s |
3 | {
|
4 | uint8_t *a; |
5 | int someweirdcontent; |
6 | uint8_t b, c, d; |
7 | }
|
8 | Fixedstruct_t; |
9 | |
10 | // Struct frei waehlbarer Struktur (solange alles hineinpasst)
|
11 | typedef struct |
12 | {
|
13 | uint8_t *null; |
14 | uint32_t lala; |
15 | uint16_t lili; |
16 | uint16_t lulu; |
17 | }
|
18 | StructOfFreeChoice_t; |
19 | |
20 | typedef struct |
21 | {
|
22 | uint8_t *discriminator; |
23 | }
|
24 | Genericstruct_t; |
25 | |
26 | |
27 | |
28 | bool discriminateStructPointer(void *S) |
29 | {
|
30 | Genericstruct_t *G = (Genericstruct_t *) S; |
31 | if( G->discriminator == NULL ) |
32 | return 1; |
33 | else
|
34 | return 0; |
35 | }
|
36 | |
37 | |
38 | /* Funktion zum Testen von Sachen. */
|
39 | int main(void) |
40 | {
|
41 | uint8_t somethingToPointTo; |
42 | Fixedstruct_t A = {.a = &somethingToPointTo}; // Rest nicht initialisiert |
43 | StructOfFreeChoice_t B = {.null = NULL,}; // Wird bei Typ A nie vorkommen |
44 | |
45 | |
46 | int a = discriminateStructPointer(&A); |
47 | int b = discriminateStructPointer(&B); |
48 | printf("typeA=%i, typeB=%i", a, b); |
49 | |
50 | return EXIT_SUCCESS; |
51 | }
|
Das Beispiel läuft. Ich finde im C-Standard nichts zur Dereferenzierung eines void-Zeigers auf einen unpassenden struct-Typ. Deshalb die Frage: - Ist diese Methode zulässig? - Oder gibt es eine bessere Methode? Viele Grüße W.T.