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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 18:33   #1
HeLiO
Пользователь
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию Struct, union

Сразу оговорюсь - в с++ я недавно программирую, поэтому извините за возможно тупой вопрос.

Есть такое определение типов :
struct u16bytes
{
uint8_t low; //!< byte member
uint8_t high; //!< byte member
};

/** Helper union.
This simplify conversion between bytes and words.
*/
union u16convert
{
uint16_t value; //!< for word access
struct u16bytes bytes; //!< for byte access
};


Далее идет в мэйне создание , например union u16convert test1;
И занесение в поле value значения 0xEFFF к примеру.(uint 16 и 8 - просто инты).

Далее я обнаруживаю что в поле test1.bytes.low уже есть значение равное value ,а high пока что не определён. Потом при принудительной попытке изменить поле low изменился и test1.value . Не очень понял почему присутствует связь между вроде бы не связанными вещями..

А собственно суть задачи такова - этот код использовался и вроде ка к успешно для разделения 2-х байтного числа в младший байт и старший байт. Собсвенно это и есть цель, может быть подскажете как это лучше реализовать, или помогите разобраться с примером - может я чего то не понял и все там правильно изначально..
Вот такой вопрос, заранее спасибо
HeLiO вне форума Ответить с цитированием
Старый 28.12.2010, 18:46   #2
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

ну все правильно в коде. union это тожесамое что структура, только ее поля пишутся в одном и том же адресе памяти.. в данном случае у тебя под весь юнион 16 бит value занимает полностью 16 бит и bytes занимает эти же 16 бит(в том же адресе) так как bytes это структура из 2х элементов по 8 бит то там по половине будет в каждом. если пишешь данные в value то они также точно пишутся и в bytes потому что эта та же самая память
UltimaBeaR вне форума Ответить с цитированием
Старый 28.12.2010, 19:07   #3
HeLiO
Пользователь
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию

в MS 2005 при step debuggin при занесении в value числа ничего не разделсяется. Оно копируется в поле low а high остаётся неопределённым(0). значит все таки что то не так, потому что если бы было всё правильно я бы вопроса не задавал. У меня правильный как бы изначальный код работает неправильно - он ничего не разделяет..
HeLiO вне форума Ответить с цитированием
Старый 28.12.2010, 19:56   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Ты знаешь как числа в памяти хранятся?

если ты записываешь в value число которое полностью уместится в 1 байт то так и должно быть.. попробуй записать число > 255 и посмотри что будет
UltimaBeaR вне форума Ответить с цитированием
Старый 28.12.2010, 20:16   #5
HeLiO
Пользователь
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию

внимательнее читай - число 0xEFFF 2 байта
HeLiO вне форума Ответить с цитированием
Старый 28.12.2010, 20:50   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию


ЗЫ: проверь определения типов uint16_t uint8_t возможно там ошибки если у тебя результат не такой как у меня

Последний раз редактировалось UltimaBeaR; 28.12.2010 в 22:03.
UltimaBeaR вне форума Ответить с цитированием
Старый 29.12.2010, 12:16   #7
HeLiO
Пользователь
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию

Цитата:
Сообщение от HeLiO Посмотреть сообщение
Сразу оговорюсь - в с++ я недавно программирую, поэтому извините за возможно тупой вопрос.

Есть такое определение типов :
struct u16bytes
{
uint8_t low; //!< byte member
uint8_t high; //!< byte member
};

/** Helper union.
This simplify conversion between bytes and words.
*/
union u16convert
{
uint16_t value; //!< for word access
struct u16bytes bytes; //!< for byte access
};


Далее идет в мэйне создание , например union u16convert test1;
И занесение в поле value значения 0xEFFF к примеру.(uint 16 и 8 - просто инты).

Далее я обнаруживаю что в поле test1.bytes.low уже есть значение равное value ,а high пока что не определён. Потом при принудительной попытке изменить поле low изменился и test1.value . Не очень понял почему присутствует связь между вроде бы не связанными вещями..

А собственно суть задачи такова - этот код использовался и вроде ка к успешно для разделения 2-х байтного числа в младший байт и старший байт. Собсвенно это и есть цель, может быть подскажете как это лучше реализовать, или помогите разобраться с примером - может я чего то не понял и все там правильно изначально..
Вот такой вопрос, заранее спасибо


Спасибо, в этом и была ошибка. Изначально неправильно понял что такое uint16 и 8 - думал просто и то и то инты, а для удобства сколько там байт лежит по факту их так разделяют..)
HeLiO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Struct mansp Общие вопросы C/C++ 4 05.12.2010 20:00
Вопрос по Struct cheblya Общие вопросы C/C++ 2 06.11.2009 11:42
STRUCT() alexov Общие вопросы C/C++ 1 13.01.2009 18:13
struct и файлы bondik Общие вопросы C/C++ 7 07.11.2008 08:13
struct vs MASM format Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.05.2008 17:54