本机呼叫。如何获取一个字符串作为C函数的参数
NativeCall. How to get a string as a parameter of a C function
有一个 C 函数 returns 一些字符串指向提供的指针:
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;
它 returns 正确的是整数而不是字符串:
0 -3 (Str)
这只是一个错误还是这里有什么问题?
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.
我认为这是一个错误(或者更有可能只是尚未完全实现)。
请在此处查看一些解决方法的答案:
当我遇到同样的问题时,我翻译了这个:
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) { * }
这对我有用。
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;
有一个 C 函数 returns 一些字符串指向提供的指针:
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;
它 returns 正确的是整数而不是字符串:
0 -3 (Str)
这只是一个错误还是这里有什么问题?
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.
我认为这是一个错误(或者更有可能只是尚未完全实现)。
请在此处查看一些解决方法的答案:
当我遇到同样的问题时,我翻译了这个:
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) { * }
这对我有用。
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;