Форум программистов, компьютерный форум CyberForum.ru

Sizeof и структура с int - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
08.03.2011, 20:41     Sizeof и структура с int #1
Привет!
Пишу программу для микроконтроллера на Си и под комп на С++.
В обеих программах есть такой код:

C++
1
2
3
4
5
6
struct {
  unsigned char adc_data; // 1 byte
  short int res; // 2 byte
} Mod; // 1 + 2 = 3
 
unsigned char sz = sizeof(Mod).
На микроконтроллере sz = 3, а на ПК sz = 4.
Я подумал что интеджер тут равен не 2 байтам, потом написал на компе sz = sizeof(Mod.adc_data), получилось 1, потом написал sz = sizeof(Mod.adc_data), получилось 2. С этим все правильно и понятно. Почему тогда в структуре получилось на 1 байт больше и как от этого избавится?

Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.03.2011, 20:51     Sizeof и структура с int #2
Цитата Сообщение от Br.Misha Посмотреть сообщение
На микроконтроллере sz = 3, а на ПК sz = 4.
на пк для эффективности используют выравнивание структур
Выравнивание структур

Добавлено через 24 секунды
Цитата Сообщение от Br.Misha Посмотреть сообщение
Почему тогда в структуре получилось на 1 байт больше и как от этого избавится?
а зачем от этого избавлятся?
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
08.03.2011, 21:02  [ТС]     Sizeof и структура с int #3
Я так понял, в опциях компилятора можно отключить выравнивание структур. А можно как отключить выравниевание отдельных структур?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.03.2011, 21:12     Sizeof и структура с int #4
отдельных наврятли, а зачем это нужно, программа после переноса перестала работать?
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
08.03.2011, 21:13  [ТС]     Sizeof и структура с int #5
просто у меня на МК есть структура и в ней еще несколько структур, там же содержатся чары, инты, флоаты. Очень мучительно разбивать отдельно на байты, пихать в отдельный буфер, а от туда уже на комп. Я просто в функции передачи указываю на первый байт в структуре и размер структуры (sizeof), после чего байты с области памяти, в которой содержится структура, передаются на комп, а там уже они так сома записываются в такую же структуру.

Я еще месяца 3 назад делал так само, но этой проблемы почему то тогда у меня не было.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.03.2011, 21:15     Sizeof и структура с int #6
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

есть пример с выравниваением структур
C++
1
2
3
4
5
6
7
8
9
10
// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack()   // n defaults to 8; equivalent to /Zp8
#pragma pack(show)   // C4810
#pragma pack(4)   // n = 4
#pragma pack(show)   // C4810
#pragma pack(push, r1, 16)   // n = 16, pushed to stack
#pragma pack(show)   // C4810
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
08.03.2011, 21:32     Sizeof и структура с int #7
В gcc для этого есть атрибут packed
C
1
2
3
4
struct __attribute__((packed)) {
    unsigned char adc_data;
    short int     res;
} Mod;
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
08.03.2011, 23:55  [ТС]     Sizeof и структура с int #8
А в С++ билдере это как сделать? через прагму? Я немогу понять как правильно писать код с #pragma, раньше никогда таим не пользовался
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.03.2011, 23:58     Sizeof и структура с int #9
Br.Misha, это компиляторо-специфические директивы, надо искать специально под компилятор
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 00:23     Sizeof и структура с int
Еще ссылки по теме:

C++ Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Создать абстрактный тип данных (структура) — вектор, который имеет указатель на int и число элементов C++
C++ В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
09.03.2011, 00:23  [ТС]     Sizeof и структура с int #10
вобщем делать надо так:
#pragma pack(push, 1)
структура
#pragma pack(pop)
Yandex
Объявления
09.03.2011, 00:23     Sizeof и структура с int
Ответ Создать тему
Опции темы

Текущее время: 14:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru