Поиск:

Ответ в темуСоздание новой темы Создание опроса
> the alignment and storage of bit fields 
:(
    Опции темы
onetimer
Дата 22.4.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть типы:
Код

typedef unsigned char byte;
typedef unsigned short word;

typedef struct {
  byte  type    : 8;
  byte  dev_id  : 3;
  byte  grp_id  : 5;
  byte  head_id : 2;
  byte  ver     : 2;
  word  len     :10;
  byte  res     : 2;
} x_header_s;


Использую #pragma option -a1
Проблема в том, что мне СОВЕРШЕННО необходимо поместить это в 4 байта, а зараза билдер делает 6: сует 
[C++ Warning] : W8059 Structure packing size has changed.

На основании "According to the C and C++ language specifications, the alignment and storage of bit fields is implementation defined. Therefore, compilers can align and store bit fields differently. If you want complete control over the layout of bit fields, it is advisable to write your own bit field accessing routines and create your own bit fields." считает себя правым. Есть советы? Предложения?
PM MAIL   Вверх
jonie
Дата 22.4.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



делай так и не парься:
Код

#pragma pack(push)
#pragma pack(1)
typedef union {
  DWORD _all;
  byte  type    : 8;
  byte  dev_id  : 3;
  byte  grp_id  : 5;
  byte  head_id : 2;
  byte  ver     : 2;
  word  len     :10;
  byte  res     : 2;
} x_header_s;
#pragma pack(pop)



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
onetimer
Дата 22.4.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Совершенно глупый совет, извините!
Код

  int i = 300;

  x_header_s x;
  x.type = 5;
  x.len = i;
  ShowMessage(sizeof(x_header_s));
  ShowMessage(x.len);
  ShowMessage(x.type);


Это сообщение отредактировал(а) onetimer - 22.4.2008, 23:08
PM MAIL   Вверх
jonie
Дата 23.4.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



и чего не так?!
http://ipicture.ru/uploads/080423/MVhynWgxxA.png

если вы будете внимательными, то может заметите что я заменл структуру объединением.

Это сообщение отредактировал(а) jonie - 23.4.2008, 00:23


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
onetimer
Дата 23.4.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



и это об'единило все битовые поля! Потому я и привел фрагмент кода, чтобы Вы сами могли убедиться!
PM MAIL   Вверх
dumb
Дата 23.4.2008, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Код

#pragma pack(push, 1)
typedef struct {
  word  type    : 8;
  word  dev_id  : 3;
  word  grp_id  : 5;
  word  head_id : 2;
  word  ver     : 2;
  word  len     :10;
  word  res     : 2;
} x_header_s;
#pragma pack(pop)

PM MAIL   Вверх
jonie
Дата 23.4.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а ну да, я идиот, признаю.
в любом случае pragma pack(1)+правильное использование битовых масок (), по идее работать должно...



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
onetimer
Дата 23.4.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



dumb вариант не работает.
Еще идеи?

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


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(onetimer @  23.4.2008,  17:16 Найти цитируемый пост)
dumb вариант не работает
это не вариант и не идея. это правильное и рабочее решение твоей "проблемы". и, кстати, раз уж поля впихиваются в 4 байта, то логичнее было бы тип ставить dword.
PM MAIL   Вверх
onetimer
Дата 23.4.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  int i = 300;

  x_header_s x;
  x.type = 5;
  x.len = i;
  ShowMessage(sizeof(x_header_s));
  ShowMessage(x.len);
  ShowMessage(x.type);
}

Не работает: можете убедиться самостоятельно.
Цитата
это правильное и рабочее решение твоей "проблемы". и, кстати, раз уж поля впихиваются в 4 байта, то логичнее было бы тип ставить dword.

Совершенно не согласен ни с тем ни с другим.
PM MAIL   Вверх
Rififi
Дата 23.4.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



onetimer

откомпилировал этот код на древнем VC 6.0 sp6

Код
int i = 300;

x_header_s x;
memset(&x, 0, sizeof(x));

x.type = 257;  // 257 & 0xFF == 1
x.len = i;
std::cout << sizeof(x_header_s) << std::endl;
std::cout << x.len << std::endl;;
std::cout << x.type << std::endl;


выхлоп:

Код
4
300
1


отсюда вывод про борланд: "ну не шмогла я, не шмогла..."
PM MAIL   Вверх
jonie
Дата 23.4.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



onetimer вариант dump отработал у меня не совсем норм. builder6 (вывел 4,300,5)
вообще корректнее пихать все поля в DWORD... и делать битовые поля "из этого типа"...

в общем-то можно написать свой класс обертуку на DWORD-ом)
уж если это не заработает разбить монитор...

Это сообщение отредактировал(а) jonie - 23.4.2008, 23:21


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
onetimer
Дата 23.4.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#pragma pack(push, 1)
typedef struct {
  byte  type    : 8;
  byte  dev_id  : 3;
  byte  grp_id  : 5;
  byte  head_id : 2;
  byte  ver     : 2;
  word  len     :10;
  byte  res     : 2;
} x_header_s;
#pragma pack(pop)


Только BCB6. VC в любом соусе, пожалуйста, не предлагать smile 
jonie, как я могу получить (вывел 4,300,5)? Я был бы рад! Нельзя ли выложить весь проект?
У меня размер 6 байт. Могу добиться и 8 smile 
Класс сделать можно и, скорее всего, нужно, но пока пытаюсь без, по-простому.
Через DWORD дурной стиль - поля могут и будут меняться.
PM MAIL   Вверх
Rififi
Дата 23.4.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



onetimer
Цитата
VC в любом соусе, пожалуйста, не предлагать

не будем. ведь так интересно и весело наблюдать за мучениями борландятников :grin:
PM MAIL   Вверх
onetimer
Дата 23.4.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
так интересно и весело наблюдать за мучениями борландятников

Если долго мучиться - что-нибудь получится! Может быть smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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