【问题标题】:Using the Haskell FFI to marshal structs; also, how to use FunPtr使用 Haskell FFI 编组结构;还有,如何使用 FunPtr
【发布时间】:2011-09-08 18:51:04
【问题描述】:

我对@9​​87654321@ 的 ffi 有一些疑问。

首先,我正在尝试使用 haskell 中的 c 结构。

我有一些问题:我有一个类似

的结构
struct foo{int a; float b;};
  1. 什么时候可以使用data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
  2. 什么时候我必须通过 peek 和 poke 实现可存储?

好的,现在问一个关于FunPtr的问题

  • 我不知道何时使用FunPtr 为什么像Ptr CInt -> IO CInt 这样的普通定义还不够?

【问题讨论】:

    标签: haskell ffi


    【解决方案1】:

    编组

    要编组结构,您需要使用Storable 类实例来通过peekpoke 来回编组数据。

    请参阅上一个答案以获取示例:How to use hsc2hs to bind to constants, functions and data structures?


    FunPtr

    FunPtr 仅在您想将函数作为一等值越过 FFI 边界传递时才需要,不是用于调用外部函数。准确地说:

    FunPtr a 类型的值是指向可从外部代码调用的函数的指针。类型 a 通常是一个外来类型,一个有零个或多个参数的函数类型

    一个例子,注册一个回调函数:

    foreign import ccall "stdlib.h &free"
       p_free :: FunPtr (Ptr a -> IO ())
    

    由于我们必须将p_free 本身传递给 Haskell 函数,我们必须让 Haskell 知道这实际上是一个 C 函数。 FunPtr 包装器控制它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多