jjm*_*elo 9 perl6 data-representation nativecall
从这段对话中,Perl 6的IRC频道,并发布由马丁·巴特的问题时,我试图重现此C代码使用Perl6 NativeCall接口,用于与该目的.这是我尝试过的:
use NativeCall;
my uint32 $num = .new;
my num32 $float = .new: Num(1.0);
sub memcpy(num32 $float, uint32 $num, int32 $size) is native('Str') { * };
memcpy($float,$num,4);
say $num;
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
This type cannot unbox to a native integer: P6opaque, Any
Run Code Online (Sandbox Code Playgroud)
我将其解释为,您已将其声明为整数,我无法将其转换为原始内存,以便可以从此处复制到此处.
这只是回答Martin Barth更常见问题的一种可能方式:如何将原始字节转换为浮点数.也许有其他方法可以做到这一点,但无论如何我都很想知道如何将C程序转换为NativeCall等价物.
更新:与此同时,这是其他帖子试图成为解决方案的原始问题.
使用union(所有字段共享相同的内存空间)可能是最自然的方式.声明这样的联合:
my class Convertor is repr<CUnion> {
has uint32 $.i is rw;
has num32 $.n is rw;
}
Run Code Online (Sandbox Code Playgroud)
然后用它来做转换:
my $c = Convertor.new;
$c.i = 0b1000010111101101100110011001101;
say $c.n # 123.4000015258789
Run Code Online (Sandbox Code Playgroud)
另一个与问题的内容无关的问题,但在发布的代码中出现:本机整数和数字时间永远不需要对它们进行.new完成,因为它们不是对象类型.这个:
my uint32 $num = .new;
Run Code Online (Sandbox Code Playgroud)
应该只是:
my uint32 $num;
Run Code Online (Sandbox Code Playgroud)
和:
my num32 $float = .new: Num(1.0);
Run Code Online (Sandbox Code Playgroud)
应该只是:
my num32 $float = 1e0;
Run Code Online (Sandbox Code Playgroud)
e指数的使用是使文字在Perl 6中浮动的原因.