Wiem, że w C struktura nie może być pustą pamięcią, tak jak w kodzie. Na przykład:Struktury odczytu i zapisu w C
struct a {
short x;
int y;
};
zakładając szorty 2 bajtów i 4 ints bajt może rzeczywiście wziąć 8 bajtów w pamięci jako kompilator chce wyrównać członków 4 bajtowych granicach ... więc nie ma 2 bajty luzu między X i Y.
To sprawia, że czytanie i pisanie nie jest możliwe w języku, kompilatorze i sprzęcie. Jedynym sposobem na ich odczytanie i zapisanie jest członek według członków. Tak, problemem jest również Endianness, a zamiana musi zostać wykonana na poziomie członków, ale załóżmy, że to nie jest problem.
Fortran ma "sekwencyjny" specyfikator dla typów pochodnych (struktur), który mówi kompilatorowi, aby rozmieścić elementy w pamięci, gdy są one podane. Umożliwia to przenośne odczytywanie i zapisywanie typów pochodnych.
Moje pytanie brzmi: czy istnieje sposób na wykonanie podobnej czynności w C w sposób przenośny (i konserwowalny)?
Większość kompilatorów ma dyrektywy * do pakowania * struktur, więc może mieć inne (lub żadne) dopełnienie między elementami. Szybkie wyszukiwanie powinno pomóc ci znaleźć to, czego potrzebujesz dla swojego kompilatora. Jednak problem z endianizmem nie jest tak łatwy do pokonania, ale jeśli kierujesz tylko jedną platformę sprzętową, powinieneś być w porządku. –
@JoachimPileborg lub dodasz BOM jak int '0xffffeeff' i dodajesz zamieniające bajt na dane wejściowe w zależności od tego, gdzie zestaw' ee' jest –
Serializuj i deserializuj na tekst i unikaj problemów z estetyką, pakowaniem i przenośnością. – edc65