[Haskell-cafe] Re: FFI and C99 "complex"

Aaron Denney wnoise at ofb.net
Sun Jan 16 18:17:02 EST 2005

On 2005-01-16, Aaron Denney <wnoise at ofb.net> wrote:
> Basically, what's the best way to deal with C99's complex types?
> Pragmatically, how do I deal with them in function definitions now?
> Is there any chance they'll get added to a later version of the
> FFI addendum?

So, I have heard claims that C 99 specifies that a variable v
of type "complex t" is stored as if declared as t v[2], with
v[0] the real part and v[1] the imaginary part.

I don't have a copy of the spec at hand.  Could someone who does verify

If this is true, then the following should be a valid Storable instance:

-- {poke,peek}{Elem,Byte}Off defaulted
instance (RealFloat a, Storable a) => Storable (Complex a) where
    sizeOf    (a :+ b)   = 2 * sizeOf a
    alignment (a :+ b)   = alignment a
    poke      x (a :+ b) = do let y = castPtr x
                              poke y a
                              pokeElemOff y 1 b
    peek      x          = do let y = castPtr x
                              a <- peek y
                              b <- peekElemOff y 1
                              return (a :+ b)

Would providing the the ElemOff or the ByteOff methods instead be any
more efficient?

Aaron Denney

More information about the Haskell-Cafe mailing list