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