我有一个有点不寻常的问题。由于我是逆向工程代码,因此我使用的数据结构(这很糟糕)无法更改。首先,这是导致我的麻烦,现在的结构:与不同大小的成员结合的数组
typedef struct {
build_field build;
u8 field_1;
u8 level;
u8 field_3;
u16 species;
union{
struct {
u16 field_6;
} default_item_default_attacks;
struct {
u16 moves[4];
u16 field_E;
} default_item_custom_attacks;
struct {
u16 item;
} custom_item_default_attacks;
struct {
u16 item;
u16 moves[4];
} custom_item_custom_attacks;
} item_and_moves;
} trainer_pokemon;
正如你所看到的结构trainer_pokemon
的大小取决于我用实例化其中uninion成员。问题是我需要instanciate几个trainer_pokemon[]
。不出所料,我的C-Compiler只是将这个数组中的每个成员的大小扩大到最大值(就像我总是使用联合成员custom_item_custom_attacks
来实现实例一样)。然而,我反向工程的游戏期望数组的成员匹配所用联合的大小。这听起来有点混乱,所以我将提供一个更具体的例子:
trainer_pokemon[] t = {
{
0x0, //build
0x0, //ability bit
false, //hidden ability
false, //shiny
},
0x0, //field_1
8, //Level
0, //field_3
POKEMON_LICHTEL, {
.default_item_default_attacks = {
0x0, //field_6,
}
}
},
{
{
0x0, //build
0x0, //ability bit
false, //hidden ability
false, //shiny
},
0x0, //field_1
6, //Level
0, //field_3
POKEMON_TRAUMATO,
{
.default_item_default_attacks = {
0x0, //field_6,
}
}
}
};
正如你可以看到每这个阵列的元件8个字节将足以实例化此阵列(总大小为16个字节)。但是,由于编译器只是假定我需要一个额外的8字节的custom_item_custom_attacks
,所以每个成员都被填充到16字节的大小(总大小为32字节)。问题在于游戏引擎期望结构符合最小尺寸(在这种情况下为8个字节)。 我如何最好地改造或修复这个问题?还请注意,在一个数组中,所有成员的大小相同,并且必须立即与同一个工会成员同步。
'sizeof(trainer_pokemon)'将会增加你工会中最大的元素。如果这是你的意思。 – tilz0R
而那就是我想要阻止的。我想我必须重新构建我的数据结构,但是怎么做呢?有没有更好的办法? – PfannkuchenXD
如果您在侧面结构中使用指针,然后在此变量之外初始化数据,该怎么办?所以你的结构只是指向某个地方。如果它非空,你知道它有有效值,否则你忽略它。 – tilz0R