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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von kein gast (Gast)


Bewertung
-5 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Häh?
C-Unions entsprechen sog. "varianten Records" in Pascal.

von Dirk B. (dirkb2)


Bewertung
2 lesenswert
nicht lesenswert
Mark B. schrieb:
> Was genau soll denn hier neu sein?

Trollversuch am Montag.

von Kaj (Gast)


Bewertung
2 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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. (achs)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (achs)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.