4 Pluspunkte 0 Minuspunkte
Wie finde ich heraus welcher Datentyp ein Union ist?
bezieht sich auf eine Antwort auf: Was ist ein Union in C
von  

2 Antworten

1 Pluspunkt 0 Minuspunkte

Ein Union selbst speichert keine Informationen zu dem Datentyp den es repräsentiert. Du kannst dein Union allerdings in einer Struktur speichern und in der Struktur die Information zum Datentyp.

#include <stdio.h>

union ExampleUnion {
    int intValue;
    float floatValue;
    char charValue;
};

// Eine Struktur die das Union und einen weiteren member "type" hat.
struct UnionWrapper {
    int type;
    union ExampleUnion val;
};

int main() {
    
    struct UnionWrapper u;

    u.type = 3;
    u.val.intValue = 42;

    // Zur Laufzeit feststellen, welcher Datentyp verwendet wird
    if (u.type == 1) {
        printf("Int value: %d\n", u.val.intValue);
    } else if (u.type == 2) {
        printf("Float value: %f\n", u.val.floatValue);
    } else if (u.type == 3) {
        printf("Char value: %c\n", u.val.charValue);
    } else {
        printf("err");
    }

    return 0;
}
von  
0 Pluspunkte 1 Minuspunkt

In C gibt es keine direkte Möglichkeit herauszufinden welcher Datentyp in einem Union aktuell verwendet wird. Wenn du zur Laufzeit Informationen über den aktuellen Datentyp benötigst, könntest du das mit Hilfe einer externen Variable oder einer anderen Datenstruktur verfolgen, die den Zustand des Unions speichert.

#include <stdio.h>

enum UnionType {
    INT_TYPE,
    FLOAT_TYPE,
    CHAR_TYPE
};

union ExampleUnion {
    enum UnionType type;  // Indikator für den aktuellen Datentyp
    int intValue;
    float floatValue;
    char charValue;
};

int main() {
    union ExampleUnion u;

    u.type = INT_TYPE;
    u.intValue = 42;

    // Zur Laufzeit feststellen, welcher Datentyp verwendet wird
    if (u.type == INT_TYPE) {
        printf("Int value: %d\n", u.intValue);
    } else if (u.type == FLOAT_TYPE) {
        printf("Float value: %f\n", u.floatValue);
    } else if (u.type == CHAR_TYPE) {
        printf("Char value: %c\n", u.charValue);
    }

    return 0;
}
von  
Das Beispiel kann nicht funktionieren. Sobald du dem ExampleUnion einen Value zuweist geht das Type Feld verloren. Es kann nur ein Member zur gleichen Zeit Gültigkeit haben!