Setting union member in structure

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jeff Massung

    Setting union member in structure

    I am having a syntax issue that I hope someone else here knows how to
    rectify...

    I am loading an INI file and have a simple function to load values from
    it. The function is overloaded with the different return types int,
    double or string. A structure is defined:

    typedef struct INI_KEY {
    char strCategory[32];
    char strKey[32];

    union {
    int iDefaultValue;
    double dDefaultValue;
    char strDefaultValue[32];
    } def;
    } INI_KEY;

    In the implementation is a global array of INI_KEY's that list off
    various categories, keys and their default value (the value to return if
    it isn't in the INI):

    const INI_KEY g_keys[] = {
    { "category", "keyInt", 0 },
    { "category", "keyDouble" , 0.0 },
    { "category", "keyString" , "foo" },
    // ...
    };

    The problem I'm having is in the default value of the global array. The
    compiler is trying to convert the double and string values to integers
    and generating compiler errors. I'm sure there is a syntax to tell the
    compiler what member of the union to use, I just don't know it. If it
    makes a difference, I'm using MS VC++ 7.

    --
    Best regards,
    Jeff jma[at]mfire.com
    fah999 เว็บพนันออนไลน์ เว็บตรง ฝากถอนไว ทันสมัย แม่นยำ เว็บพนันออนไลน์ ที่ดีที่สุด เกมเยอะมาก รองรับมือถือได้ทุกรุ่น ไม่ผ่านเอเย่นต์

  • Mike Wahler

    #2
    Re: Setting union member in structure


    "Jeff Massung" <jma@NOSPAM.mfi re.com> wrote in message
    news:vue7e8h7m8 u2fc@corp.super news.com...[color=blue]
    > I am having a syntax issue that I hope someone else here knows how to
    > rectify...
    >
    > I am loading an INI file and have a simple function to load values from
    > it. The function is overloaded with the different return types int,
    > double or string. A structure is defined:
    >
    > typedef struct INI_KEY {
    > char strCategory[32];
    > char strKey[32];
    >
    > union {
    > int iDefaultValue;
    > double dDefaultValue;
    > char strDefaultValue[32];
    > } def;
    > } INI_KEY;
    >
    > In the implementation is a global array of INI_KEY's that list off
    > various categories, keys and their default value (the value to return if
    > it isn't in the INI):
    >
    > const INI_KEY g_keys[] = {
    > { "category", "keyInt", 0 },
    > { "category", "keyDouble" , 0.0 },
    > { "category", "keyString" , "foo" },
    > // ...
    > };
    >
    > The problem I'm having is in the default value of the global array. The
    > compiler is trying to convert the double and string values to integers
    > and generating compiler errors. I'm sure there is a syntax to tell the
    > compiler what member of the union to use,[/color]

    There is not.
    [color=blue]
    > I just don't know it. If it
    > makes a difference, I'm using MS VC++ 7.[/color]

    =============== =============== =============== =============== =========
    ISO/IEC 14882:1998(E)

    8.5.1 Aggregates

    [....]

    15 When a union is initialized with a brace­-enclosed initializer,
    the braces shall only contain an initializer for the first member
    of the union. [Example:

    union u { int a; char* b; };
    u a = { 1 };
    u b = a;
    u c = 1; // error
    u d = { 0, "asdf" }; // error
    u e = { "asdf" }; // error

    --end example] [Note: as described above, the braces around the
    initializer for a union member can be omitted if the union is
    a member of another aggregate. ]
    =============== =============== =============== =============== =========

    -Mike


    Comment

    • Jeff Massung

      #3
      Re: Setting union member in structure

      "Mike Wahler" <mkwahler@mkwah ler.net> wrote in
      news:c5GFb.1651 $lo3.248@newsre ad2.news.pas.ea rthlink.net:
      [color=blue]
      >
      > "Jeff Massung" <jma@NOSPAM.mfi re.com> wrote in message
      > news:vue7e8h7m8 u2fc@corp.super news.com...[color=green]
      >>
      >> const INI_KEY g_keys[] = {
      >> { "category", "keyInt", 0 },
      >> { "category", "keyDouble" , 0.0 },
      >> { "category", "keyString" , "foo" },
      >> // ...
      >> };
      >>
      >> The problem I'm having is in the default value of the global array.
      >> The compiler is trying to convert the double and string values to
      >> integers and generating compiler errors. I'm sure there is a syntax
      >> to tell the compiler what member of the union to use,[/color]
      >
      > There is not.
      >
      > =============== =============== =============== =============== =========
      > ISO/IEC 14882:1998(E)
      >
      > 8.5.1 Aggregates
      >
      > [....]
      >
      > 15 When a union is initialized with a brace­-enclosed initializer,
      > the braces shall only contain an initializer for the first member
      > of the union. [Example:
      >
      > union u { int a; char* b; };
      > u a = { 1 };
      > u b = a;
      > u c = 1; // error
      > u d = { 0, "asdf" }; // error
      > u e = { "asdf" }; // error
      >
      > --end example] [Note: as described above, the braces around the
      > initializer for a union member can be omitted if the union is
      > a member of another aggregate. ]
      > =============== =============== =============== =============== =========
      >
      > -Mike
      >
      >[/color]

      Oh well. Thanks for the quick reply.

      --
      Best regards,
      Jeff jma[at]mfire.com
      fah999 เว็บพนันออนไลน์ เว็บตรง ฝากถอนไว ทันสมัย แม่นยำ เว็บพนันออนไลน์ ที่ดีที่สุด เกมเยอะมาก รองรับมือถือได้ทุกรุ่น ไม่ผ่านเอเย่นต์

      Comment

      Working...