C++ Union - Verständnisproblem



  • Hallo,
    Ich bin gerade dabei C++ zu lernen und bin auf etwas gestoßen, dass mir unlogisch vorkommt.
    Es geht um diesen Code

    // Kapitel 2 - Programm 4 - UNION.CPP
    #include <iostream>
    
    struct Flugzeug
    {
       int Spannweite;
       int Passagiere;
       union
       {
          float Tankinhalt;     // für Kampfflieger
          float Bomben;     // für Bomber
          int Paletten;         // für Transporter
       };
    } Kampfflieger, Bomber, Transporter;
    
    int main()
    {
       Kampfflieger.Spannweite = 40;
       Kampfflieger.Passagiere = 1;
       Kampfflieger.Tankinhalt = 12000.0;
    
       Bomber.Spannweite = 90;
       Bomber.Passagiere = 12;
       Bomber.Bomben = 14000.0;
    
       Transporter.Spannweite = 106;
       Transporter.Passagiere = 4;
       Transporter.Paletten = 42;
    
       Transporter.Tankinhalt = 18000.0;
       Kampfflieger.Paletten = 4;
    
       std::cout << "Der Kampfflieger traegt "
                 << &Kampfflieger.Tankinhalt << "=" <<Kampfflieger.Tankinhalt <<"\t" << &Kampfflieger.Paletten << "=" << Kampfflieger.Paletten << "\n";
       std::cout << "Der Bomber ist mit " << Bomber.Bomben << " Bomben bestueckt.\n";
    
       return 0;
    }
    
    // Ergebnis beim Ausführen
    //
    // Der Kampfflieger traegt 4 Paletten.
    // Der Bomber ist mit 14000 Bombern bestueckt.
    

    Da alle teilnehmenden Variablen der union auf dieselbe Speicherstelle zeigen (denke ich) müsste es ja egal sein, auf welche Variable man letztendlich zugreift. Allerdings sieht man an der Ausgabe des Programms, wie dieselbe Speicherstelle unterschiedliche Inhalte hat. Was soll man davon halten?

    Viele Grüße,
    Flo



  • Irgendwie stimmt deine genannte Ausgabe nicht mit der lt. Code zu erwartenden überein.

    Float und int haben ganz unterschiedliche interne Repräsentanzen.
    http://de.wikipedia.org/wiki/Gleitkommazahl#Berechnung_einer_IEEE_single_precision_Gleitkommazahl_.2832-Bit-Gleitkommazahl.29



  • Derselbe Speicherinhalt kann halt auf unterschiedliche Weise interpretiert werden, was genau ist dein Verständnisproblem? Kann das nicht nachvollziehen.



  • Mmh, da hast du wohl was missverstanden:

    Kampfflieger.Tankinhalt = 12000.0;
    cout << Kampfflieger.Bomben; // Ausgabe 12000.0
    

    Aber bei drei Instanzen gibt's auch drei mal Speicher für die union.



  • Denk mal dein problem ist der int und der float.

    nen union speichert alles im selben speicherbereich richtig.
    aber nen bytefeld von 0x04 0x00 0x00 0x00 z.b. als int ist ne 4 !
    aber als float isses definitiv keine 4.0 sondern was ganz anders 🙂 (Mantisse und exponential definition).

    dementsprechen macht eine Zuordnung was anderes, als nur kopieren:

    float f1 = 4.0; 
    int i1 = static_cast<int>(f1); /// na wie gross ist i1 ??? 
    int i2 = 0;
    memcpy(&i2,&f1,sizeof(int));   /// 4 Bytes uninterpretiert auf den int kopieren  
    bool bx = (i1 == i2);          /// und preisfrage, was steht nu in i2 ?
    

    aber falls bei dir Tankinhalt und Bomben nicht gleich sein sollten, dann hat der compiler nen problem, oder du nen Multithreading problem 🙂

    Ciao ...



  • Danke, das ging ja schnell = ) @RHBaum, wir haben gleichzeitig getippt...
    Jetzt ist mir klar wo mein Denkfehler lag.
    Das Problem war das es Zeiger verschiedner Typen waren, also einmal int und einmal float. Also ist die Speicherstelle (hexadezimal) angegeben nur die, die den Anfang des benutzten Speichers markiert.

    Kann man also sagen, dass der für eine Union reservierte Speicher, der Größe des größten Datentyps in der union entspricht!?

    Ich bin noch nicht beim objektorientierten, also lasse ich jetzt vorerst die Klassen außenvor und betrachte das bezüglich der Strukturen.
    Der Sinn der Union liegt doch dann genau darin, ohne unnötigen Speicherbedarf eine größere Anzahl von Dingen beschreiben zu können.

    -Flo



  • Flub schrieb:

    Kann man also sagen, dass der für eine Union reservierte Speicher, der Größe des größten Datentyps in der union entspricht!?

    Ja, genau.



  • Ich bin noch nicht beim objektorientierten, also lasse ich jetzt vorerst die Klassen außenvor und betrachte das bezüglich der Strukturen.

    Strukturen sind auch Objekte.



  • ich dachte im ansi-c standard ist nichts objektorientierndtes enthalten. Strukturen gab es allerdings schon. Außerdem dachte/denke ich, dass die ganze Objektorientierung, alles nur ein verallgemeinerter Umgang mit Strukturen ist, also durch neue Funktionen geregelt usw. Lieg ich da richtig?

    Gruß,
    Flo



  • Objektorientierung ist keine Eigentschaft der Sprache. Man kann auch mit C oder Assembler objektorientiert programmieren.
    Andersherum kann die Sprache aber helfen, objektiorientiertes einprägsamer und kürzer darzustellen.



  • prinzipiell sind die strukturen die man in c selbst hätte schreiben müssen in c++ schon vorhanden, sodass man nicht die systematik an sich neu schreiben muss, sondern sofort klassen und objekte anlegen kann. stimmt das so?



  • moment

    strukturen (also structs) sind erstmal nur daten die zusammengefasst und quasi zu einem neuen datentyp gebunden sind

    der unterschied zu klassen ist, dass klassen operationen enthalten können, die auf genaudiese zusammengefassten datenanwendbar sind ohne dass jeder die daten sehen bzw. verändern kann (kapselung)

    wenn du in C dir ein struct für 3D Vektoren geschrieben hast, heisst das aber noch lange nicht dass es das gleiche für C++ schon gibt (ok, 3d vektoren werden bei 3d spielen gebraucht, also gibts das schon)



  • ich meinte nicht structs sondern einfach prinzipiell funktionen die den umgang mit strukturen steuern.



  • jetzt weis ich gar nicht mehr was du meinst

    C ist hier im C++ veraltet 😉
    und funktionen die als parameter oder rückgabe werte structs haben kannst du dir auch selbst definieren, das hat mit dem standard erstmal nix zu tun

    in C++ gibt es einen standard, also die standard template library, den die compiler hersteller mehr oder weniger erfüllen (oder sogar mehr noch implementieren). in diesem standard sind klassen zu hauf vorhanden. vielleicht auch irgendwo noch structs (mir fallen spontan keine ein ausser in den alten c headern)
    genauso sind auch eine reihe von fuktionen definiert, die sind auch mehr oder weniger alle genormt (iteratoren, funktoren usw......)

    "Strukturen" wie unions, structs oder class's sind elemente der programmiersprache. diese (sinnvoll) anzuwenden ist aufgabe eines programmierers

    du kannst sowohl in c als auch in c++ dir eine datei erstellen und gleich sofort ohne probleme folgendes reinschreiben

    struct s{
       int myInt;
       float myFloat;
    };
    
    void f(int & a, const s * const struktur)
    {
         a = struktur->myInt;
    }
    
    int main()
    {
        int foo = 148274;
        s Struk = {42, 3.1415965};
        f(a, &Struk);
    }
    

    (nicht getestet, und ich kann nur C++, für c kann ich keine garantien übernehmen)

    das hat nichts mit dem unterschied der sprachen zu tun und auch nix mit dem standard



  • ein direktes problem habe ich nicht mehr = ) ich habe mich nur gefragt, wie es zu c++ kam, da hab ich mir gedacht,dass es wohl nichts anderes ist, als c mit ein paar effizienten funktionen die bestimmte routinen erfüllen, sodass man auf diese sehr effizienten routinen aufbauen kann, ohne die basis neu zu entwickeln, das heißt, dass man ein gewisses maß an effizienz dadurch geschenkt bekommt.

    Was ich wissen wollte/will ist, ob ich richtig liege mit dieser Sicht auf die Programmiersprache C++.

    Gruß,
    Flo



  • Da liegst du sowas von falsch. C++ ist weit fortschrittlicher als C, C++ hat Templates, Klassen, Exceptions, eine Standardlibrary und noch viel mehr.
    In C++ programmiert man ganz anders als in C. Ein gutes Beispiel hierfür ist die Verarbeitung von strings.



  • aber der ganze umgang mit den verschiedenen dingen wie z.b. strings, ist doch eben, durch sehr effiziente funktionen geregelt, die man genausogut hätte in C schreiben und benutzen kann. Die essentiellen dinge kann man ja mit c, wie man sie effizient verpackt ist sache der programmierer... ich glaube nicht, dass ich mit meiner annahme so komplett falsch liege.
    vielleicht muss man wissen, in welcher sprache c++ geschrieben wurde.

    ich könnte mir gut vorstellen, dass aus c mit den entsprechenden libraries fast schon c++ wird.

    natürlich kann man die implementierten begriffe nicht verändern, aber mal ganz abgesehen von den begrifflichkeiten...

    edit: das hier(http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library) belegt doch was ich sage.



  • Nein, das kann man nicht in C schreiben. In C gibt es keine Klassen.

    Was meinst du mit "In welcher Sprache C++ geschrieben wurde"? C++ ist eine kompilierte Sprache, die wird direkt zu Maschinencode verarbeitet.

    Nein, mit C Libraries hast du nur kotzigen C Code in C++, mehr nicht.

    Zum Edit: Nein, da steht nur, dass sie die C Standardlibrary enthält.



  • Flub schrieb:

    aber der ganze umgang mit den verschiedenen dingen wie z.b. strings, ist doch eben, durch sehr effiziente funktionen geregelt, die man genausogut hätte in C schreiben und benutzen kann. Die essentiellen dinge kann man ja mit c

    Nein. Du hast in C keine Klassen, keine Templates und kein RAII. Das sind essentielle Sprachfeatures, die zur Implementierung von std::string verwendet werden.

    Flub schrieb:

    ich glaube nicht, dass ich mit meiner annahme so komplett falsch liege.

    Doch, tust du. C und C++ sind verschiedene Sprachen mit verschiedenen Konzepten und Paradigmen. C++ ist nicht nur sowas wie eine Erweiterung, es ändert die Programmierweise fundamental.



  • okay.
    Wie kann man sich die entwicklung der sprache dann vorstellen?
    also entwickeln, die eigentlich den compiler oder wie kann ich mir das vorstellen?


Log in to reply