将C结构按值返回给Julia

时间:2015-03-31 18:06:53

标签: c struct julia

我正在尝试使用ccall

将C结构传递给Julia

这是我在C:

中的文件
#include <stdio.h>

typedef struct {
    float a;
    float b;
} TestStruct;

TestStruct getStruct() {
    TestStruct s = {3.0f, 5.0f};
    printf("Created struct a: %f b: %f\n", s.a, s.b);
    return s;
}

然后我将其编译成一个共享库,与Julia一起使用。

这是我的Julia文件:

immutable TestStruct
    a::Cfloat
    b::Cfloat
end

struct = ccall((:getStruct, "libteststruct"), TestStruct, ())
println("Got struct a: ", struct.a, " b: ", struct.b)

当我运行此文件时,我希望得到

Created struct a: 3.000000 b: 5.000000
Got struct a: 3.0 b: 5.0

然而,我正在获取

Created struct a: 3.000000 b: 5.000000
Got struct a: 3.0 b: 0.0

a始终是正确的,但b始终为0

当我在结构中使用双精度而不是浮点数时,这是有效的,但我需要使用浮点数。

谢谢。

2 个答案:

答案 0 :(得分:5)

这对我来说在Julia master(0.4-dev)上运行正常 - 在Windows上启动。完全按价值的结构支持仅在最近merged into master。它可能看起来(有点)在0.3上工作但是没有得到官方支持,应该是一个错误。

答案 1 :(得分:4)

如果您使用的是Julia v0.3.x,ccall无法正确处理通过调用约定返回的结构。您可以尝试将ccall使用情况更改为:

struct_buffer = Array(TestStruct)
ccall((:getStruct, "libteststruct"), Void, (Ptr{TestStruct},), struct_buffer)
struct = struct_buffer[]

这个问题可以在Julia master(0.4-dev)上修复,所以你也可以尝试一下,看看它是怎么回事。