|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.12.2010, 18:33 | #1 |
Пользователь
Регистрация: 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-х байтного числа в младший байт и старший байт. Собсвенно это и есть цель, может быть подскажете как это лучше реализовать, или помогите разобраться с примером - может я чего то не понял и все там правильно изначально.. Вот такой вопрос, заранее спасибо |
28.12.2010, 18:46 | #2 |
Форумчанин
Регистрация: 21.12.2010
Сообщений: 199
|
ну все правильно в коде. union это тожесамое что структура, только ее поля пишутся в одном и том же адресе памяти.. в данном случае у тебя под весь юнион 16 бит value занимает полностью 16 бит и bytes занимает эти же 16 бит(в том же адресе) так как bytes это структура из 2х элементов по 8 бит то там по половине будет в каждом. если пишешь данные в value то они также точно пишутся и в bytes потому что эта та же самая память
|
28.12.2010, 19:07 | #3 |
Пользователь
Регистрация: 28.12.2010
Сообщений: 13
|
в MS 2005 при step debuggin при занесении в value числа ничего не разделсяется. Оно копируется в поле low а high остаётся неопределённым(0). значит все таки что то не так, потому что если бы было всё правильно я бы вопроса не задавал. У меня правильный как бы изначальный код работает неправильно - он ничего не разделяет..
|
28.12.2010, 19:56 | #4 |
Форумчанин
Регистрация: 21.12.2010
Сообщений: 199
|
Ты знаешь как числа в памяти хранятся?
если ты записываешь в value число которое полностью уместится в 1 байт то так и должно быть.. попробуй записать число > 255 и посмотри что будет |
28.12.2010, 20:16 | #5 |
Пользователь
Регистрация: 28.12.2010
Сообщений: 13
|
внимательнее читай - число 0xEFFF 2 байта
|
28.12.2010, 20:50 | #6 |
Форумчанин
Регистрация: 21.12.2010
Сообщений: 199
|
ЗЫ: проверь определения типов uint16_t uint8_t возможно там ошибки если у тебя результат не такой как у меня Последний раз редактировалось UltimaBeaR; 28.12.2010 в 22:03. |
29.12.2010, 12:16 | #7 | |
Пользователь
Регистрация: 28.12.2010
Сообщений: 13
|
Цитата:
Спасибо, в этом и была ошибка. Изначально неправильно понял что такое uint16 и 8 - думал просто и то и то инты, а для удобства сколько там байт лежит по факту их так разделяют..) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |