【发布时间】:2017-03-07 20:12:14
【问题描述】:
这个问题是Julia - C interface with nonfundamental types 的后续问题,有足够的新信息被视为另一个问题。我使用的 C 库有两种类似的类型,以及 mystruct 的三种可能版本:
struct contained {
int x;
int y;
int z;
};
struct mystruct {
int n;
//original:
// contained* arr;
//struct hack version 1:
// contained arr[1];
//struct hack version 2:
contained arr[];
};
使用原始问题的答案,我定义了以下相应的 Julia 类型,它们适用于 mystruct 的原始版本,但不适用于使用 struct hack 的任何一个版本:
type contained
x::Cint
y::Cint
z::Cint
end
type mystruct
n::Cint
arr::Ptr{contained}
end
如果我从 Julia 调用返回 Ptr{mystruct} 的 C 函数并将其保存为 ms,我可以输入 m = unsafe_load(ms) 并查看 m.n 和指针 m.arr,但我只能检查它的值在原始情况下使用unsafe_load(m.arr)。否则 unsafe_load(m.arr) 会导致段错误。 Julia 中处理包含以这种方式定义的可变长度数组的 C 结构的正确方法是什么?我只会使用mystruct 的原始定义和contained *arr,因为它可以按预期工作,但我也需要适用于其他情况的代码。
【问题讨论】: