Ich schaue mir gerade die Unions in C an und sehe mit Freude,das nun
auch C sich des Konzeptes von Pascal annähert, mit einer Verbesserung.
Tatsächlich wird bei Diskussioneen C vs. Pascal immer der Nachteil von
C von vielen C Porgrammierern als großer Vorteil
gefeiert..interessanterweise werde aber mit vielen Neuerungen in C diese
so hochgefeierten "Vorteile" entschärft.
Bei den Unions z.B. das die Pointerarien in C nicht mehr zwingend
erforderlich sind.
Es gibt natürlich auch Unterschiede zu Types in Pascal..logisch..Unions
sollen ja auch ein komplett neues Konzept sein, was ja auch nicht
schlecht sein muss.
https://www.learn-c.org/de/Unions
kein gast schrieb:> das nun> auch C sich des Konzeptes von Pascal annähertkein gast schrieb:> interessanterweise werde aber mit vielen Neuerungen in C
Bitte was? Neuerungen in C? Unions? Hast du die letzten 40 Jahre
geschlafen, oder wie?
Also ich dachte, das unions bereits im Original K&R drin sind.
Mein Buch liegt aber zuhause, da kann ich nicht nachschlagen.
Wer das aber jetzt erst merkt, der muß wirklich sehr lange geschlafen
haben, oder ein sehr langsame Lesegeschwindigkeit besitzen.
kein gast schrieb:> Bei den Unions z.B. das die Pointerarien in C nicht mehr zwingend> erforderlich sind.
Du meinst type punning? Das geht mit Unions auch nicht.
kein gast schrieb:> Tatsächlich wird bei Diskussioneen C vs. Pascal immer der Nachteil von> C von vielen C Porgrammierern als großer Vorteil> gefeiert..
Was ist denn "der Nachteil von C"?
> interessanterweise werde aber mit vielen Neuerungen in C diese> so hochgefeierten "Vorteile" entschärft.
Was für Neuerungen? Wenn du tatsächlich das Type Punning meinen
solltest: Das ist seit 20 Jahren in C erlaubt.
> Bei den Unions z.B. das die Pointerarien in C nicht mehr zwingend> erforderlich sind.
Was meinst du mit "Pointerarien"?
Nop schrieb:> A. S. schrieb:>>> Du meinst type punning? Das geht mit Unions auch nicht.>> Doch, ab C99 ist das erlaubt - nicht jedoch in C++.
Allerdings hab ich nie verstanden, was da so toll dran sein soll. Warum
soll ich mir extra einen neuen Typ definieren, da meine Werte rein und
wieder rauskopieren, nur um da eine Typumwandlung zu machen? Ein Cast
ist doch viel einfacher.
kein gast schrieb:> Ich schaue mir gerade die Unions in C an und sehe mit Freude,das nun> auch C sich des Konzeptes von Pascal annähert, mit einer Verbesserung.
Ja, endlich ist es soweit: Es gibt ab sofort (d.h. seit ca. 45 Jahren)
Unions auch in C. In Pascal (dort Variant-Records genannt) gibt es sie
allerdings schon ein paar Jahre länger.
In Ur-C von 1972 gab es weder Structs noch Unions. Die Structs kamen
1973, die Unions noch etwas später. Pascal hatte die Variant-Records
schon seit Beginn, also ca. 1970.
Man fragt sich natürlich, warum Ritchie mit der Einführung der Unions so
lange gewartet hat, obwohl er sie aus Algol 68 (auf dem C teilweise
basiert) bereits gekannt haben musste.
Eine Erklärung könnte die folgende sein:
(Untagged) Unions verleiten zu Schmuddeloptimierungen in Form von
Type-Punning, wofür sie eigentlich nicht gedacht sind. Vielleicht wollte
Ritchie seine Nutzer von solch zweifelhaften Techniken abhalten. Nachdem
er aber gesehen hatte, dass sogar Pascal, das damals als der neue Weg
zur sauberen Programmierung angepriesen wurde, solche Dinge anstandslos
zuließ, konnte er die Unions ruhigen Gewissens auch in C einführen ;-)
Yalu X. schrieb:> Vielleicht wollte> Ritchie seine Nutzer von solch zweifelhaften Techniken abhalten
Ich weiß es zwar auch nicht, wieso und warum, ich halte aber die
Erklärung eines einfachen Weges zur Polymorphie für möglich. Der
Diskriminator ist allerdings extern.
Rolf M. schrieb:> Allerdings hab ich nie verstanden, was da so toll dran sein soll. Warum> soll ich mir extra einen neuen Typ definieren, da meine Werte rein und> wieder rauskopieren, nur um da eine Typumwandlung zu machen?
Macht man ja nicht nur eigens wegen der Typumwandlung. Stell Dir vor, Du
hast ein struct aus 4 Byte-Typen. Wenn Du das in eine Union mit uint32_t
packst, kannst Du einige Operationen wie Nullen, Kopieren, Vergleichen
mit fest definierten Konstanten, Ausmaskieren und Vergleichen nur
bestimmter Bytes usw. mit einer 32bit-Operation über den uint32_t
machen.
Insbesondere wird das struct dann auch immer ein dafür passendes
Alignment haben. Muß man natürlich mit der Endianess aufpassen bzw. die
Konstanten ebenfalls über das Byte-struct definieren.
> Ein Cast ist doch viel einfacher.
Type punning durch pointer casting geht in vielen Fällen gar nicht, da
undefined behaviour, und direkt casten kannst Du nur Basisdatentypen.
Hallo,
PittyJ schrieb:> Also ich dachte, das unions bereits im Original K&R drin sind.
Ist so (deutsche Ausgabe von 1983, die wiederum die Übersetzung der
englischen Ausgabe von 1977 ist).
rhf
Roland F. schrieb:> Ist so (deutsche Ausgabe von 1983, die wiederum die Übersetzung der> englischen Ausgabe von 1977 ist).>> rhf
Ja, aber die m.M.n. nutzlose Variante. Wenn man einen Unionmember setzt
darf man nicht durch den anderen drauf zu greifen. (Ich sage nutzlos, da
ich mir ausser type punning eigentlich keine andere Anwendung für unions
vorstellen kann)
Und insbesondere wenn ma C als 'aufgepimpten' Assembler betrachtet: das
AX register setzt sich aus AH und AL zusammen (beim x86). Dies zu
modellieren passt perfekt auf type punning mit union. D.h. z.B. für
einen Prozessoremulator.
Dumdi D. schrieb:> (Ich sage nutzlos, da ich mir ausser type punning eigentlich keine> andere Anwendung für unions vorstellen kann)
Ja doch: du hast Telegramme, Kommandos oder NV-daten von n Bytes, die Du
(per ptr) übergibst, aber je nach Typ mit unterschiedlichen Inhalten.