Haskell FFI双指针参数
我想用以下符号包装一组C函数:Haskell FFI双指针参数,haskell,ffi,Haskell,Ffi,我想用以下符号包装一组C函数: ErrorCode Initialize(int *argc,char ***args, ...) FFI调用中如何表示双指针?它是指向字符串列表的指针;以下说法可信吗 foreign import ccall unsafe "lib.h Initialize" c_initialize :: Ptr CInt -> Ptr [String] -> IO (Ptr CInt
ErrorCode Initialize(int *argc,char ***args, ...)
FFI调用中如何表示双指针?它是指向字符串列表的指针;以下说法可信吗
foreign import ccall unsafe "lib.h Initialize"
c_initialize :: Ptr CInt
-> Ptr [String]
-> IO (Ptr CInt)
或者第二个参数是Ptr(ptrchar)
?到目前为止,我在阅读的文献(现实世界的Haskell和Wikibook)中找不到这个案例,我的C有点生疏。
提前谢谢
--更正:
RWH实际上显示了到pcre\u compile()
的接口:
对应于:
-- pcre.h
pcre *pcre_compile(const char *pattern,
int options,
const char **errptr,
int *errofset,
const unsigned char *tableptr);
因此,考虑到所有这些建议,似乎最合适的签名是
foreign import ccall unsafe "lib.h Initialize"
c_initialize :: Ptr CInt
-> Ptr (Ptr CString)
-> IO (Ptr CInt)
谢谢大家!!将让您随时发布可能是一个
Ptr(Ptr(Ptr CChar))
,因为我们在args
前面有三个*
(并且CChar
不是Char
)。我认为从C类型到Haskell FFI类型的转换非常简单<代码>字符***是Ptr(Ptr(Ptr-CChar))
。据我所知,没有办法生产或消费Ptr[String]
(castPtr除外),因为[String]
不可存储。因此,让你的函数接受一个Ptr[String]
是相当愚蠢的——你永远不能从Haskell那里调用它,除非你有其他FFI函数专门用于创建一个Ptr[String]
用于c_initialize。提示:一个char*
通常是一个CString
。
foreign import ccall unsafe "lib.h Initialize"
c_initialize :: Ptr CInt
-> Ptr (Ptr CString)
-> IO (Ptr CInt)