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

时间:2017-04-21 12:52:03

标签: perl6 nativecall

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

对于一种情况,我需要传递由更新的指针 函数,所以它需要一个指向指针的指针'void **'。

我试过这样:

ndb.StructuredProperty

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

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

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);
    }
}

这样工作得很好。似乎“rw”应该是强制性的 指向指针的指针,它应该以第一种方式工作。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:1)

这适用于版本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;