首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NativeCall中的位字段

NativeCall中的位字段
EN

Stack Overflow用户
提问于 2019-06-26 15:06:42
回答 1查看 96关注 0票数 8

我正在尝试为C图创建Perl6绑定,其中一个结构为它的一些属性设置了位字段,其值小于8。我应该如何在我的模块中表示它呢?

我尝试过使用is nativesize(x)特性定义自定义类型,但是CStructs只支持8位宽的倍数类型。

C示例代码:

代码语言:javascript
复制
struct Agtag_s {
    unsigned objtype:2;
}

我试过的是:

代码语言:javascript
复制
my native objtype is repr('P6int') is Int is nativesize(2) is export { }
class Agtag is repr('CStruct') is export {
    has objtype $.object-type;
}

试图在该代码中使用我的模块失败了,出现了以下错误消息:CStruct only supports native types that are a multiple of 8 bits wide (was passed: 2)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 16:13:07

下面是一个例子。我假设函数use_struct()是在库libslib中定义的:

代码语言:javascript
复制
#include <stdio.h>

struct Agtag_s {
    unsigned objtype:2;
    unsigned footype:4;
    unsigned bartype:6;
};

void use_struct (struct Agtag_s *s) {
    printf("sizeof(struct Agtag_s): %ld\n", sizeof( struct Agtag_s ));
    printf("objtype = %d\n", s->objtype);
    printf("footype = %d\n", s->footype);
    printf("bartype = %d\n", s->bartype);
    s->objtype = 3;
    s->footype = 13;
    s->bartype = 55;
}

然后在Perl 6中:

代码语言:javascript
复制
use v6;
use NativeCall;

class Agtag is repr('CStruct') is export {
    has int32 $.bitfield is rw;
}

sub use_struct(Agtag $s is rw) is native("./libslib.so") { * };

my $s = Agtag.new();
my $objtype = 1;
my $footype = 7;
my $bartype = 31;
$s.bitfield = $objtype +| ($footype +< 2 ) +| ($bartype +< 6);
say "Calling library function..";
say "--------------------------";
use_struct( $s );
say "After call..";
say "------------";
say "objtype = ", $s.bitfield +& 3;
say "footype = ", ($s.bitfield +> 2) +& 15;
say "bartype = ", ($s.bitfield +> 6) +& 63;

输出

代码语言:javascript
复制
Calling library function..
--------------------------
sizeof(struct Agtag_s): 4
objtype = 1
footype = 7
bartype = 31
After call..
------------
objtype = 3
footype = 13
bartype = 55
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56775926

复制
相关文章

相似问题

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