[Haskell-beginners] Re: Re: How to initialize a C struct with FFI

Maciej Piechotka uzytkownik2 at gmail.com
Sat Feb 6 18:44:38 EST 2010


On Sun, 2010-02-07 at 00:04 +0100, Marco De Oliveira wrote:
> Hi Maciej,
> 
> Thanks to have take some time to read this code.
> 
> I rewrite using your comments:
> 
> import Foreign
> import Foreign.C
> 
> data CStruct = CStruct (CULong, CULong)
> 

Hmm. You combined both newtype and data. While technically it is correct
you have now one level more for program to consider. 

> instance Storable CStruct where
>   sizeOf _ = 2*sizeOf (undefined::CULong)
>   alignment _ = alignment (undefined::CULong)
>   
> test = with (CStruct (1,1)) (\ptr -> return ())
> 
> The class Storable does not need to make your own peek and poke method
> (the class provide a default implementation).

Not quite. It does in terms of peek/pokeElemOff. Which has in terms of
peek/pokeByteOff which has implementation in terms of peek/poke itself.

Therefore you have infinite recursion - poke calls pokeElemOff which
calls pokeByteOff which calls poke etc. 

Even the documentation specifies this:
"Minimal complete definition: sizeOf, alignment, one of peek,
peekElemOff and peekByteOff, and one of poke, pokeElemOff and
pokeByteOff."[1]

Sorry - I forgot about this (I only noticed that something is missing).

> But with, i have still the behavior when I try this code in ghci.
> 

My other suggestions only caused to avoid extensions/have type safety
and shorten the function respectively - they did not alter behaviour.

Regards

[1]
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Foreign-Storable.html#t%3AStorable




More information about the Beginners mailing list