2017-09-24 83 views
3

有它返回一些字符串到提供指向C函數的參數:NativeCall。如何獲得一個字符串作爲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(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. 

回答

2

當我與我翻譯這個同樣的問題搏鬥爲了我。

0

我認爲這是一個錯誤(或者說更可能只是還沒有完全實現)。

見的答案在這裏對一些變通:

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) { * } 

其中工程 Passing pointer to pointer in Perl 6 Nativecall

0

費爾南多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; 
相關問題