球拍FFI-C数组(_array)用法示例

时间:2019-06-25 17:52:46

标签: arrays racket ffi

我包装了一个C函数,该函数将指针作为参数,然后根据另一个参数将其视为int指针,float指针或int或float数组。该功能是游戏中渲染器的一部分,每秒被调用多次(60+)次。

因此,我知道我可以使用document.ready传递数组类型参数,但是

  • 它会碎片堆吗?如果我理解正确,则球拍在每次调用之前调用_list,然后在调用之后malloc

  • 它需要一种特定的类型,因此我将不得不创建2个函数(一个用于free,一个用于_int),这并不理想

    < / li>

我偶然发现了https://docs.racket-lang.org/foreign/C_Array_Types.html,这似乎正是我想要的-效率更高(“不复制数组; Racket表示由基础C表示支持”),并且还适用于一种类型(“它可以具有不同的元素类型,只要该类型与预期类型的​​布局匹配即可)”。

问题是,我似乎找不到从球拍一侧构造它的方法?这些所有语句都返回_float,我没主意了

#f

1 个答案:

答案 0 :(得分:2)

make-array-type_array函数创建C types,它们是普通的Racket运行时值,它们描述了如何在C级表示形式之间来回转换各种类型的值:例如, _unt8是C类型。谓词array?识别由基于_array的C类型而不是C类型本身表示的实际值。

关于构造数组值,the docs说:

  

由于将数组视为结构,因此将指针类型强制转换为数组类型不起作用。而是使用带有指针的ptr-ref,使用_array构造的数组类型以及索引0将指针转换为可与array-ref和array-set!一起使用的Racket表示形式。

这是实际操作的方式-文档可以使用示例:

#lang racket

(require ffi/unsafe
         rackunit)

(define 5floats (_array _float 5))

(check-true
 (array? (ptr-ref (malloc 5floats) 5floats)))

供以后参考,与在Stack Overflow上相比,球拍用户的邮件列表和Slack上的Racket社区更加活跃。