1
0
Fork 0

#513: netgui alignment mismatching on 32bit/64bit machines

netgui data structure now is identical for all platforms. Manually aligned
the fields, so compilers do not add (CPU architecture-specific) padding.
This commit is contained in:
ThorstenB 2011-12-09 19:01:15 +01:00
parent 4c17cee5fb
commit a756ad0f43

View file

@ -20,7 +20,7 @@
// and 8 bytes for double. // and 8 bytes for double.
const uint32_t FG_NET_GUI_VERSION = 7; const uint32_t FG_NET_GUI_VERSION = 8;
// Define a structure containing the top level flight dynamics model // Define a structure containing the top level flight dynamics model
@ -36,11 +36,21 @@ public:
FG_MAX_TANKS = 4 FG_MAX_TANKS = 4
}; };
uint32_t version; // increment when data values change // Note: align fields properly and manually to avoid incompatibilities
// between 32bit and 64bit CPUs. Make sure that each field is already
// placed on an offset which is a multiple of the size of its data
// type, i.e. uint32/float need to have on offset of 4, doubles need
// an offset of 8. This guarantees that compilers will _not_ add
// CPU-specific padding bytes. Whenever in doubt about padding rules,
// check "data structure alignment" in Wikipedia/Google :).
// Positions uint32_t version; // increment when data values change
uint32_t padding1; // 4 padding bytes, so the next (64bit) var is aligned to 8
// Positions (note: offset for these doubles is already aligned to 8 - to avoid architecture specific alignments)
double longitude; // geodetic (radians) double longitude; // geodetic (radians)
double latitude; // geodetic (radians) double latitude; // geodetic (radians)
float altitude; // above sea level (meters) float altitude; // above sea level (meters)
float agl; // above ground level (meters) float agl; // above ground level (meters)
float phi; // roll (radians) float phi; // roll (radians)