gpt4 book ai didi

raku - 在 Perl 6 NativeCall 中将指针传递给指针

转载 作者:行者123 更新时间:2023-12-03 03:48:11 24 4
gpt4 key购买 nike

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

对于一种情况,我需要传入由函数,因此它需要一个指向指针“void **”的指针。

我尝试过这样的:

class Foo
{
has Pointer $.first;
has Pointer $.last;

sub somefunc(Pointer is rw, Pointer is rw, Str) is native { * }

method myfunc(Str $arg) {
somefunc($!first, $!last, $arg);
}
}

这不起作用。函数不会更新指针。

由于 C 数组基本上是一个指向指针的指针,所以我可以伪造它像这样:

class Foo
{
has Pointer $.first;
has Pointer $.last;

sub somefunc(CArray[Pointer], CArray[Pointer], Str) is native { * }

method myfunc(Str $arg) {
my $first = CArray[Pointer].new($!first);
my $last = CArray[Pointer].new($!last);
somefunc($first, $last, $arg);
$!first = $first[0];
$!last = $last[0];
}
}

这样就可以正常工作了。看起来“is rw”应该强制指向指针的指针,它应该以第一种方式工作。

我做错了什么?

最佳答案

最后我检查了一下,NativeCall 仍然有一些粗糙的边缘,有时需要一点创造力;这可能是其中一种情况。

我知道的一种解决方法是仅使用指针大小的整数(具体来说,size_tssize_t)作为 Perl6 端的参数和属性类型1 ,它应该按预期与 is rw 一起工作。

整数和指针之间的转换很容易:使用前缀+.Int甚至只是对整数类型变量进行赋值即可转换为整数,并且Pointer.new(…)nqp::box_i(…, Pointer) 用于另一个方向。

如果需要,可以使用访问器方法来自动执行此转换。

<小时/>

1 如果您这样做,诸如 constant intptr = ssize_t 这样的定义将有助于提高可读性

关于raku - 在 Perl 6 NativeCall 中将指针传递给指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43543217/

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