How to initialize a C struct with FFI

Hi, I try to initialize a C struct using the FFI API and ghc stays blocked when I execute my code (and I got sometimes the error "out of memory"). I do not understand, I do not find any mistake in my code: {-# OPTIONS -XTypeSynonymInstances #-} import Foreign.C.Types import Foreign.Marshal.Alloc import Foreign.Ptr import Foreign.Storable type CStruct = (CULong, CULong) instance Storable CStruct where sizeOf _ = 2*sizeOf (undefined::CULong) alignment _ = alignment (undefined::CULong) test = alloca (\pStruct -> do poke pStruct ( (fromIntegral 1)::CULong, (fromIntegral 1)::CULong ) ) Thanks for your help. Marco

On Sat, 2010-02-06 at 12:28 +0100, Marco De Oliveira wrote:
Hi,
I try to initialize a C struct using the FFI API and ghc stays blocked when I execute my code (and I got sometimes the error "out of memory"). I do not understand, I do not find any mistake in my code:
{-# OPTIONS -XTypeSynonymInstances #-}
import Foreign.C.Types import Foreign.Marshal.Alloc import Foreign.Ptr import Foreign.Storable
It can be written as: import Foreign import Foreign.C
type CStruct = (CULong, CULong)
I guess that you may want to use newtype or data rather then type to avoid clashes (and have just 98 + FFI): newtype CStruct = CStruct (CULong, CULong) data CStruct = CStruct CULong CULong
instance Storable CStruct where sizeOf _ = 2*sizeOf (undefined::CULong) alignment _ = alignment (undefined::CULong)
To begin with - where's peek and poke?
test = alloca (\pStruct -> do poke pStruct ( (fromIntegral 1)::CULong, (fromIntegral 1)::CULong ) )
If you just do this at the beginning you may want to use with (notation as with newtype/data): with (CStruct (1, 1)) (\ptr -> ...) Also is main = test?
Thanks for your help.
Marco
Regards

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)
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).
But with, i have still the behavior when I try this code in ghci.
Please, can you test this code and tell me why ghci stay blocked after
executing the method test.
BR
Marco
2010/2/6 Maciej Piechotka
On Sat, 2010-02-06 at 12:28 +0100, Marco De Oliveira wrote:
Hi,
I try to initialize a C struct using the FFI API and ghc stays blocked when I execute my code (and I got sometimes the error "out of memory"). I do not understand, I do not find any mistake in my code:
{-# OPTIONS -XTypeSynonymInstances #-}
import Foreign.C.Types import Foreign.Marshal.Alloc import Foreign.Ptr import Foreign.Storable
It can be written as: import Foreign import Foreign.C
type CStruct = (CULong, CULong)
I guess that you may want to use newtype or data rather then type to avoid clashes (and have just 98 + FFI):
newtype CStruct = CStruct (CULong, CULong) data CStruct = CStruct CULong CULong
instance Storable CStruct where sizeOf _ = 2*sizeOf (undefined::CULong) alignment _ = alignment (undefined::CULong)
To begin with - where's peek and poke?
test = alloca (\pStruct -> do poke pStruct ( (fromIntegral 1)::CULong, (fromIntegral 1)::CULong ) )
If you just do this at the beginning you may want to use with (notation as with newtype/data):
with (CStruct (1, 1)) (\ptr -> ...)
Also is main = test?
Thanks for your help.
Marco
Regards
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

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-S...
participants (2)
-
Maciej Piechotka
-
Marco De Oliveira