Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struct, union, битовые поля 
V
    Опции темы
Metalex
Дата 7.1.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Почитал про struct, union и битовые поля в нескольких учебниках, но не совсем понял различия между ними. Обьясните, пожалуйста.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
mes
Дата 7.1.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Metalex @  7.1.2010,  13:00 Найти цитируемый пост)
Почитал про struct, union и битовые поля в нескольких учебниках, но не совсем понял различия между ними. Обьясните, пожалуйста.


структура и юнион это наборы полей.
поле это элемент для хранения данных.
битовое поле это элемент, который будет использовать указанное кол-во бит.

В структуре каждому элементу отведено свой очередной адрес и поля не пересекаются
а в юнионе одно и тот же и поля получаются наложенными друг для друга.. 
(юнионом сильно не забивайте голову, он редко нужен, и в основном только для хаков )

Ну а если Вы ищете разницу между структурой и битовым полем  smile ,  то   smile 
Лучше перечитать книжки еще (может и не один) раз, до понимания, потому что основы лучше чем в книжке, вряд ли кто объяснит.
потому как вряд ли кому охота тратить время на то, что уже неоднократно разжевано..







--------------------
PM MAIL WWW   Вверх
Metalex
Дата 7.1.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



mes, это понятно, что спрашивать легче, чем отвечать, но тем не менее зачем определять память под каждое поле, если оно выделяется автоматически? (это я о битовых полях)


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
mes
Дата 7.1.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Metalex @  7.1.2010,  13:46 Найти цитируемый пост)
но тем не менее зачем определять память под каждое поле, если оно выделяется автоматически?

 smile 


--------------------
PM MAIL WWW   Вверх
Metalex
Дата 7.1.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



mes, эт чтоб я написал пример ? smile 


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
mes
Дата 7.1.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Metalex @  7.1.2010,  14:01 Найти цитируемый пост)
эт чтоб я написал пример ? smile  

ага пример того, что Вы подразумеваете под вышеприведенной цитатой.
и чего Вы удивляетесь ? хотите получить ответ: донесите вопрос так, чтоб было понятно.
не знаю как другим, но мне например абсолютно не понятно, что Вы имели ввиду.
 smile 


--------------------
PM MAIL WWW   Вверх
ARMALITE
Дата 7.1.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.12.2009
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: нет



насколько я помню, битовое поле- это всего-лишь некая переменная определенного размера (явно заданного вами: размер может быть целым числом от 0 до какого-то максимального размера, зависит от реализации). именованные битовые поля инициализируются как обычные переменные. И значения им можно присвоить любые, какие только могут в них влезть (надо только помнить что в некоторых реализациях знак числа занимает 1 бит)
если вы изучаете язык для себя, то не забивайте себе этим особо голову  smile, сейчас они мало применяются.
PM MAIL ICQ Skype   Вверх
bsa
Дата 10.1.2010, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
//по идее (если выключено выравнивание), размер этой структуры будет max(sizeof(unsigned), 4) байт
struct MyStruct
{
    unsigned flag1:1;
    unsigned flag2:1;
    unsigned flag3:1;
    unsigned data:29;
};

//размер этого объединения будет равен большему из unsigned и MyStruct. При этом изменение raw повлечет изменение ms, и наоборот.
union MyUnion
{
   struct MyStruct ms;
   unsigned raw;
};

PM   Вверх
artsb
Дата 10.1.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(bsa @  10.1.2010,  17:28 Найти цитируемый пост)
//по идее (если выключено выравнивание), размер этой структуры будет max(sizeof(unsigned), 4) байт

Эм... 1 байт же будет


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bsa
Дата 10.1.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



artsb, 1+1+1+29 = 32. Или у меня с арифметикой плохо?
PM   Вверх
artsb
Дата 10.1.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(bsa @  10.1.2010,  18:03 Найти цитируемый пост)
1+1+1+29 = 32. Или у меня с арифметикой плохо? 

Ох, ё! Действительно. Что-то я много о чём одновременно думаю. Забыл что я не многозадачный.  smile 

Это сообщение отредактировал(а) artsb - 10.1.2010, 18:19


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
BrAgOl
Дата 20.12.2011, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 6.3.2005
Где: М.О.

Репутация: нет
Всего: нет



Не хочу плодить темы поэтому пишу свой опрос сюда.

Программирую под МК 51 на Си в флэш память нужно записывать 2-ух байтный коэффициент, а флэш память у МК51 это массивы в каждом по 4 байта (EDATA1, EDATA2, ..., EDATA4) по байту каждый соответственно, я и решил 2-ух байтное число записывать в EDATA1, EDATA2 можно с помощью объединения, но почему-то не все так гладко вышло

Код

union UNI
    {
      unsigned i;
      unsigned char c[sizeof(unsigned)];
    };
    UNI un;
    un.i = 555;
   printf("\n%d ", un.i);
printf("\n%x ", un.c[0]);
printf("%x ", un.c[1]);



почему так можно делать, на выходе 555, 0х02 и 0х2В, а вот так нельзя:
Код

   un.c[0] = 0x02;
   un.c[1] = 0x2B;

чтоб соответственно на выходе в i  было 555?

Это сообщение отредактировал(а) BrAgOl - 20.12.2011, 15:49
PM MAIL   Вверх
bsa
Дата 20.12.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



BrAgOl, почему нельзя? компилятор ругается? если так, то есть подозрение, что он не полностью соответствует языку С. Что за компилятор?
PM   Вверх
BrAgOl
Дата 20.12.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 6.3.2005
Где: М.О.

Репутация: нет
Всего: нет



Да с компиляцией все в порядке GNU GCC, просто я предполагал, что при 
un.c[0] = 0x02;
un.c[1] = 0x2B; 

в переменной i должно быть значение 555 (22В в hex'e)
а там видимо случайное число, записанное по этому адресу, что-то типа 2147298050


ЗЫ под МК естественно не им компилю, просто кусок кода проверить хотел в code::blocks

Это сообщение отредактировал(а) BrAgOl - 20.12.2011, 16:20
PM MAIL   Вверх
bsa
Дата 20.12.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



а sizeof(int) чему равно на этой платформе?
попробуй сначала присвоить i нуль, а уже потом присваивать c[x].

Это сообщение отредактировал(а) bsa - 20.12.2011, 16:23
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.