我包装了一个C函数,该函数将指针作为参数,然后根据另一个参数将其视为int指针,float指针或int或float数组。该功能是游戏中渲染器的一部分,每秒被调用多次(60+)次。
因此,我知道我可以使用document.ready
传递数组类型参数,但是
它会碎片堆吗?如果我理解正确,则球拍在每次调用之前调用_list
,然后在调用之后malloc
它需要一种特定的类型,因此我将不得不创建2个函数(一个用于free
,一个用于_int
),这并不理想
我偶然发现了https://docs.racket-lang.org/foreign/C_Array_Types.html,这似乎正是我想要的-效率更高(“不复制数组; Racket表示由基础C表示支持”),并且还适用于一种类型(“它可以具有不同的元素类型,只要该类型与预期类型的布局匹配即可)”。
问题是,我似乎找不到从球拍一侧构造它的方法?这些所有语句都返回_float
,我没主意了
#f
答案 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社区更加活跃。