我想将一个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类型,但是这个我有问题。
答案 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]