Using c2hs to marshal a void*

288 views Asked by At

My C function looks like this:

void *c_shm_create(char*, int);

My .chs file looks like this:

{-# LANGUAGE ForeignFunctionInterface #-}

module System.Shm.Internal.Bindings
    ( c_shmCreate
    )
where
#include "hs_shm.h"
import C2HS

{#fun unsafe c_shm_create as c_shmCreate
    { `String'
    , `Int' } -> `Ptr ()' #}

This is the error I get:

src\System\Shm\Internal\Bindings.chs:12: (column 18) [ERROR]  >>> Missing "out" marshaller!
  There is no default marshaller for this combination of Haskell and C type:
  Haskell type: Ptr ()
  C type      : (Ptr ())

I can't find any mention for void pointer (Ptr ()) in the c2hs documentation. How do I marshal this?

1

There are 1 answers

0
user2407038 On BEST ANSWER

Making the following change:

{#fun c_shm_create as c_shmCreate { `String' , `Int' } -> `Ptr ()' id #}

I'm unsure if this is a bug or is intentional. A Haskell data type and C struct may be considered 'equal' in that they represent the same data, but are not represented the same (the struct is pure bytes on the heap while the datatype is pointers and such) so you will need a marshaling function that isn't just id.