#1 04-07-2012 12:33

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Структура с фиксированным размером

Создал структуру таким способом

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

#2 04-07-2012 18:17

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Структура с фиксированным размером

на правах капитана:
компилятор выровнял структуру, чтобы она была кратна 4 (добавил 2 байта после первых 6 полей).

в дельфи это решалось ключевым словом packed в объявлении структуры
http://www.delphisources.ru/pages/faq/f … d.php.html

ну и соответственно (3 пост)
http://www.cyberforum.ru/cpp/thread22686.html

/капитан офф/

Offline

#3 19-07-2012 13:11

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Структура с фиксированным размером

Спасибо, а что надо делать в таком случае:

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

#4 19-07-2012 15:39

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Структура с фиксированным размером

Это как в случае с функциями: если вызвать функцию, которая "ниже" той, из которой вызывают, то она ее как бы не "видит". Поэтому функции объявляют в хидерах или в начале кода.

struct A;
struct B;

struct A{
    B *pB;
};

struct B{
    A *pA;
};

Это предварительное объявление структур.

Offline

#5 19-07-2012 18:04

Alien
Registered: 12-10-2008
Posts: 564

Re: Структура с фиксированным размером

Можно и так:

struct A{
    struct B *pB;
};

struct B{
    struct A *pA;
};

В документации это назывется forward declaration. Перед использованием компилятор все равно должен иметь полные объявления этих классов. В противном случае получите invalid use of incomplete type.

Offline

#6 26-07-2012 17:27

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Структура с фиксированным размером

@Alien - Не совсем так.
Определения структуры может не быть вообще: указатель на структуру считается complete type.
Определение структуры требуется только в случае, если либо используется сама структура (не по указателю), либо производится обращение к каким-то ее полям

Offline

#7 11-08-2012 11:59

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Структура с фиксированным размером

У меня ещё такой вопрос.
Можно ли изменить тип/имя поля структуры в другой структуре?
У меня для 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

Board footer

Powered by FluxBB