Forum: PC-Programmierung Unions in C vs. Types in Freepascal/Delphi/Pascal


von kein gast (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

kein gast schrieb:
> das nun auch C sich des Konzeptes von Pascal annähert

Nun? ?

Was genau soll denn hier neu sein?

von Mr.T (Gast)


Lesenswert?

Häh?
C-Unions entsprechen sog. "varianten Records" in Pascal.

von Dirk B. (dirkb2)


Lesenswert?

Mark B. schrieb:
> Was genau soll denn hier neu sein?

Trollversuch am Montag.

von Kaj (Gast)


Lesenswert?

kein gast schrieb:
> das nun
> auch C sich des Konzeptes von Pascal annähert

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

von PittyJ (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

A. S. schrieb:

> Du meinst type punning? Das geht mit Unions auch nicht.

Doch, ab C99 ist das erlaubt - nicht jedoch in C++.

von Rolf M. (rmagnus)


Lesenswert?

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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

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 ;-)

von Jemand (Gast)


Lesenswert?

Rolf M. schrieb:
> Ein Cast
> ist doch viel einfacher.

Type Punning ist mit Casts überhaupt nicht in demselben Maße möglich.

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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.

von Roland F. (rhf)


Lesenswert?

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

von Dumdi D. (dumdidum)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.