<div dir="ltr"><div>Hi,<br><br></div>You can try something like this (not tested):<br><div><div><br>data Geo = Geo -- this represents the HklGeometry C structure (for clarity)<br><br>newtype Geometry = Geometry (ForeignPtr Geo) deriving (Show, Storable)<br><br>newGeometry :: Factory -> IO Geometry<br>newGeometry f = do -- avoid unsafePerformIO<br>                  geometry <- c_hkl_factory_create_new_geometry f<br>                  Geometry <$> newForeignPtr c_hkl_geometry_free geometry<br><br>foreign import ccall safe "hkl.h hkl_factory_create_new_geometry"<br>  c_hkl_factory_create_new_geometry :: Factory<br>                                    -> IO (Ptr Geo)<br><br>foreign import ccall safe "hkl.h &hkl_geometry_free"<br>  c_hkl_geometry_free :: FunPtr (Ptr Geo -> IO ())<br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-01-27 13:50 GMT+01:00 PICCA Frederic-Emmanuel <span dir="ltr"><<a href="mailto:frederic-emmanuel.picca@synchrotron-soleil.fr" target="_blank">frederic-emmanuel.picca@synchrotron-soleil.fr</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
since the last time I think that I understand how to manage Ptr, now I woud like to masterize the ForeignPtr in order to let haskell managed the life of my C objects.<br>
So I try to create a Geoemtry object like this.<br>
<br>
-- data Geometry<br>
newtype Geometry = Geometry (Ptr Geometry) deriving (Show, Storable)<br>
<br>
newGeometry :: Factory -> ForeignPtr Geometry<br>
newGeometry f = unsafePerformIO $ do<br>
                  geometry <- c_hkl_factory_create_new_geometry f<br>
                  newForeignPtr c_hkl_geometry_free geometry<br>
<br>
foreign import ccall safe "hkl.h hkl_factory_create_new_geometry"<br>
  c_hkl_factory_create_new_geometry :: Factory<br>
                                    -> IO (Geometry)<br>
<br>
foreign import ccall safe "hkl.h &hkl_geometry_free"<br>
  c_hkl_geometry_free :: FunPtr (Geometry -> IO ())<br>
<br>
<br>
<br>
the C signature are<br>
<br>
HKLAPI HklGeometry *hkl_factory_create_new_geometry(const HklFactory *self) HKL_ARG_NONNULL(1);<br>
<br>
HKLAPI void hkl_geometry_free(HklGeometry *self) HKL_ARG_NONNULL(1);<br>
<br>
<br>
But when I try to compile this code, I get this error message<br>
<br>
<br>
1 of 1] Compiling Hkl.C            ( src/Hkl/C.hs, dist/build/Hkl/C.o )<br>
<br>
src/Hkl/C.hs:51:33:<br>
    Couldn't match type ‘Geometry’ with ‘Ptr Geometry’<br>
    Expected type: GHC.ForeignPtr.FinalizerPtr Geometry<br>
      Actual type: FunPtr (Geometry -> IO ())<br>
    In the first argument of ‘newForeignPtr’, namely<br>
      ‘c_hkl_geometry_free’<br>
    In a stmt of a 'do' block:<br>
      newForeignPtr c_hkl_geometry_free geometry<br>
<br>
src/Hkl/C.hs:51:53:<br>
    Couldn't match expected type ‘Ptr Geometry’<br>
                with actual type ‘Geometry’<br>
    In the second argument of ‘newForeignPtr’, namely ‘geometry’<br>
    In a stmt of a 'do' block:<br>
      newForeignPtr c_hkl_geometry_free geometry<br>
<br>
I do not understand what is wrong in my code<br>
<br>
thanks if you can help<br>
<br>
Frederic<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br></div>