3

私のC関数は次のようになります。

void *c_shm_create(char*, int);

私の.chsファイルは次のようになります。

{-# 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 ()' #}

これは私が得るエラーです:

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 ())

Ptr ()c2hs のドキュメントにvoid ポインター ( ) に関する言及が見つかりません。これをマーシャリングするにはどうすればよいですか?

4

1 に答える 1

2

次の変更を行います。

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

これがバグなのか意図的なものなのかはわかりません。Haskell データ型と C 構造体は、同じデータを表すという点で「等しい」と見なされる場合がありますが、同じようには表されません (構造体はヒープ上の純粋なバイトであり、データ型はポインターなどです)。そのため、マーシャリングが必要になります。だけではない機能id

于 2014-01-05T21:45:34.577 に答える