Knepig union-initialisering i C++

Permalänk
Hedersmedlem

Knepig union-initialisering i C++

Jag sitter med en elakartad initialisering av en union i C++. Syftet är att initialisera en datastruktur som ska kunna läsas antingen som en array av bytes eller en array av UINT64.

Detta kompilerar inte.

Finns det något sätt att få detta att fungera utan att behöva plocka bort const och fylla i skiten för hand?

Deklaration i a.h:

class a { typedef union t_TemplateRepresentation { T_SBYTE Bytes[9][16]; T_UINT64 QWords[9][2]; }t_TemplateRepresentation; static const t_TemplateRepresentation Template; ... }

Initialisering i a.cpp:

const a::t_TemplateRepresentation a::Template = {.Bytes = {-5, -3, -3, -3, -3, -3, -5, -7, -9, 0, 0, 0, 0, 0, 0, 0}, {-3, -2, -1, -1, -1, -2, -3, -3, -7, 0, 0, 0, 0, 0, 0, 0}, {-2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0}, { 0, +1, +2, +2, +2, +1, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0}, {+1, +2, +2, +3, +2, +2, +1, -2, -3, 0, 0, 0, 0, 0, 0, 0}, { 0, +1, +2, +2, +2, +1, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0}, {-2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0}, {-3, -2, -1, -1, -1, -2, -3, -3, -7, 0, 0, 0, 0, 0, 0, 0}, {-5, -3, -3, -3, -3, -3, -5, -7, -9, 0, 0, 0, 0, 0, 0, 0}, };

Edit: Fick det precis att funka i Codewarrior, men det måste funka i VC 2005 också. Har uppdaterat koden

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."

Permalänk
Medlem

const a::t_TemplateRepresentation a::Template = { -5, -3, -3, -3, -3, -3, -5, -7, -9, 0, 0, 0, 0, 0, 0, 0, -3, -2, -1, -1, -1, -2, -3, -3, -7, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0, 0, +1, +2, +2, +2, +1, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0, +1, +2, +2, +3, +2, +2, +1, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, +1, +2, +2, +2, +1, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0, -3, -2, -1, -1, -1, -2, -3, -3, -7, 0, 0, 0, 0, 0, 0, 0, -5, -3, -3, -3, -3, -3, -5, -7, -9, 0, 0, 0, 0, 0, 0, 0, };

Verkar fungera i g++.
C/C++ defaultar till att initiera första elementet i en union, däremot varför det inte ska skrivas som du gjorde, med arrayer av arrayer vettefasen.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Hedersmedlem

Tack för svaret, att det funkar i två så olika kompilatorer som g++ och CodeWarrior antyder att det antingen är VC++ 2005 som suger, eller att någon extra konformitet måste aktiveras separat.

Den vidare frågan kan då formuleras som ifall det finns några alternativ som måste ställas för att VC++ ska svälja det.

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."

Permalänk
Hedersmedlem

Problemet är nu löst:

I den 3-dimensionella varianten, som jag utelämnade pga usel läsbarhet krävdes 3 par av omgivande "{}".

const a::t_TemplateRepresentation a::Template =
{
{
{-5, -3, -3, -3, -3, -3, -5, -7, -9, 0, 0, 0, 0, 0, 0, 0},
{-3, -2, -1, -1, -1, -2, -3, -3, -7, 0, 0, 0, 0, 0, 0, 0},
{-2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0},
{ 0, +1, +2, +2, +2, +1, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0},
{+1, +2, +2, +3, +2, +2, +1, -2, -3, 0, 0, 0, 0, 0, 0, 0},
{ 0, +1, +2, +2, +2, +1, 0, -3, -3, 0, 0, 0, 0, 0, 0, 0},
{-2, 0, 0, 0, 0, 0, -2, -3, -3, 0, 0, 0, 0, 0, 0, 0},
{-3, -2, -1, -1, -1, -2, -3, -3, -7, 0, 0, 0, 0, 0, 0, 0},
{-5, -3, -3, -3, -3, -3, -5, -7, -9, 0, 0, 0, 0, 0, 0, 0},
}
};

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."

Permalänk
Medlem

Länge sen man såg något som använder sig av unioner.

Vad är det för spännande du bygger?

Permalänk
Hedersmedlem

Det är ett embedded-system programmerat i MISRA-Konform C++. Det innebär ett hundratal mer eller mindre begripliga inskränkningar, speciellt vad gäller typomvandlingar och pekaranvändning. Den optimerade embedded-koden måste vara så lik referensimplementationen som möjligt, och den senare måste vara bitexakt på alla plattformar. Unioner är den minst otillåtna metoden för att bearbeta data i olika format.

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."