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

ann*_*uid 9 perl6 nativecall

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

struct myStruct
{
    int A[2]; //<---NEED to declare this
    int B;
    int C;
};
Run Code Online (Sandbox Code Playgroud)

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

所以我所拥有的是:

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

但是,我知道该has CArray[int32] $.A;部分是错误的,因为它没有在我的结构中声明只占用2个int32大小的部分.

rai*_*iph 6

更新2:事实证明,这在我第一次发布这个答案时没有用,因此评论.我仍然没有对它进行过测试,但根据Tobias的回答,使用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;
}
Run Code Online (Sandbox Code Playgroud)
  • HAS而不是has导致属性是内联而不是指针;

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

  • @而不是$将属性标记为Positional("支持按索引查找值")而不是标量(将其视为单个事物);

  • [2] "定位"位置数据有2个元素;

  • is CArray将a绑定CArray为Positional数据的容器逻辑;

  • 这从今年4月提交连线了is repr('CStruct')使用声明的属性信息,以适当地分配内存.

Fwiw我通过搜索#perl6日志找到了这个功能CArray,发现它已经登陆了master和2018.05,搜索了Rakudo提交的提交消息标题.


Sci*_*mon 3

所以我对此做了一些实验,并查看了文档,看起来 CArray 类型处理整形的方式与 Perl6 数组不同。

最接近的东西是分配构造函数,它预先分配数组中的空间,但它不会强制指定大小,因此您可以添加更多内容。

您的类定义很好,但您希望在BUILD子方法中分配数组。

https://docs.raku.org/language/nativecall#Arrays

(进一步思考)

你可以有两个对象。一份是内部的,一份是结构的。

该结构有一个CArray[int32]数组。内部数据对象有一个整形的 int32 强制转换数组my int3 @a[2]。然后你只需要在两者之间复制即可。

getter 和 setter 位于主对象上,而当您想与 lib 对话时才使用 struct 对象?