如何在 Perl 6 中声明固定大小的本机数组?

2023-11-24

我试图在 Perl 6 中声明以下 C 结构:

struct myStruct
{
    int A[2]; //<---NEED to declare this
    int B;
    int C;
};

我的问题是我不知道如何声明int A[2];部分使用内置的 NativeCall api。

所以我所拥有的是:

class myStruct is repr('CStruct') {
    has CArray[int32] $.A;
    has int32 $.B;
    has int32 $.C;
};

然而,我知道,has CArray[int32] $.A;部分是错误的,因为它没有声明我的结构中仅占用 2 的部分int32 sizes.


更新2:事实证明,在我第一次发布这个答案时这不起作用,因此出现了评论。我still还没有测试过,但根据托比亚斯的回答,它肯定有效使用 NativeCall 将 CStruct 中的内联 CArray 传递到共享库. \o/


我还没有对此进行测试,但是在使用 Rakudo 编译器版本 2018.05 时应该可以工作:

use NativeCall;
class myStruct is repr('CStruct') {
    HAS int32 @.A[2] is CArray;
    has int32 $.B;
    has int32 $.C;
}
  • HAS代替has使属性成为内联属性而不是指针;

  • int32代替int是因为 Perl 6int类型与 C 的类型不同int类型而是特定于平台的(通常是 64 位);

  • @代替$将属性标记为Positional(“支持通过索引查找值”)而不是标量(被视为单个事物);

  • [2]“塑造”位置数据以具有 2 个元素;

  • is CArray绑定一个CArray作为位置数据的容器逻辑;

  • 这个承诺从今年四月开始连接上is repr('CStruct')使用声明的属性信息来适当地分配内存。

Fwiw我发现了这个功能搜索 #perl6 日志CArray发现它已经登陆master并且2018.05从在 Rakudo 提交中搜索提交消息标题.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Perl 6 中声明固定大小的本机数组? 的相关文章

随机推荐