首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Julia更新C结构的字段值

从Julia更新C结构的字段值
EN

Stack Overflow用户
提问于 2016-11-07 04:59:55
回答 1查看 301关注 0票数 3

我的问题很简单,但我不知道最好的方法(或者Julia目前还没有提供这种方法):我如何从Julia设置C结构的字段值?

假设您有一个struct类型来表示C库中树的一个节点:

代码语言:javascript
复制
typedef struct node_s
{
    int type;
    node_t* next;
    node_t* children;
    node_t* parent;
} node_t;

把它复制到朱莉娅:

代码语言:javascript
复制
immutable node_t
    typ::Cint
    next::Ptr{node_t}
    children::Ptr{node_t}
    parent::Ptr{node_t}
end

现在假设您有一个指向C中分配的node_t的指针,并希望更新朱莉娅中的parent字段。我知道我们有unsafe_store!来更新指针指向的值,但是计算parent字段的指针偏移量很麻烦(在本例中,在我的64位计算机上是sizeof(Int) + sizeof(Ptr{node_t}) * 2 )。有更简单的方法来做同样的事情吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 05:37:33

该用例提供了fieldoffset函数:

代码语言:javascript
复制
julia> immutable node_t
           typ::Cint
           next::Ptr{node_t}
           children::Ptr{node_t}
           parent::Ptr{node_t}
       end

julia> fieldoffset(node_t, 1)
0x0000000000000000

julia> fieldoffset(node_t, 2)
0x0000000000000008

julia> fieldoffset(node_t, 3)
0x0000000000000010

julia> fieldoffset(node_t, 4)
0x0000000000000018

但是,也不要担心仅仅存储整个immutable,只需要修改一个字段;它将被优化掉。

代码语言:javascript
复制
julia> k = Ptr{node_t}(Libc.malloc(sizeof(node_t)))
Ptr{node_t} @0x00000000036194c0

julia> unsafe_load(k)
node_t(29544064,Ptr{node_t} @0x3038662d34363a34,Ptr{node_t} @0x3a386e2d3832313a,Ptr{node_t} @0x34363a32333a3631)

julia> update_parent(x::node_t, n::Ptr{node_t}) =
           node_t(x.typ, x.next, x.children, n)
update_parent (generic function with 1 method)

julia> mutate!(k) = unsafe_store!(k, update_parent(unsafe_load(k), Ptr{node_t}(0)))
mutate! (generic function with 1 method)

julia> @code_llvm mutate!(k)

define %node_t* @"julia_mutate!_70963"(%node_t*) #0 {
top:
  %1 = load %node_t, %node_t* %0, align 1
  %.fca.3.insert = insertvalue %node_t %1, %node_t* null, 3
  store %node_t %.fca.3.insert, %node_t* %0, align 1
  ret %node_t* %0
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40458122

复制
相关文章

相似问题

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