mikrocontroller.net

Forum: PC-Programmierung union in struct


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab folgende struct (vom einem Hersteller vorgegeben)
typedef struct DPMCL2_REQ_S
{
DPR_WORD order_id; // in
DPR_DWORD c_ref; // in
union
{
DP_DS_READ_T dp_ds_read;
DP_DS_WRITE_T dp_ds_write;
DP_ALARM_ACK_T dp_alarm_ack;
DP_ENABLE_EVT_T dp_enable_evt;
DP_GET_CFG_T dp_get_cfg;
DP_MCL2_DATA_T dp_mcl2_data;
}req;
} DPMCL2_REQ_T;

mit

typedef struct DP_MCL2_DATA_S
{
DPR_BYTE ident_diag; // --
DPR_BYTE new_slv_add; // --
DPR_BYTE no_add_chg; // --
DPR_WORD ident_number; // --
DPR_WORD poll_timeout; // --
DPR_WORD poll_delay; // --
DPR_BYTE length_s; // inout
DPR_BYTE
data_s[DPR_SLAVE_DATA_SIZE]; // out
} DP_MCL2_DATA_T;

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze wird klarer, wenn man für die union keine anonyme union
nimmt, sondern einen Datentyp spezifiziert und herauszieht:
typedef struct DP_MCL2_DATA_S
{
  DPR_BYTE ident_diag; // --
  DPR_BYTE new_slv_add; // --
  DPR_BYTE no_add_chg; // --
  DPR_WORD ident_number; // --
  DPR_WORD poll_timeout; // --
  DPR_WORD poll_delay; // --
  DPR_BYTE length_s; // inout
  DPR_BYTE data_s[DPR_SLAVE_DATA_SIZE]; // out
} DP_MCL2_DATA_T;

typedef union DP_UNION_U
{
  DP_DS_READ_T    dp_ds_read;
  DP_DS_WRITE_T   dp_ds_write;
  DP_ALARM_ACK_T  dp_alarm_ack;
  DP_ENABLE_EVT_T dp_enable_evt;
  DP_GET_CFG_T    dp_get_cfg;
  DP_MCL2_DATA_T  dp_mcl2_data;
} DP_UNION_T;

typedef struct DPMCL2_REQ_S
{
  DPR_WORD   order_id; // in
  DPR_DWORD  c_ref; // in
  DP_UNION_T req;
} DPMCL2_REQ_T;

DPMCL2_REQ_T xy;

und jetzt verfolge einfach den Weg von xyx bis zum length_s

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DPMCL2_REQ_T anforderung;
...
...

cout<<anforderung.req.dp_mcl2data.length_s;

ergibt:

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

Autor: Gast (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Compiler Visual C++ 6.0
#define DPR_WORD int
#define DPR_DWORD int
#define DP_DS_READ_T int
#define DP_DS_WRITE_T int
#define DP_ALARM_ACK_T int
#define DP_ENABLE_EVT_T int
#define DP_GET_CFG_T int
#define DPR_BYTE int
#define DPR_SLAVE_DATA_SIZE 5


typedef struct DP_MCL2_DATA_S
{
DPR_BYTE ident_diag; // --
DPR_BYTE new_slv_add; // --
DPR_BYTE no_add_chg; // --
DPR_WORD ident_number; // --
DPR_WORD poll_timeout; // --
DPR_WORD poll_delay; // --
DPR_BYTE length_s; // inout
DPR_BYTE
data_s[DPR_SLAVE_DATA_SIZE]; // out
} DP_MCL2_DATA_T;

typedef struct DPMCL2_REQ_S
{
DPR_WORD order_id; // in
DPR_DWORD c_ref; // in
union
{
DP_DS_READ_T dp_ds_read;
DP_DS_WRITE_T dp_ds_write;
DP_ALARM_ACK_T dp_alarm_ack;
DP_ENABLE_EVT_T dp_enable_evt;
DP_GET_CFG_T dp_get_cfg;
DP_MCL2_DATA_T dp_mcl2_data;
}req;
} DPMCL2_REQ_T;


DPMCL2_REQ_T xy;

int main()
{
  xy.req.dp_mcl2_data.length_s = 5;
}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
>
> DPMCL2_REQ_T anforderung;
> ...
> ...
> 
> cout<<anforderung.req.dp_mcl2data.length_s;
> 
>
> 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich nutze den mingw Compiler zusammen mit DevC++...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aua klarer Fall von betriebsblind...ich guck morgen auf der Arbeit 
nochmal...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht... Vielen Dank

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.