union in struct

Gast #718845
Lesenswert?

Hallo,

ich hab folgende struct (vom einem Hersteller vorgegeben)
1
typedef struct DPMCL2_REQ_S
2
{
3
DPR_WORD order_id; // in
4
DPR_DWORD c_ref; // in
5
union
6
{
7
DP_DS_READ_T dp_ds_read;
8
DP_DS_WRITE_T dp_ds_write;
9
DP_ALARM_ACK_T dp_alarm_ack;
10
DP_ENABLE_EVT_T dp_enable_evt;
11
DP_GET_CFG_T dp_get_cfg;
12
DP_MCL2_DATA_T dp_mcl2_data;
13
}req;
14
} DPMCL2_REQ_T;
15

16
mit
17

18
typedef struct DP_MCL2_DATA_S
19
{
20
DPR_BYTE ident_diag; // --
21
DPR_BYTE new_slv_add; // --
22
DPR_BYTE no_add_chg; // --
23
DPR_WORD ident_number; // --
24
DPR_WORD poll_timeout; // --
25
DPR_WORD poll_delay; // --
26
DPR_BYTE length_s; // inout
27
DPR_BYTE
28
data_s[DPR_SLAVE_DATA_SIZE]; // out
29
} DP_MCL2_DATA_T;

Wie kann ich jetzt z.B. auf das Element length_s zugreifen?
#718863
Lesenswert?

Ausgehend von der Variable den kompletten Pfad bis
zum Member angeben.

Du hast eine Variable xy

DPMCL2_REQ_T xy;

dieses xy, besteht aus:  order_id, c_ref und der union, wobei die
union den Namen req trägt. Du brauchst was aus der union, also:


    xy.req

Innerhalb der union, brauchst du wieder den Member dp_mcl2_data, denn
dort ist letztendlich length_s enthalten. Also


    xy.req.dp_mcl2_data

und von dort wiederrum das length_s. Also:

    xy.req.dp_mcl2_data.length_s
#718867
Lesenswert?

Das ganze wird klarer, wenn man für die union keine anonyme union
nimmt, sondern einen Datentyp spezifiziert und herauszieht:
1
typedef struct DP_MCL2_DATA_S
2
{
3
  DPR_BYTE ident_diag; // --
4
  DPR_BYTE new_slv_add; // --
5
  DPR_BYTE no_add_chg; // --
6
  DPR_WORD ident_number; // --
7
  DPR_WORD poll_timeout; // --
8
  DPR_WORD poll_delay; // --
9
  DPR_BYTE length_s; // inout
10
  DPR_BYTE data_s[DPR_SLAVE_DATA_SIZE]; // out
11
} DP_MCL2_DATA_T;
12

13
typedef union DP_UNION_U
14
{
15
  DP_DS_READ_T    dp_ds_read;
16
  DP_DS_WRITE_T   dp_ds_write;
17
  DP_ALARM_ACK_T  dp_alarm_ack;
18
  DP_ENABLE_EVT_T dp_enable_evt;
19
  DP_GET_CFG_T    dp_get_cfg;
20
  DP_MCL2_DATA_T  dp_mcl2_data;
21
} DP_UNION_T;
22

23
typedef struct DPMCL2_REQ_S
24
{
25
  DPR_WORD   order_id; // in
26
  DPR_DWORD  c_ref; // in
27
  DP_UNION_T req;
28
} DPMCL2_REQ_T;
29

30
DPMCL2_REQ_T xy;

und jetzt verfolge einfach den Weg von xyx bis zum length_s
#719024
Lesenswert?

Compiler Visual C++ 6.0
1
#define DPR_WORD int
2
#define DPR_DWORD int
3
#define DP_DS_READ_T int
4
#define DP_DS_WRITE_T int
5
#define DP_ALARM_ACK_T int
6
#define DP_ENABLE_EVT_T int
7
#define DP_GET_CFG_T int
8
#define DPR_BYTE int
9
#define DPR_SLAVE_DATA_SIZE 5
10

11

12
typedef struct DP_MCL2_DATA_S
13
{
14
DPR_BYTE ident_diag; // --
15
DPR_BYTE new_slv_add; // --
16
DPR_BYTE no_add_chg; // --
17
DPR_WORD ident_number; // --
18
DPR_WORD poll_timeout; // --
19
DPR_WORD poll_delay; // --
20
DPR_BYTE length_s; // inout
21
DPR_BYTE
22
data_s[DPR_SLAVE_DATA_SIZE]; // out
23
} DP_MCL2_DATA_T;
24

25
typedef struct DPMCL2_REQ_S
26
{
27
DPR_WORD order_id; // in
28
DPR_DWORD c_ref; // in
29
union
30
{
31
DP_DS_READ_T dp_ds_read;
32
DP_DS_WRITE_T dp_ds_write;
33
DP_ALARM_ACK_T dp_alarm_ack;
34
DP_ENABLE_EVT_T dp_enable_evt;
35
DP_GET_CFG_T dp_get_cfg;
36
DP_MCL2_DATA_T dp_mcl2_data;
37
}req;
38
} DPMCL2_REQ_T;
39

40

41
DPMCL2_REQ_T xy;
42

43
int main()
44
{
45
  xy.req.dp_mcl2_data.length_s = 5;
46
}

Compiliert ohne Warnung/Error
Ich wüsste auch nicht, warum es das nicht tun soll.
#719030
Lesenswert?

Gast wrote:
>
1
> DPMCL2_REQ_T anforderung;
2
> ...
3
> ...
4
> 
5
> cout<<anforderung.req.dp_mcl2data.length_s;
6
>
>
> ergibt:
>
> 'union DPC1_REQ_S::<anonymous>' has no member named 'dp_mcl2data'

Klar.
Der Member heist ja auch 'dp_mcl2_data' und nicht ''dp_mcl2data'
Man beachte die Anzahl der Underscores.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren