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

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

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

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

08.03.2011, 20:41. Просмотров 1740. Ответов 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 байт больше и как от этого избавится?

Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2011, 20:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Sizeof и структура с int (C++):

Ошибка error C2070: 'unsigned int': illegal sizeof operand - C++
Собственно, есть пара вопросов (смотреть в комментариях). Помогите разобраться пожалуйста Заранее спасибо Всем Пример части ...

Программа, которая выводит на экран значение функции sizeof от типов short, int, long и тд - C++
Кого не затруднит, создайте новый проект. Определите размерность базовых типов в вашей системе. Для этого напишите программу, которая...

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) - C++
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec - C++
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

Создать абстрактный тип данных (структура) — вектор, который имеет указатель на int и число элементов - C++
Создать абстрактный тип данных (структура) - вектор, который имеет указатель на int и число элементов. Определить функции: инициализации,...

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

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

Я еще месяца 3 назад делал так само, но этой проблемы почему то тогда у меня не было.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 21:15 #6
http://msdn.microsoft.com/en-us/library/2e70t5y1(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
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,197
Завершенные тесты: 1
08.03.2011, 21:32 #7
В gcc для этого есть атрибут packed
C
1
2
3
4
struct __attribute__((packed)) {
    unsigned char adc_data;
    short int     res;
} Mod;
0
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
08.03.2011, 23:55  [ТС] #8
А в С++ билдере это как сделать? через прагму? Я немогу понять как правильно писать код с #pragma, раньше никогда таим не пользовался
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 23:58 #9
Br.Misha, это компиляторо-специфические директивы, надо искать специально под компилятор
0
Br.Misha
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 127
09.03.2011, 00:23  [ТС] #10
вобщем делать надо так:
#pragma pack(push, 1)
структура
#pragma pack(pop)
0
09.03.2011, 00:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 00:23
Привет! Вот еще темы с ответами:

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)' - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #define row 5 #define col 5 using namespace...

В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.? - C++
Не понимаю, с чего начинать. Заранее спс.

[Linker Error] Unresolved external 'Sort(int near*near ,int, int) - C++
не могу понять в чем ошибка при компиляции ошибок не выдает при запуске программы - выдает эту ошибку Unresolved external 'Sort(int...

int main() и int _tmain(int argc, _TCHAR* argv[]) - C++
При создании нового консольного приложения Microsoft Visual С++ 2010 Express создает начальный шаблон #include &quot;stdafx.h&quot; int...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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