我试图使用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“应该强制指针指向指针,并且它应该以第一种方式工作。
我做错了什么?
发布于 2017-09-26 09:26:23
在2017.09版中,这个方法适用于我:
class Pdu is repr('CStruct') { ... }
sub snmp_synch_response(Snmp-session, Pdu, Pointer[Pdu] is rw) returns int32 is native("netsnmp") { * };
my $p = Pointer[Pdu].new;
my $status = snmp_synch_response($ss, $pdu, $p);
say $status, "-", $p;
my $resp = $p.deref;
say $resp;https://stackoverflow.com/questions/43543217
复制相似问题