Forum: PC-Programmierung union und struct


von Peter (Gast)


Lesenswert?

Hi Zusammen,
ich habe eine Frage.
Wie ist das zu verstehen, erden die fields Variablen automatisch in das 
array Abgebildet ?
Und die zweite Frage ist wieso 2 2 3 4 ?
array[0] message_type length_high sollte eigentlich 1 sein oder ?

Danke schon mal!
1
#define HEADER_LENGTH 4
2
3
typedef union msg_header
4
  {
5
          unsigned char array[HEADER_LENGTH];
6
          struct
7
          {
8
                  unsigned char message_type : 1;
9
                  unsigned char length_high : 7;
10
                  unsigned char length_low;
11
                  unsigned char command_class;
12
                  unsigned char command_id;
13
          } fields;
14
  } header;
15
16
header hdr;
17
  hdr.fields.message_type =0;
18
  hdr.fields.length_high = 1;
19
  hdr.fields.length_low = 2;
20
  hdr.fields.command_class = 3;
21
  hdr.fields.command_id = 4;
22
    
23
  for( i=0;i<sizeof(header);i++){
24
        printf("%d ",hdr.array[i]);
25
  }

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Peter schrieb:
> array[0] message_type length_high sollte eigentlich 1 sein oder ?

nein, denn das 0.bit ist ja message_type

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Wie ist das zu verstehen, erden die fields Variablen automatisch in das
> array Abgebildet ?

Das ist eine Union. Zwei (oder mehrere) Sichtweisen der gleichen Daten. 
Also: Ja.

> Und die zweite Frage ist wieso 2 2 3 4 ?

Die Frage kann Dir niemand beantworten. Woher sollen wir wissen, was für 
Daten da sinnvoll einzufüllen sind?

> array[0] message_type length_high sollte eigentlich 1 sein oder ?

Ums kurzzufassen: Hä?

von A. H. (ah8)


Lesenswert?

Eine Union ist eigentlich ein Konstrukt, um ein und denselben 
Speicherplatz (nacheinander) für Objekte verschiedenen Typs nutzen zu 
können. Wenn zum Beispiel eine Spalte einer Tabelle in unterschiedlichen 
Zeilen Objekte unterschiedlichen Typs enthalten kann, kann man eine 
Union nehmen ohne mit der Typprüfung des Compilers zu kollidieren. Die 
Union garantiert dann, dass genug Speicher vorhanden ist, um ein Objekt 
vom größten Type aufzunehmen. Die Alternative wären eine Spalte pro Type 
(bzw. eine Spalte mit einer entsprechend große Struct) oder aufwändige 
Casts.

Unions werden allerdings häufig benutzt, um ein Objekt eines Typs im 
Speicher abzulegen (hier ein Struct von Chars) und als eine Objekt eines 
andern Typs wieder auszulesen (hier ein Array von Chars). Sauber ist die 
Sache aber nicht, denn der Standard sagt eindeutig, dass das Ergebnis 
implementierungsabhängig ist. Auch wenn es meistens funktioniert darf 
man sich also nicht wundern, wenn es, abhängig von Compiler und 
Plattform, damit auch mal Probleme gibt.

: Bearbeitet durch User
von A. H. (ah8)


Lesenswert?

Nachdem das gesagt wurde sei noch erwähnt, dass das wahrscheinlich nicht 
Dein Problem ist. Lies mal im C-Buch Deines Vertrauens den Abschnitt 
über Bit-Fields nach, dann erklärt sich das Verhalten von selbst. (Es 
sei nicht vergessen zu erwähnen, dass nahezu alles an Bit-Fields 
implementierungsabhängig ist, also auch nicht gerade die perfekte 
Methode, um Message-Header zusammen zu stellen.)

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.