17

我正在开发一个使用 haskell 库 (pandoc) 来完成一些工作的 C 库 ( libpandoc )。C 库提供了 haskell 包装回调来读取和写入数据。典型的回调,我还想发送一个void *user_data,这样回调就不必依赖于全局变量。

然而,搜索互联网,我似乎无法弄清楚如何将 Haskell 传递给void *变量。

有一个CString char *最终可以用作一种解决方法,但它不是那么好)和通用Ptr,它使指针脱离事物。但是,这些东西似乎不包括在内void(这也是可以理解的)。看着Foreign.C我看不到任何其他有用的东西。

我的问题是,我可以使用什么类型将这样的函数传递给 Haskell?

int func(char *buffer, void *user_data);

...

that_haskell_function(..., func, my_data);
4

1 回答 1

20

我认为,任何指针类型都应该有效,但Ptr ()最有意义。

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign
import Numeric

foreign import ccall unsafe "foo"
    c_foo :: Ptr () -> IO ()

main :: IO ()
main =
    allocaBytes 8 $ \ptr -> do
        c_foo ptr
        x <- peek (castPtr ptr) :: IO Word64
        putStrLn (showHex x "")

和 C 文件:

#include <string.h>

void foo(void *ptr)
{
    memset(ptr, 0xEB, 8);
}

给出结果:

ebebebebebebebeb
于 2013-06-28T14:24:23.463 回答