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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
#1

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

08.03.2011, 20:41. Просмотров 1710. Ответов 9
Метки нет (Все метки)

Привет!
Пишу программу для микроконтроллера на Си и под комп на С++.
В обеих программах есть такой код:

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 байт больше и как от этого избавится?

Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2011, 20:41     Sizeof и структура с int
Посмотрите здесь:

Ошибка error C2070: 'unsigned int': illegal sizeof operand C++
оператор sizeof C++
C++ Объясните sizeof()
sizeof() с массивами C++
sizeof C++
Оператор sizeof C++
C++ Operator sizeof
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 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
Еще ссылки по теме:

sizeof() C++
Sizeof выражение C++
Создать абстрактный тип данных (структура) — вектор, который имеет указатель на int и число элементов C++
Sizeof C++
Программа, которая выводит на экран значение функции sizeof от типов short, int, long и тд C++

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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