gpt4 book ai didi

c - 通过 haskell 传递 void *

转载 作者:太空狗 更新时间:2023-10-29 16:32:23 26 4
gpt4 key购买 nike

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

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

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

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

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

...

that_haskell_function(..., func, my_data);

最佳答案

我认为任何指针类型都应该有效,但 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

关于c - 通过 haskell 传递 void *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17366776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com