Forum: PC-Programmierung union in struct


von Gast (Gast)


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?

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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

von Gast (Gast)


Lesenswert?

1
DPMCL2_REQ_T anforderung;
2
...
3
...
4
5
cout<<anforderung.req.dp_mcl2data.length_s;

ergibt:

'union DPC1_REQ_S::<anonymous>' has no member named 'dp_mcl2data'

von Gast (Gast)


Lesenswert?

Kann die Structs nicht ändern... (kommen vom Hersteller)

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Gast (Gast)


Lesenswert?

ich nutze den mingw Compiler zusammen mit DevC++...

von Gast (Gast)


Lesenswert?

aua klarer Fall von betriebsblind...ich guck morgen auf der Arbeit 
nochmal...

von Gast (Gast)


Lesenswert?

geht... Vielen Dank

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.