如何为这种类型创建一个 Storable 实例?
How do I create a Storable instance for this type?
假设我有以下 C 结构:
typedef struct _Ready {
int ready;
} *Ready;
我在Haskell中用这种类型表示它:
data Ready = Ready { ready :: CInt }
现在我想要一个 Storable
实例。以下工作正常:
instance Storable Ready where
alignment = sizeOf
sizeOf _ = (#size Ready)
但是,添加任何 peek
和 poke
的定义都失败了:
peek p = Ready <$> (#peek Ready, ready) p -- FAILS
poke p (Ready r) = (#poke Ready, ready) p r -- FAILS
错误归结为 ready
不是结构或联合的一部分:
/usr/lib/ghc-7.10.1/template-hsc.h:72:24:
error: request for member ‘ready’ in something not a structure or union
我做错了什么?
谢谢!
Ready
(C 类型)不是结构或联合,它是指向 struct _Ready
的指针。您应该改用 struct _Ready
,例如
peek p = Ready <$> (#peek struct _Ready, ready) p
poke p (Ready r) = (#poke struct _Ready, ready) p r
此外,您的 sizeOf
方法有误,需要进行同样的更改。您需要结构的大小,但您目前拥有指向结构的指针的大小,并且它们在 64 位系统上通常不相同。
我不能确切地说出你做错了什么,因为我从来没有偶然发现你使用的所有井号。但以下应该可以解决问题:
instance Storable Ready where
alignment _ = alignment (undefined :: CInt)
sizeOf _ = sizeOf (undefined :: CInt)
peek p = Ready <$> peekByteOff p 0
poke p (Ready r) = pokeByteOff p 0 r
peekByteOff
和 pokeByteOff
的 0
参数只是反映 _Ready
类型(在 C 中)的 ready
组件是第一个字段的记录。我不太确定 alignment
和 sizeOf
的定义,但我还是希望你展示另一种可能性。
假设我有以下 C 结构:
typedef struct _Ready {
int ready;
} *Ready;
我在Haskell中用这种类型表示它:
data Ready = Ready { ready :: CInt }
现在我想要一个 Storable
实例。以下工作正常:
instance Storable Ready where
alignment = sizeOf
sizeOf _ = (#size Ready)
但是,添加任何 peek
和 poke
的定义都失败了:
peek p = Ready <$> (#peek Ready, ready) p -- FAILS
poke p (Ready r) = (#poke Ready, ready) p r -- FAILS
错误归结为 ready
不是结构或联合的一部分:
/usr/lib/ghc-7.10.1/template-hsc.h:72:24:
error: request for member ‘ready’ in something not a structure or union
我做错了什么?
谢谢!
Ready
(C 类型)不是结构或联合,它是指向 struct _Ready
的指针。您应该改用 struct _Ready
,例如
peek p = Ready <$> (#peek struct _Ready, ready) p
poke p (Ready r) = (#poke struct _Ready, ready) p r
此外,您的 sizeOf
方法有误,需要进行同样的更改。您需要结构的大小,但您目前拥有指向结构的指针的大小,并且它们在 64 位系统上通常不相同。
我不能确切地说出你做错了什么,因为我从来没有偶然发现你使用的所有井号。但以下应该可以解决问题:
instance Storable Ready where
alignment _ = alignment (undefined :: CInt)
sizeOf _ = sizeOf (undefined :: CInt)
peek p = Ready <$> peekByteOff p 0
poke p (Ready r) = pokeByteOff p 0 r
peekByteOff
和 pokeByteOff
的 0
参数只是反映 _Ready
类型(在 C 中)的 ready
组件是第一个字段的记录。我不太确定 alignment
和 sizeOf
的定义,但我还是希望你展示另一种可能性。