Haskell FFI - return 更新结构
Haskell FFI - return updated structure
我想从 Haskell
调用以下 C
函数:
void read_params_for (property_list_t *props);
该函数应该接收一些 property_list_t
并在其中填充一些值,因此调用者然后具有更新的结构。
我有 property_list_t
(如 Storable
等)的所有必要包装器,但我不知道如何将此函数包装成
之类的东西
readParamsFor :: ForeignPtr PropertyListT -> IO (ForeignPtr PropertyListT)
我尝试使用 C2HS
,我也尝试手动编写 FFI 绑定,例如:
foreign import ccall "read_params_for"
readParamsFor' :: Ptr PropertyListT -> IO ()
readParamsFor :: ForeignPtr PropertyListT -> IO (ForeignPtr PropertyListT)
readParamsFor ps = do
withForeignPtr ps $ \ps' -> do
res <- readParamsFor' ps'
pl <- newForeignPtr propertyListDestroy ps'
return pl
但在这两种情况下,我都会取回原来的 "underpopulated" 列表。
如何将更新的结构返回到 Haskell?
我意识到我想使用的 C 库中有一个错误,确实,如果没有错误,一个简单的 withForeignPtr
就足够了。
我想从 Haskell
调用以下 C
函数:
void read_params_for (property_list_t *props);
该函数应该接收一些 property_list_t
并在其中填充一些值,因此调用者然后具有更新的结构。
我有 property_list_t
(如 Storable
等)的所有必要包装器,但我不知道如何将此函数包装成
readParamsFor :: ForeignPtr PropertyListT -> IO (ForeignPtr PropertyListT)
我尝试使用 C2HS
,我也尝试手动编写 FFI 绑定,例如:
foreign import ccall "read_params_for"
readParamsFor' :: Ptr PropertyListT -> IO ()
readParamsFor :: ForeignPtr PropertyListT -> IO (ForeignPtr PropertyListT)
readParamsFor ps = do
withForeignPtr ps $ \ps' -> do
res <- readParamsFor' ps'
pl <- newForeignPtr propertyListDestroy ps'
return pl
但在这两种情况下,我都会取回原来的 "underpopulated" 列表。
如何将更新的结构返回到 Haskell?
我意识到我想使用的 C 库中有一个错误,确实,如果没有错误,一个简单的 withForeignPtr
就足够了。