我正在尝试在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大小的部分.
更新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提交的提交消息标题.
所以我对此做了一些实验,并查看了文档,看起来 CArray 类型处理整形的方式与 Perl6 数组不同。
最接近的东西是分配构造函数,它预先分配数组中的空间,但它不会强制指定大小,因此您可以添加更多内容。
您的类定义很好,但您希望在BUILD子方法中分配数组。
https://docs.raku.org/language/nativecall#Arrays
(进一步思考)
你可以有两个对象。一份是内部的,一份是结构的。
该结构有一个CArray[int32]数组。内部数据对象有一个整形的 int32 强制转换数组my int3 @a[2]。然后你只需要在两者之间复制即可。
getter 和 setter 位于主对象上,而当您想与 lib 对话时才使用 struct 对象?
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |