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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размеры структур разные 
:(
    Опции темы
kurlyak
Дата 26.2.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня есть две одинаковые программы- одна на Си другая на Си++. В обеих программах используется одна и та же структура:

Код

typedef unsigned short int bitu16;  // 16-bit, unsigned
typedef unsigned long int  bitu32;  // 32-bit, unsigned

typedef struct tr2_moveable_struct {   // 18 bytes
bitu32 ObjectID;        // Item Identifier
bitu16 NumMeshes;       // number of meshes in this object
bitu16 StartingMesh;    // first mesh
bitu32 MeshTree;        // offset into MeshTree[]
bitu32 FrameOffset;     // byte offset into Frames[] (divide by 2 for Frames[i])
bitu16 Animation;       // offset into Animations[]
   } tr2_moveable;


Причем я сделал проверку размера стуктуры в программе на Си и на Си++:
Код

int s = sizeof(tr2_moveable);


В программе на Си s=18 в программе на Си++ s=20;

Из за этой неточности у меня происходит неправильное чтение данных из файла.

Вопрос - почему разные размеры струтур на Си и на Си++ и как мне сделать что бы в программе на Си++ у меня размер этой струтуры был 18 байт?
PM MAIL   Вверх
feodorv
Дата 26.2.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(kurlyak @  26.2.2012,  13:02 Найти цитируемый пост)
Вопрос - почему разные размеры струтур на Си и на Си++ и как мне сделать что бы в программе на Си++ у меня размер этой струтуры был 18 байт? 

Потому что разное выравнивание (подозреваю, что у Вас MS Visual Studio). В C++ выравнивание идёт по 4-х байтной границе.
Лучше в C сделать 20-ти байтную структуру:
Код

typedef struct tr2_moveable_struct {   // 18 bytes
bitu32 ObjectID;        // Item Identifier
bitu16 NumMeshes;       // number of meshes in this object
bitu16 StartingMesh;    // first mesh
bitu32 MeshTree;        // offset into MeshTree[]
bitu32 FrameOffset;     // byte offset into Frames[] (divide by 2 for Frames[i])
bitu16 Animation;       // offset into Animations[]
bitu16 padded; // <-------
   } tr2_moveable;



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
boostcoder
Дата 26.2.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(kurlyak @  26.2.2012,  13:02 Найти цитируемый пост)
почему разные размеры струтур на Си и на Си++

из-за разных правил упаковки/выравнивания.

Цитата(kurlyak @  26.2.2012,  13:02 Найти цитируемый пост)
как мне сделать что бы в программе на Си++ у меня размер этой струтуры был 18 байт?

#pragma pack.
PM WWW   Вверх
kurlyak
Дата 26.2.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Огромнейшее спасибо всем. Помогло.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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