Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Hector, нет нельзя. Нужно указать элемент объедения, которому присваивается значение -> u.bukva='g';.
У объединения нет такого понятия как значение, есть значение его элементов. Именно значение, а не значения. Программисту нужно следить за тем, с каким элементом сейчас работа в объединении.

union используется преимущественно для экономии памяти.
Так же в качестве возвращаемого параметра функции удобно использовать, как некий интерфейс: если функция будет возвращать новый тип, его достаточно будет указать в объединении.

Например,
возьмем код из второго поста этой темы Поиск текста в файлах
в функции WinMain из всего множества объявлена переменная wcl типа WNDCLASS (это структура) и переменная msg типа MSG (тоже структура). Особенности использования первой таковы, что нужда в ней отпадает (в данном примере в частности) сразу же после использовании в функции RegisterClass. Вторая же напротив, нужна до окончания программы. Было бы логично использовать не нужную больше переменной память, и объединения тут поможет.
Для этого объявляем нечто вроде
Код: Выделить весь код
	union sharMem
	{
		WNDCLASS wcl;
		MSG msg;
	} sM;
и в соответствии с правилами использования элементов объединения используем.
Вместо
Код: Выделить весь код
	wcl.style = 0;
	wcl.lpfnWndProc = WindowFunc;
	wcl.cbClsExtra = 0;
//...
if (!RegisterClass (&wcl))
//...
	while(GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage (&msg);
//...
будет
Код: Выделить весь код
	sM.wcl.style = 0;
	sM.wcl.lpfnWndProc = WindowFunc;
	sM.wcl.cbClsExtra = 0;
//...
if (!RegisterClass (&sM.wcl))
//...
	while(GetMessage(&sM.msg, NULL, 0, 0) > 0)
	{
		TranslateMessage (&sM.msg);
//...

В примере выше использования union сэкономило 28 байт, которые не выделили для переменой типа MSG, так как последняя разместилась в памяти ранее занимаемой переменной типа WNDCLASS (это чуть больше 40 байт). Про такое использование в WinMain объединений поисковик ничего не нашёл. Совет использования его там вычитал в книге Юрова посвященной Ассемблеру.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:26, 18-11-2010 | #2