3

有一个 C 函数将一些字符串返回给提供的指针:

void    snmp_error(netsnmp_session *sess, int *clib_errorno,
                       int *snmp_errorno, char **errstring);

Perl6 版本是:

sub snmp_error(Snmp-session, int32 is rw, int32 is rw, Str is rw) is native("netsnmp") { * };

snmp_error($sess, my int32 $errno, my int32 $liberr, my Str $errstr);
say $errno, " ", $liberr, " ", $errstr;

它返回正确的整数,但不是字符串:

0 -3(力量)

它只是一个错误还是这里有什么问题?

perl6 -v
This is Rakudo version 2016.12 built on MoarVM version 2016.12
implementing Perl 6.c.

同样在

This is Rakudo version 2017.09 built on MoarVM version 2017.09.1
implementing Perl 6.c.
4

3 回答 3

2

当我遇到同样的问题时,我翻译了这个:

gboolean notify_get_server_info (char **ret_name,
                                 char **ret_vendor,
                                 char **ret_version,
                                 char **ret_spec_version);

进入这个:

sub notify_get_server_info(Pointer[Str] $name is rw,
                           Pointer[Str] $vendor is rw,
                           Pointer[Str] $version is rw,
                           Pointer[Str] $spec_version is rw --> int32)
                           is native(LIB) { * }

这对我有用。

于 2017-09-26T08:32:45.377 回答
0

Fernando Santagata 的方法按预期工作:

sub snmp_error(Snmp-session, int32 is rw, int32 is rw, Pointer[Str] is rw) is native("netsnmp") { * };

my $e = Pointer[Str].new;
snmp_error($sess, my int32 $errno, my int32 $liberr, $e);
say "syserr=$errno liberr=$liberr error=", $e.deref;
于 2017-09-26T09:17:41.157 回答
0

我认为这是一个错误(或者更可能只是尚未完全实现)。

请参阅此处的答案以获得一些解决方法: 在 Perl 6 Nativecall 中传递指向指针的指针

于 2017-09-24T19:42:41.143 回答