我有一個有點不尋常的問題。由於我是逆向工程代碼,因此我使用的數據結構(這很糟糕)無法更改。首先,這是導致我的麻煩,現在的結構:與不同大小的成員結合的數組
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