Как правильно инициализировать объединения?
От: Аноним  
Дата: 29.01.08 12:35
Оценка:
Собственно сабж.

Если не сложно, то на примере
union LARGE_INTEGER {  
    struct {
        DWORD LowPart;  
        LONG  HighPart; 
    };
    LONGLONG QuadPart;
}; 

LARGE_INTEGER value = {???};
Re: Как правильно инициализировать объединения?
От: Bell Россия  
Дата: 29.01.08 12:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Собственно сабж.


А>Если не сложно, то на примере

А>
А>union LARGE_INTEGER {  
А>    struct {
А>        DWORD LowPart;  
А>        LONG  HighPart; 
А>    };
А>    LONGLONG QuadPart;
А>}; 

А>LARGE_INTEGER value = {???};
А>


Во-первых, в объединении не хватает переменной:
union LARGE_INTEGER {  
    struct {
        DWORD LowPart;  
        LONG  HighPart; 
    } dblPart;
    LONGLONG QuadPart;
};


Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так:
LARGE_INTEGER value = {{1, 1}};

или более коротко:
LARGE_INTEGER value = {1, 1};


Но ИМХО первый способ выразительнее.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как правильно инициализировать объединения?
От: Аноним  
Дата: 29.01.08 13:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Во-первых, в объединении не хватает переменной:

Странно, но и без переменной все компилится

B>Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так:

B>...
B>Но ИМХО первый способ выразительнее.
Спасибо. Собственно меня и интересовало как можно инициализировать второе поле
Re[2]: Как правильно инициализировать объединения?
От: Аноним  
Дата: 29.01.08 13:05
Оценка:
Здравствуйте, Bell, Вы писали:

Еще один вопрос про
B>LARGE_INTEGER value = {{1, 1}};
B>LARGE_INTEGER value = {1, 1};

Правильно ли, по примеру массивов (если нужно инициализировать нулем), инициализировать так:
LARGE_INTEGER value = {0};

или даже может так:

LARGE_INTEGER value = {};

Re[3]: Как правильно инициализировать объединения?
От: Bell Россия  
Дата: 29.01.08 13:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Bell, Вы писали:


B>>Во-первых, в объединении не хватает переменной:

А>Странно, но и без переменной все компилится
VC7.1 действительно компилит, а вот Комо — нет.

B>>Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так:

B>>...
B>>Но ИМХО первый способ выразительнее.
А>Спасибо. Собственно меня и интересовало как можно инициализировать второе поле
Если имеется ввиду поле QuadPart — то перенеси его на первое место, и будет тебе счастье:

LARGE_INTEGER value = {1000000000000};
Любите книгу — источник знаний (с) М.Горький
Re[3]: Как правильно инициализировать объединения?
От: Bell Россия  
Дата: 29.01.08 13:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Еще один вопрос про

А>
B>>LARGE_INTEGER value = {{1, 1}};
B>>LARGE_INTEGER value = {1, 1};
А>

А>Правильно ли, по примеру массивов (если нужно инициализировать нулем), инициализировать так:
А>
А>LARGE_INTEGER value = {0};

А>или даже может так:

А>LARGE_INTEGER value = {};
А>

А>

Да.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Как правильно инициализировать объединения?
От: Аноним  
Дата: 29.01.08 13:47
Оценка:
Здравствуйте, Bell, Вы писали:

вот у меня такой вопрос есть union и когда я иницализирую LARGE_INTEGER u = {{1,3}}; то у меня переменная long_second; инизиализируется значением 1? если я меняю тип long на допустим double то запис. какой то мусор или это немусор(6.365987375366e-314#DEN)

union LARGE_INTEGER
{
    struct 
    {
        int i_int;
        long  long_first;
    }dbPart;
    long long_second;
};
Re[5]: Как правильно инициализировать объединения?
От: Bell Россия  
Дата: 29.01.08 14:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>union LARGE_INTEGER
А>{
А>    struct 
А>    {
А>        int i_int;
А>        long  long_first;
А>    }dbPart;
А>    long long_second;
А>};
А>


А>вот у меня такой вопрос есть union и когда я иницализирую LARGE_INTEGER u = {{1,3}}; то у меня переменная long_second; инизиализируется значением 1?

Вообще говоря нет. Для данного примера можно гарантировать, что dbPart.i_int == 1, и dbPart.long_first == 3. Если представление long и int совпадает, то обе переменные i_int и long_second имеют один и тот же адрес и размер, и dbPart.i_int == long_second == 1


А>...если я меняю тип long на допустим double то запис. какой то мусор или это немусор(6.365987375366e-314#DEN)

Размер int и double не совпадает, поэтому получается то, что получается.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Как правильно инициализировать объединения?
От: Аноним  
Дата: 30.01.08 10:24
Оценка:
Здравствуйте, Bell, Вы писали:

А>>
А>>LARGE_INTEGER value = {0};
А>>LARGE_INTEGER value = {};
А>>


а что означает в таких случаях опущенная инициализация членов структуры?
(т.е. каким образом в привиденных примерах инициализируются опущенные члены структуры)

смотрел стандарт, смотрел и не нашел
Re[5]: Как правильно инициализировать объединения?
От: Bell Россия  
Дата: 30.01.08 10:57
Оценка: 31 (3)
Здравствуйте, Аноним, Вы писали:


А>а что означает в таких случаях опущенная инициализация членов структуры?

А>(т.е. каким образом в привиденных примерах инициализируются опущенные члены структуры)

А>смотрел стандарт, смотрел и не нашел



8.5.1/7
If there are fewer initializers in the list than there are members in the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5). [Example:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form
int(), that is, 0. ]



8.5/5
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized

Любите книгу — источник знаний (с) М.Горький
Re[4]: Как правильно инициализировать объединения?
От: Аноним  
Дата: 31.01.08 13:53
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Bell, Вы писали:


B>>>Во-первых, в объединении не хватает переменной:

А>>Странно, но и без переменной все компилится
B>VC7.1 действительно компилит, а вот Комо — нет.

B>>>Что касается инициализации, то инициализировать можно только первый член объединения (8.5.1/15), и делать это можно так:

B>>>...
B>>>Но ИМХО первый способ выразительнее.
А>>Спасибо. Собственно меня и интересовало как можно инициализировать второе поле
B>Если имеется ввиду поле QuadPart — то перенеси его на первое место, и будет тебе счастье:


Мне кажется более правильно сделать инициализацию через конструтор:

union LARGE_INTEGER {  
    struct {
        DWORD LowPart;  
        LONG  HighPart; 
    } dblPart;
    LONGLONG QuadPart;
    LARGE_INTEGER(LONGLONG val = 0) : QuadPart(val) {}
    LARGE_INTEGER(DWORD val1, LONG  val2)
    {
      dblPart.LowPart = val1; dblPart.HighPart = val2;
    }
}; 
LARGE_INTEGER value(10000000);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.