[Haskell-beginners] ffi array and peekArray

PICCA Frederic-Emmanuel frederic-emmanuel.picca at synchrotron-soleil.fr
Sun Nov 8 09:55:30 UTC 2015


Here the signature of one of my C function

-- hkl.h --

typedef struct _HklFactory HklFactory;

HKLAPI HklFactory **hkl_factory_get_all(size_t *n) HKL_ARG_NONNULL(1);

HKLAPI HklFactory *hkl_factory_get_by_name(const char *name,
                                           GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;

HKLAPI const char *hkl_factory_name_get(const HklFactory *self) HKL_ARG_NONNULL(1);

HKLAPI HklGeometry *hkl_factory_create_new_geometry(const HklFactory *self) HKL_ARG_NONNULL(1);

HKLAPI HklEngineList *hkl_factory_create_new_engine_list(const HklFactory *self) HKL_ARG_NONNULL(1);

I will focuss for now only the get_all method. As you can see even for the C client of my  API HklFactory is an opac struct
This get_all method return an array of (HklFactory *) and get the size of the array via the n parameter.

So I am trying to use this API from haskell with the foreign system and return a [HklFactory]

import Foreign (Ptr, peek)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Array (peekArray)

data HklFactory

foreign import ccall safe "hkl.h hkl_factory_get_all"
        c_hkl_factory_get_all :: Ptr Int -> IO (Ptr HklFactory)

hklFactoryGetAll :: IO [HklFactory]
hklFactoryGetAll = alloca $ \n -> do
                 factories <- c_hkl_factory_get_all n
                 peekArray n factories

but indeed it doesn not work, peekArray complain that n is Ptr Int instead of Int.

what should I do in order to get my array of HklFactory

thanks for your help.


More information about the Beginners mailing list