Hal Daume III wrote:
2) Could someone tell me what 'alignment' is
As the documentation says: Computes the alignment constraint of the argument. An alignment constraint x is fulfilled by any address divisible by x. The value of the argument is not used. E.g. an alignment of 2 means that the data must be stored at an even address, an alignment of 4 means that the data must be stored at an address which is a multiple of 4, etc.
and if this is the correct definition of a storable tuple:
Not really. [Disclaimer: sample code is off the top of my head, untested, supplied without warranty etc.]
instance (Storable a, Storable b) => Storable (a,b) where sizeOf (a,b) = sizeOf a + sizeOf b
You also need to allow for any padding which is required to satisfy the alignment constraints of b, e.g. sizeOf (a,b) = sizeOf a + padding (a,b) + sizeOf b where padding (a,b) = (alignment b - sizeOf a `mod` alignment b) `mod` alignment b
alignment (a,b) = alignment a + alignment b
The alignment of the overall structure is determined by the alignment of the first element. Subsequent elements are aligned (if necessary) by the addition of padding between elements. alignment (a,_) = alignment a
peek ptr = do a <- peek (castPtr ptr) b <- peek (castPtr ptr `plusPtr` sizeOf a) return (a,b)
Again, there may be padding between a and b, i.e.
b <- peek (castPtr ptr `plusPtr` (sizeOf a + padding (a,b)))
poke ptr (a,b) = do poke (castPtr ptr) a poke (castPtr ptr `plusPtr` sizeOf a) b
Ditto.
poke (castPtr ptr `plusPtr` (sizeOf a + padding (a,b))) b
-- Glynn Clements <glynn.clements@virgin.net>