Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 07.06.2010, 14:49   #1
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию объеденение типов union

Пишу одну вещь, дошел до этапа где присваивал пременным в структуре, объеденные в union, дефолтные значения. И глаза на лоб повылазили, когда после присвоения значения следующей переменной в структуре, все типы в union начинали менять значения Оо. Убрал union и все стало нормально. Проблема в том, что в заголовочном файле структур на 10 кб, а так же готовая реализция их записи в файл. Из-за этих union мне прийдеться перелапатить кучу кода.
Скажите мне кто-то, что происходит с переменными, объединеными в union? =\

Код:
template <class T>
struct IRR_VECTOR3D{
	T x,y,z;
};

typedef struct IrrAnimation{
	int type;

	union Circle{
		IRR_VECTOR3D<float> center;
		float radius, speed;
		IRR_VECTOR3D<float> direction;
		float startPosition, radiusEllipsoid;
	}CIRCLE;
};






подпись

Последний раз редактировалось liljon; 07.06.2010 в 14:55.
liljon вне форума
Старый 07.06.2010, 15:11   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от liljon Посмотреть сообщение
Скажите мне кто-то, что происходит с переменными, объединеными в union? =\
Вы просто не умеете их готовить.
В данном случае получается, что в одной области памяти записаны следующие данные: center.x, radius, speed, direction.x, startPosition, radiusEllipsoid.
В следующих 4-х байтах хранятся center.y и direction.y, ну и дальше соответственно center.z и direction.z.
Таким образом, меняем радиус и автоматически получаем неверные координаты центра, скорости и т.д.
pu4koff вне форума
Старый 07.06.2010, 15:43   #3
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

как вы определили что именно в таком порядке они распологаються в памяти? у меня в IrrAnimation еще штуки 4 юниона. Недобная эта штука...
подпись
liljon вне форума
Старый 07.06.2010, 16:32   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от liljon Посмотреть сообщение
как вы определили что именно в таком порядке они распологаються в памяти?
Поля структур располагаются в памяти в порядке их описания.
Код:
struct A
{
  int a, b;
}
здесь член a будет храниться со смещением 0, относительно начала структуры, а b - со смещением 4 байта (размер a).
В случае же с union, все его поля располагаются со смещением 0, т.е. в одной области. При этом размер всего union'a равняется размеру самого объемного его члена.
Запись такого вида:
Код:
union
{
  int a, b;
}
равнозначна записи:
Код:
union
{
  int a;
  int b;
}
т.е. члены никак не группируются при объявлении в одной строке. В обоих случаях a будет храниться в той же ячейке памяти, что и b.
Цитата:
Сообщение от liljon Посмотреть сообщение
у меня в IrrAnimation еще штуки 4 юниона. Недобная эта штука...
Очень даже удобная. Просто её нужно грамотно использовать. наиболее удачное её применение: создание "псевдонимов" для более удобной обработки данных. Возьмем такую штуку, как координата в 3D пространстве. В одном случае удобно использовать имена осей (x, y, z), а в другом - обращение по индексу (0, 1 ,2). При помощи union'a это легко решается:
Код:
union Coord3d
{
  struct
  {
    int x, y, z;
  }
  int a[3];
}
Только не забывайте про выравнивания в структурах:
Код:
struct
{
  int a;    // 4 байта
  char b;  // 4 байта
  bool c;  // 4 байта
}
По умолчанию, компилятор выравнивает данные по 4 байта для увеличения скорости. Поэтому char вполне может занимать ячейку 4 байта, хотя по идее должен занимать 1 байт
pu4koff вне форума
Старый 07.06.2010, 16:38   #5
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

за выравнивание мы знаем, а за юнионы вот узнали теперь... спасибо вам огромное
подпись
liljon вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объеденение книг king13 Microsoft Office Excel 7 16.10.2009 14:57
Объеденение несколький текстовых переменных в одну(Basik) П@вел Помощь студентам 0 21.07.2009 14:36
объеденение даты Alexi Компоненты Delphi 3 27.04.2009 15:32
Объеденение 2-х таблиц Stanislav БД в Delphi 3 28.07.2008 09:44
Union NeiL Общие вопросы C/C++ 1 30.05.2008 23:45