You are not logged in.
Создал структуру таким способом
typedef struct _ShapeDrawer{ char priority, primType, numVertices, alphaEnable, blendSrc, blendDst; // 6 RwD3D9Vertex vertex; // 34 } ShapeDrawer;
Когда проверял в IDA, заметил, что размер структуры увеличился на 2 байта (34 ->36)
Также попробовал такой вариант записи,
typedef struct ShapeDrawer ShapeDrawer #pragma pack(push,1) struct ShapeDrawer { char priority, primType, numVertices, alphaEnable, blendSrc, blendDst; // 6 RwD3D9Vertex vertex; // 34 }; #pragma pack(pop)
получил ту же картину.
Last edited by DK22Pac (04-07-2012 12:36)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
на правах капитана:
компилятор выровнял структуру, чтобы она была кратна 4 (добавил 2 байта после первых 6 полей).
в дельфи это решалось ключевым словом packed в объявлении структуры
http://www.delphisources.ru/pages/faq/f … d.php.html
ну и соответственно (3 пост)
http://www.cyberforum.ru/cpp/thread22686.html
/капитан офф/
Offline
Спасибо, а что надо делать в таком случае:
struct A{ B *pB }; struct B{ A *pA };
Не удаётся скомпилировать первую структуру, т.к. ещё не "обработана" вторая.
Last edited by DK22Pac (19-07-2012 13:12)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Это как в случае с функциями: если вызвать функцию, которая "ниже" той, из которой вызывают, то она ее как бы не "видит". Поэтому функции объявляют в хидерах или в начале кода.
struct A; struct B; struct A{ B *pB; }; struct B{ A *pA; };
Это предварительное объявление структур.
Offline
Можно и так:
struct A{ struct B *pB; }; struct B{ struct A *pA; };
В документации это назывется forward declaration. Перед использованием компилятор все равно должен иметь полные объявления этих классов. В противном случае получите invalid use of incomplete type.
Offline
@Alien - Не совсем так.
Определения структуры может не быть вообще: указатель на структуру считается complete type.
Определение структуры требуется только в случае, если либо используется сама структура (не по указателю), либо производится обращение к каким-то ее полям
Offline
У меня ещё такой вопрос.
Можно ли изменить тип/имя поля структуры в другой структуре?
У меня для CVehicle по смещению +4 лежит указатель на буфер.
struct CVehicle { CPhysical physical; CVehicleAudio vehicleAudio; ...
Можно ли тут что-то сделать? Думал union сделать, но тогда надо будет редактировать RwV3D.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline