首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl 6中,如何使用NativeCall接口从原始字节转换为浮点?

在Perl 6中,如何使用NativeCall接口从原始字节转换为浮点?
EN

Stack Overflow用户
提问于 2018-04-29 11:15:32
回答 1查看 170关注 0票数 9

这个对话在Perl 6 IRC通道中进行。和Martin发布的一个问题中,我试图使用Perl6 NativeCall接口来实现复制这个C代码,该接口就是为此目的而使用的。这就是我尝试过的:

代码语言:javascript
复制
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;

这会产生一个错误:

代码语言:javascript
复制
This type cannot unbox to a native integer: P6opaque, Any

我把它解释为,好吧,你已经把它声明为一个整数,我不能把它变成原始内存,这样就可以从这里复制到那里。

这只是回答Martin提出的更普遍的问题的一种可能的方式:如何将原始字节转换为浮点数。也许还有其他方法可以做到这一点,但无论如何,我都很想知道如何将C程序转换为NativeCall等价物。

更新:同时,这是另一篇文章试图解决的问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-29 11:44:25

使用一个联合(所有字段共享相同的内存空间)可能是最自然的方式。宣布成立这样的工会:

代码语言:javascript
复制
my class Convertor is repr<CUnion> {
    has uint32 $.i is rw;
    has num32 $.n is rw;
}

然后使用它进行转换:

代码语言:javascript
复制
my $c = Convertor.new;
$c.i = 0b1000010111101101100110011001101;
say $c.n  # 123.4000015258789

另一个问题与问题的实质无关,但存在于已发布的代码中:本机整数和数字次数不需要对它们执行.new,因为它们不是对象类型。这是:

代码语言:javascript
复制
my uint32 $num = .new;

应该是:

代码语言:javascript
复制
my uint32 $num;

和:

代码语言:javascript
复制
my num32 $float = .new: Num(1.0);

应该是:

代码语言:javascript
复制
my num32 $float = 1e0;

在Perl 6中,e指数的使用使文字成为浮点。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50085953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档