将递归定义的结构转换为Julia for C接口

时间:2017-04-05 14:23:04

标签: c data-structures struct julia

我想将一个Julia接口写入C库。对我来说,有必要 将C结构转换为Julia类型。这是必要的,因为我想做 使用ccall调用C函数。

    struct my_struct {

        struct my_struct * child; 
        int a;

        struct A_st{
            int c; 
            int (*f1) (struct my_struct * eqn); 
            int (*f2) (struct my_struct * eqn); 
            int (*f3) (struct my_struct * eqn); 
        } A; 
    };

我知道Julia在循环定义类型方面存在问题 https://github.com/JuliaLang/julia/issues/269 “简单”定义的结构我已经映射到julia类型,但是这个我有问题。

1 个答案:

答案 0 :(得分:3)

首先声明内部结构,然后将其用作成员:

struct A_st
  c::Cint
  f1::Ptr{Void}
  f2::Ptr{Void}
  f3::Ptr{Void}
end

struct my_struct
  child::Ptr{my_struct}
  a::Cint
  A::A_st
end

未经测试,但Julia对齐看起来是正确的:

julia> map(i -> Int(fieldoffset(my_struct,i)), 1:3)
3-element Array{Int64,1}:
  0
  8
 16

julia> map(i -> Int(fieldoffset(A_st,i)), 1:4)
4-element Array{Int64,1}:
  0
  8
 16
 24

VS

clang -cc1 -fdump-record-layouts t.cpp

*** Dumping AST Record Layout
         0 | struct my_struct
         0 |   struct my_struct * child
         8 |   int a
        16 |   struct my_struct::A_st A
        16 |     int c
        24 |     int (*)(struct my_struct *) f1
        32 |     int (*)(struct my_struct *) f2
        40 |     int (*)(struct my_struct *) f3
           | [sizeof=48, dsize=48, align=8,
           |  nvsize=48, nvalign=8]