Hi,

On Fri, 15 Jun 2018, Ryan Joseph wrote:

> I have a struct I need to port from C but the size I’m getting in Pascal
> is wrong. From C sizeof(AAPLVertex) = 32 but in Pascal
> sizeof(AAPLVertex) = 24.
>
> The alignment of the struct is on 32 bit bounds I think but how do I
> replicate this in Pascal so it behaves exactly like c? I tried using
> $align but it didn’t seem to have any effect.
>
> {$align 32}
> type
>       TAAPLVertex = packed record
>               position: vector_float2;
>               color: vector_float4;
>       end;

The whole idea of a packed record is to ignore alignment and "pack" the
fields ignoring padding and alignment. Use a normal record without
"packed", or add the padding fields manually, if you still have to use a
packed record for whatever reason.

BTW, $align specifies the alignment in *BYTES* not in bits. So to align to
32bits you need {$align 4}. But Free Pascal also supports {$packrecords
C}, where it will try to mimic the C compiler's alignment as native to the
target platform. In any unit which needs to interface to a C library, I'd
use {$packrecords C} and no {$align}

This is all documented BTW at the respective directives...

Charlie
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to