gpt4 book ai didi

raku - 将结构数组传递给 Perl 6 NativeCall 函数

转载 作者:行者123 更新时间:2023-12-02 01:46:22 25 4
gpt4 key购买 nike

我正在尝试使用 NativeCall 与一些 C 函数交互。

我有一个简单的 C 结构体和一个需要它们数组的函数。

struct foo {
int x;
char *s;
};

struct foo foo_array[3];

foo_array[0].x = 12;
foo_array[0].s = "foo";
foo_array[1].x = 27;
foo_array[1].s = "bar";
foo_array[2].x = -1;

void somefunc(foo_array);

我尝试了很多方法,但似乎都不太正确。

class foo is repr('CStruct') {
has int32 $.x;
has Str $.s
};

sub somefunc(CArray[foo]) is native { * }

my @foo-array := CArray[foo].new;

@foo-array[0] = ???
@foo-array[1] = ???
@foo-array[2] = ???

somefunc(@foo-array);

如何正确创建 foo 类的对象并设置它们的值,以及如何使它们的数组适合传递?

最佳答案

据我所知,没有内置的方法可以做到这一点。然而,有足够的绳子来吊死自己构建一个解决方法:

role StructArray[Mu:U \T where .REPR eq 'CStruct'] does Positional[T] {
has $.bytes;
has $.elems;

method new(UInt \n) {
self.bless(bytes => buf8.allocate(n * nativesizeof T), elems => n);
}

method AT-POS(UInt \i where ^$!elems) {
nativecast(T, Pointer.new(nativecast(Pointer, $!bytes) + i * nativesizeof T));
}

method pointer {
nativecast(Pointer[T], $!bytes);
}
}

这应该允许以下功能工作:

my @foo-array := StructArray[foo].new(10); # 'array' with 10 elements
@foo-array[0].x = 42;

通过将@foo-array.pointer传递给Pointer[foo]类型的参数,可以与C函数进行交互。由于结构也是通过指针传递的,因此您还可以将 @foo-array[0] 传递给 foo 类型的参数以获得相同的效果。

关于raku - 将结构数组传递给 Perl 6 NativeCall 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43544931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com