Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Haskell数据作为不透明数据类型传递给C FFI?_Haskell_Ffi - Fatal编程技术网

如何将Haskell数据作为不透明数据类型传递给C FFI?

如何将Haskell数据作为不透明数据类型传递给C FFI?,haskell,ffi,Haskell,Ffi,我试图通过一个不读取或修改数据的C库传递一些数据 foreign import ccall "lua.h lua_pushlightuserdata" c_lua_pushlightuserdata :: LuaState -> Ptr a -> IO () foreign import ccall "lua.h lua_touserdata" c_lua_touserdata :: LuaState -> CInt -> IO (Ptr a) data My

我试图通过一个不读取或修改数据的C库传递一些数据

foreign import ccall "lua.h lua_pushlightuserdata"
  c_lua_pushlightuserdata :: LuaState -> Ptr a -> IO ()

foreign import ccall "lua.h lua_touserdata"
  c_lua_touserdata :: LuaState -> CInt -> IO (Ptr a)

data MyData =
  MyData
  { dataIds = TVar [Int]
  , dataSomethingElse = [String]
  }

calledFromRunLuaState :: LuaState -> IO ()
calledFromRunLuaState luaState = do
  dataPtr <- c_lua_touserdata luaState (-1)
  myData <- dataFromPtr dataPtr
  doSomethingWith myData

main = do
  luaState <- Lua.newstate
  ids <- atomically $ newTVar []
  c_lua_pushlightuserdata luaState (dataToPtr (MyData ids []))
  runLuaState luaState
foreign import ccall“lua.h lua_pushlightuserdata”
c_lua_pushlightuserdata::LuaState->ptra->IO()
国外进口货物“lua.h lua_tuserdata”
c_lua_tuserdata::LuaState->CInt->IO(Ptr a)
数据MyData=
我的数据
{dataIds=TVar[Int]
,dataSomethingElse=[String]
}
从运行LuaState::LuaState->IO()调用
调用dfromrunluastate luaState=do
dataPtr这就是它的用途。因此,您必须使用来代替
datafromtr
dataToPtr
。请注意,
deRefStablePtr
IO
monad中运行,因此您必须相应地调整代码。此外,您还必须调整外部导入以使用稳定指针,例如:

foreign import ccall "lua.h lua_pushlightuserdata"
  c_lua_pushlightuserdata :: LuaState -> StablePtr MyData -> IO ()
同样地,对于lua_Toserdata


最后,当您使用
newStablePtr
创建稳定指针时,垃圾收集器不会自动取消分配该值。因此,您有责任通过电话解除分配。

谢谢!我看到了Stablepter,但我不太明白。也许我需要第三杯咖啡。