【问题标题】:Haskell FFI - C struct array data fieldsHaskell FFI - C 结构数组数据字段
【发布时间】:2013-07-29 21:31:56
【问题描述】:

我正在为具有相当复杂接口的本机库开发 haskell 绑定。它有很多结构作为其接口的一部分,我一直致力于使用 hsc2hsbindings-DSL 包为它们构建接口,以帮助自动化结构绑定。

不过,我遇到的一个问题是包含多维数组的结构。 bindings-DSL documentation 描述了用于绑定到类似

的结构的宏
struct with_array {
   char v[5];
   struct test *array_pointer;
   struct test proper_array[10];
};

使用类似宏

#starttype struct with_array
#array_field v , CChar
#field array_pointer , Ptr <test>
#array_field proper_array , <test>
#stoptype

但是这个库有很多结构体,多维数组作为字段,更像

struct with_multidimensional_array {
   int whatever;
   struct something big_array[10][25][500];
};

#array_field 宏似乎只处理数组的第一个维度。是不是bindings-DSL只是没有处理多维数组的宏?

我真的很想要一个用于将(可能是多维的)数组绑定到任意索引的StorableArray 的宏。似乎在bindings-DSL 提供的宏中可以提供必要的信息 - 只是没有宏。

有人向bindings-DSL 添加了宏吗?有没有人为此添加了一个宏到bindings-DSL?我是否已经超越了我应该使用 hsc2hs 做的事情,还有其他一些工具可以帮助我以更简洁的方式做我想做的事情?

【问题讨论】:

  • 我想我可以创建一个包装 StorableArray 的新类型,并带有专门针对该字段的 Storable 实例,并且只需使用 #field 宏。在没有任何更好的解决方案的情况下,这似乎很正常。

标签: haskell ffi


【解决方案1】:

好吧,没有人想出其他任何东西,所以我会在评论中提出这个想法。我将使用#field 宏而不是#array_field 宏,并指定包装StorableArray 的类型以正常工作。

由于我考虑了很多,我意识到可以完全抽象出包装器,使用 GHC 7.6+ 支持的新类型级数字。我整理了一个名为 storable-static-array 的包,它采用类型级别的维度并提供适当的 Storable 实例来处理本机数组,甚至是多维数组。

仍然缺少的一件事是我非常想找到一种方法来编写一个bindings-DSL 兼容的宏,它可以自动提取尺寸并负责正确生成它们。不过,对bindings-DSL 中的宏的一瞥让我确信,我自己的知识还不够多。

【讨论】:

    【解决方案2】:

    #array_field 宏处理任意维度的数组。文档已更新以明确显示。

    Haskell 等效记录将是一个列表。偷看和戳时,该列表元素的长度和顺序将对应于数组,因为它在 C 中被视为一维数组。因此,字段int example[2][3] 将对应于具有 6 个元素的列表,排序为example[0][0], example[0][1], example[0][2], example[1][0], example[1][1], example[1][2]。 poke 时,如果列表的元素超过 6 个,则只使用前 6 个。

    选择此设计是为了与 FFI 标准库中的 peekArray 和 pokeArray 保持一致。在bindings-DSL 的 1.0.17 版本之前,存在一个错误,当数组字段的维度大于 1 时,该错误会导致该列表的大小被低估。

    【讨论】:

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