C++ Union - Verständnisproblem



  • 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?



  • Nein, die Entwickeln den ISO C++ Standard. Die Compiler werden von Compilerbauern gemacht. (Nicht zu verwechseln mit Gemüsebauern o.ä.)

    Btw, weil ich gerade Langeweile habe, etwas, von dem du mir zeigen kannst, wie man es in C löst. 😃
    http://ideone.com/bvouF
    Ich vergaß, in C gibt es ja keine Funktionen in structs.



  • 314159265358979 schrieb:

    Btw, weil ich gerade Langeweile habe, etwas, von dem du mir zeigen kannst, wie man es in C löst. 😃
    http://ideone.com/bvouF
    Ich vergaß, in C gibt es ja keine Funktionen in structs.

    Das ist keine faire Anfrage, scheint mir. Da werden in C++ Probleme gelöst, die man ohne C++ nicht hätte. Wenn Du was vergleichen willst, dann gib den Zweck des ganzen Programms an.

    Oder um es zu parodieren:

    Btw, weil ich gerade Langeweile habe, etwas, von dem du mir zeigen kannst, wie man es in C löst. 😃

    void killCurrentThreadAndUnwindStackAndDestuctAllLocalObjectsCloseFilesAndSoOn()
    {
      return throw sizeof 0e0;
    }
    


  • Flub schrieb:

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

    also es war einmal eine programmiersprache. sie wurde C genannt. C war sehr sehr leistungsfähig. die meisten menschen konnten C nicht lesen.

    anfang der 80er jahre kam ein prinz, prinz bjarne von stroustrop, der sagte sich: " C ist ja gut und schön aber, das konzept der objekt orientierung wie bei smalltalk finde ich sehr toll. ich glaube ich schreibe mir das für C"
    und so entwickelte er eine neue programmiersprache die auf C basierte...

    heute ist es halt so geregelt, dass sich ein standardisierungskommitee zusammensetzt und entscheidet was für c++ sinnvoll wäre und wie gewisse sachen einfaach geregelt sein sollen.
    dann kommen firmen an und nehmen dieses blatt mit den ganzen vorgaben als grundlage für ihren eigenen compiler den sie nun entwickeln
    dann entwickeln sie quasi einen compiler der diese standardisierte sprache versteht, jedoch hat jeder compiler hersteller so seine eigenheiten was abwärtskompatiblität, syntax usw. angeht, sprich komplett einheitlich sind die ganzen c++ compiler nicht (sieht man ja am kommenden standard wiedermal, lambda expressions zum Beispiel werden von manchen schon unterstützt von adneren noch nicht)
    aber im grossen und ganzen sind das kleinere unterschiede die zwar beachtenswert sind aber nicht gravierend

    ...und in ein paar jahren (wenn er [hoffendlich] nicht gestorben ist) trifft sich prinz bjarne wieder mit seinen freunden und entscheidet über den übernächsten C++ standard.


Anmelden zum Antworten