![]() |
Запись значения в объединение
По Си проходим тему объединения, возник вопрос, для того, чтобы ввести значение объединения, надо ли предварительно знать тип этого значения? т. е. можно ли делать так
Код:
union mnz Код:
u='g'; Код:
u.bukva='g'; |
Hector, нет нельзя. Нужно указать элемент объедения, которому присваивается значение -> u.bukva='g';.
У объединения нет такого понятия как значение, есть значение его элементов. Именно значение, а не значения. Программисту нужно следить за тем, с каким элементом сейчас работа в объединении. union используется преимущественно для экономии памяти. Так же в качестве возвращаемого параметра функции удобно использовать, как некий интерфейс: если функция будет возвращать новый тип, его достаточно будет указать в объединении. В примере выше использования union сэкономило 28 байт, которые не выделили для переменой типа MSG, так как последняя разместилась в памяти ранее занимаемой переменной типа WNDCLASS (это чуть больше 40 байт). Про такое использование в WinMain объединений поисковик ничего не нашёл. Совет использования его там вычитал в книге Юрова посвященной Ассемблеру. |
хорошо, а существует способ проверить при выводе, какое сейчас значение у объединения, допустим мне нужно вывести значение u, но как узнать в данный момент там цифра (int) или буква (char)?
|
А если так?
Код:
#include <string.h> |
ganselo, не совсем понял, можно комментарии (только учусь :) )
|
Hector, мне такой не известен, но для мониторинга\отладки можно через printf "позванивать" содержимое элементов объединения - printf("chislo - %i\tbukva-%c", u.chislo, u.bukva); и по выводу ориентироваться. Но правильнее смотреть по коду, к какому элементу последний раз было присваивание.
ganselo, смущает строчка memset(&t, 'g', sizeof(t) + sizeof(int)); при установки памяти выйдем на sizeof(int)) за пределы объединения? Размер объединения в данном случаи int (по наибольшему размеру типа элемента объединения). |
Цитата:
Необходимо обеспечить выполнение следующих действий (операций): 1) ввод информации в массив структур; 2) просмотр на экране содержимого массива структур в виде таблицы; 3) одним из элементов структуры является объединение; Исходные данные: Меню
т. е. когда я буду выводить данные, как мне определить какое из возможных значений объединения надо отображать? |
Hector в таком случаи в структуре нужно завести ещё одну переменную, определённую как enum, для того что б контролировать к какому полю объединения было обращение.
Код:
enum PlatterKPD {CALORIE, UTILITY}; |
Время: 23:53. |
Время: 23:53.
© OSzone.net 2001-