如何为此类型创建可存储实例?

lis*_*szt 2 binding haskell ffi

假设我有以下C结构:

typedef struct _Ready {
    int ready;
} *Ready;
Run Code Online (Sandbox Code Playgroud)

我使用这种类型在Haskell中表示它:

data Ready = Ready { ready :: CInt }
Run Code Online (Sandbox Code Playgroud)

现在我想要一个Storable实例.以下工作正常:

instance Storable Ready where
    alignment = sizeOf
    sizeOf _  = (#size Ready)
Run Code Online (Sandbox Code Playgroud)

但是,添加以下任何定义peekpoke失败:

    peek p = Ready <$> (#peek Ready, ready) p   -- FAILS
    poke p (Ready r) = (#poke Ready, ready) p r -- FAILS
Run Code Online (Sandbox Code Playgroud)

错误归结为ready不属于结构或联合的一部分:

/usr/lib/ghc-7.10.1/template-hsc.h:72:24:
  error: request for member ‘ready’ in something not a structure or union
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

谢谢!

Rei*_*ton 7

Ready(C类型)不是结构或联合,它是指向a的指针struct _Ready.你应该使用struct _Ready,比如

peek p = Ready <$> (#peek struct _Ready, ready) p
poke p (Ready r) = (#poke struct _Ready, ready) p r
Run Code Online (Sandbox Code Playgroud)

此外,您的sizeOf方法是错误的,需要相同的更改.您需要结构的大小,但是您当前具有指向结构的指针的大小,并且它们在64位系统上通常不相同.