Ich habe eine etwas ungewöhnliche Frage. Da ich Reverse-Engineering-Code bin, kann die Datenstruktur (die übrigens schrecklich ist) nicht geändert werden. Zunächst einmal ist dies die Struktur, die jetzt meine Probleme verursacht:Array von Union mit Mitgliedern unterschiedlicher Größe
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;
Wie Sie die Größe der Struktur sehen trainer_pokemon
variiert je nachdem, welche uninion Mitglied ich Instanciate verwenden. Das Problem ist, dass ich mehrere trainer_pokemon[]
instanziieren muss. Wie erwartet, erweitert mein C-Compiler die Größe jedes Elements dieses Arrays auf das Maximum (als ob ich immer das Union-Element custom_item_custom_attacks
für Instanziierung verwendet hätte). Das Spiel Reverse Engineering erwartet jedoch, dass die Mitglieder des Arrays der Größe der verwendeten Union entsprechen. Das mag etwas verwirrend klingen, so dass ich ein konkreteres Beispiel geben:
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,
}
}
}
};
Wie Sie 8 Bytes pro Element dieses Arrays sehen würde ausreichen, um dieses Array zu instanziieren (Gesamtgröße 16 Byte). Jedoch ist jedes Mitglied bis zu einer Größe von 16 Bytes (Gesamtgröße von 32 Bytes) null-gefüllt, da der Compiler nur annimmt, dass ich mit custom_item_custom_attacks
eingerichtet habe, was eine zusätzliche Menge von 8 Bytes erfordern würde. Das Problem ist, dass die Engine erwartet, dass die Struktur der Mindestgröße (in diesem Fall 8 Byte) entspricht. Wie kann ich dieses Problem am besten umgestalten oder beheben? Bitte beachten Sie auch, dass innerhalb eines Arrays alle Mitglieder die gleiche Größe haben und mit demselben Gewerkschaftsmitglied instanziiert werden müssen.
'sizeof (trainer_pokemon)' wird um das größte Element in Ihrer Vereinigung erhöht. Wenn das das ist, was du meintest. – tilz0R
Und das will ich verhindern. Ich denke, ich muss meine Datenstruktur umgestalten, aber wie? Gibt es einen besseren Weg? – PfannkuchenXD
Was ist, wenn Sie Zeiger in der Seitenstruktur verwenden und dann Ihre Daten außerhalb dieser Variablen initiieren? Deine Struktur hält also den Zeiger irgendwo fest. Wenn es nicht null ist, wissen Sie, dass es einen gültigen Wert hat, andernfalls ignorieren Sie es. – tilz0R