Pascal Viandier wrote:
Hi,
I have a question about field's alignment in GNU Pascal records on different platforms.
Consider the sample program below:
Program offsets; Type Rec1_t = Record Str16 : String(16); R : Real; End; Rec2_t = Record Str11 : String(11); Rec1 : Rec1_t; End; Rec3_t = Record Str11 : String(11); Str16 : String(16); R : Real; End;
<snip>
This looks good to me. Rec1 and Rec3 map on each other. How come the difference in alignment of Rec1 in Rec2 between Sparc and Linux? I know that Real data is aligned on 8 bytes boundaries on Sparc platforms but why is the address of Rec1 aligned on 8 bytes instead of 4?
Typical rule is that a record requires bigger or equal alignment as each of its components. So Rec1 needs at least Real alignment.
So the two records (Rec2 and Rec3) containing the same data are of different sizes and do not map anymore. This causes some trouble in my programs since this kind of data structures are passed back and forth to C code, in order to interface with a database engine.
Hmm, GNU Pacal uses the same rules as C, so C structures corresponding to Rec2 and Rec3 also does not mach -- at most one can be correct.