typedef union



  • hallöchen,

    habe ein Verständnisproblem mit "typedef union". Habe zwar schon den Beitrag http://www.c-plusplus.net/forum/viewtopic-var-t-is-154560-and-highlight-is-typedef+union.html gesehen, aber hilft mir leider nicht wirklich weiter, da es in einem meiner Bücher etwas anders aussieht.

    Ich versuche also den Unterschied zwischen "typedef struct" und "typdef union" zu verstehen. Habe im Internet schon gelesen, dass dann Daten unterschiedlich verwaltet (abgespeichert) werden. Aber das ist mir ja eigentlich total egal, was im Hintergrund passiert.

    Beispiel:

    #include <stdio.h>
    typedef struct
    {  int iX;
       float fX;
    } tS; 
    typedef union 
    {  int iX;
       float fX;
    } tU;
    int main(int argc,char *argv[])
    {  tS oS; // struct
       tU oU; // union
       oS.iX=1;
       oU.iX=2;
       printf("%i\n",oS.iX); // 1
       printf("%f\n",oS.fX); // 0.0
       printf("%i\n",oU.iX); // 2
       printf("%f\n",oU.fX); // 0.0
    }
    

    Also ich kann da echt überhaupt keinen Unterschied erkennen. Aaaaabsolut gleiches Verhalten. Kann mir wer erklären, wann man welche Variante verwenden muss? 😕



  • Dann mach doch auch das Beispiel mal konsequent weiter - mach was mit fX und lass Dir nochmal iX ausgeben.


  • Mod

    printf("%f\n",oS.fX); // 0.0  - Zufall, da fX nicht initialisiert wurd, könnte hier alles Mögliche herauskommen
       printf("%f\n",oU.fX); // 0.0 - undefiniert (nicht ganz zufällig aber etwas, dass sehr nahe bei 0 liegt)
    

    In einem struct ist der Wert jedes Elements der, der dem jeweiligen Element zuvor gegeben wurde (und wenn so eine Zuweisung bisher nicht erfolgt ist, ein zufälliger Wert). In einem union dagegen hängt der Wert eines Elements vom Wert der letzten Zuweisung zu irgendeinem Element ab.

    tS oS;
       tU oU;
       oS.fX=1000.0f;
       oU.fx=1000.0f;
       oS.iX=1;
       oU.iX=2;
       printf("%i\n",oS.iX); // 1
       printf("%f\n",oS.fX); // 1000
       printf("%i\n",oU.iX); // 2
       printf("%f\n",oU.fX); // wahrscheinlich etwas von 1000 Verschiedenes
    


  • Danke für die Antworten 🙂

    Habe jetzt 2 Tests gemacht.
    Test 1:

    oS.fX=1000.0f;
       oU.fX=1000.0f;
       oS.iX=1;
       oU.iX=2;
       printf("%i\n",oS.iX); // 1
       printf("%f\n",oS.fX); // 1000.0
       printf("%i\n",oU.iX); // 2
       printf("%f\n",oU.fX); // 0.0(!)
    

    Test 2:

    oS.iX=1;
       oU.iX=2;
       oS.fX=1000.0f;
       oU.fX=1000.0f;
       printf("%i\n",oS.iX); // 1
       printf("%f\n",oS.fX); // 1000.0
       printf("%i\n",oU.iX); // 1148846080(!)
       printf("%f\n",oU.fX); // 1000.0
    

    Der Unterschied zwischen den beiden Tests liegt darin, dass int- und float-Werte in unterschiedlichen Reihenfolge zugewiesen wurden. struct verhält sich wie erwartet. union liefert mir aber zum Teil immer Schwachsinn.

    Jetzt habe ich verstanden, worin der Unterschied besteht. Auch ist mir jetzt klar, dass union teilweise Schwachsinn zurückgibt. Das geschieht wohl aufgrund der Art und Weise der Datenhaltung.

    (Backgroundinfo, wie ich auf dieses "typedef union" gestoßen bin: PHP ist in C programmiert. Dort kommt angeblich dieses "typedef union" als Datencontainer zum Einsatz.)

    Ich frage mich jetzt, wozu es dieses "typdef union" überhaupt gibt. Ich sehe keinen Sinn darin. Am besten vergessen und immer nur mit "typdef struct" arbeiten? Ich muss in der Programmierung sowieso immer darauf achten, dass ich mit den richtigen Variablen arbeite. Oder sehe ich da etwas falsch 😕



  • naja, keine ahnung, ich hab ne union beispielsweise schon mal beim byteweise kopieren von variablen hergenommen, ging ganz gut und implizit, allerdings hab ichs glaub ich hinterher wieder rausgeschmissen, weil des ja für den betrachter recht "magisch" wirkt.
    aber unions sind eigentlich schon brauchbar, allerdings kann man sie, denke ich, verbunden mit einigem schreibaufwand, auch vermeiden.


  • Mod

    Vorden schrieb:

    naja, keine ahnung, ich hab ne union beispielsweise schon mal beim byteweise kopieren von variablen hergenommen, ging ganz gut und implizit, allerdings hab ichs glaub ich hinterher wieder rausgeschmissen, weil des ja für den betrachter recht "magisch" wirkt.
    aber unions sind eigentlich schon brauchbar, allerdings kann man sie, denke ich, verbunden mit einigem schreibaufwand, auch vermeiden.

    Was willst du uns damit sagen?

    Ein union ist ein Objekt, das Werte verschiedenen Typs speichern kann. So etwas kommt gelegentlich vor, nimm etwa eine Tabellenkalkulation deiner Wahl - eine Zelle kann hier Daten verschiedener Art (Zahl,String,Datum etc.) speichern, nicht aber mehrere davon gleichzeitig. Soetwas lässt sich mittels union abbilden - die Information, welcher Typ gerade aktiv ist, ist aber im union selbst nicht enthalten und muss ggf. separat gespeichert werden. Im Allgemeinen ist es undefiniert, auf den Wert eines unions mit einem anderen Typen als dem, mit dem er gespeichert wurde, zuzugreifen (wie etwa in obigen Beispielen - nat. gibt es einen Grund, warum die Programme sich gerade so verhalten wie sie es tun, aber das hat mit der Sprache allein wenig zu tun).



  • Der einzige Grund, warum man mit union arbeiten könnte, wäre wohl, um Arbeitsspeicher zu sparen, richtig?

    Das mit den unterschiedlichen Typen, die nicht gleichzeitig sein dürfen, stimmt übrigens. Die C-Programmierung von PHP schaut so aus, dass von einem Set erlaubter Typen immer nur eines für eine bestimmte Variable "aktiv" ist.


Log in to reply