将字符串列表转换为 haskell 中的 c 数组
convert a list of strings to a c array in haskell
有几个说明如何将字符串转换为 CString,以便在使用 FFI 调用 C 时传递。我的问题是将字符串列表转换为 char **word
值,为此我在 Whosebug 或 hackage 中都找不到答案。
我看到一个选项:我可以使用 newCString
转换列表中的每个字符串,然后将它们提供给 newArray - 不要忘记释放保留的内存。
我想这个比较常见的操作应该有更好的选择吧?
不,我不认为这有什么用。 newCString
和 newArray
已经足够简单了:
import Foreign.Ptr
import Foreign.C.String
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
makeCStringArray :: [[String]] -> IO (Ptr CString)
makeCStringArray arr = newArray =<< traverse newCString arr
freeCStringArray :: Int -> Ptr CString -> IO ()
freeCStringArray n ptr = do
strs <- peekArray n ptr
traverse free strs
free ptr
有几个说明如何将字符串转换为 CString,以便在使用 FFI 调用 C 时传递。我的问题是将字符串列表转换为 char **word
值,为此我在 Whosebug 或 hackage 中都找不到答案。
我看到一个选项:我可以使用 newCString
转换列表中的每个字符串,然后将它们提供给 newArray - 不要忘记释放保留的内存。
我想这个比较常见的操作应该有更好的选择吧?
不,我不认为这有什么用。 newCString
和 newArray
已经足够简单了:
import Foreign.Ptr
import Foreign.C.String
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
makeCStringArray :: [[String]] -> IO (Ptr CString)
makeCStringArray arr = newArray =<< traverse newCString arr
freeCStringArray :: Int -> Ptr CString -> IO ()
freeCStringArray n ptr = do
strs <- peekArray n ptr
traverse free strs
free ptr