我正在尝试使用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

当我在结构中使用double而不是float时,此方法有效,但我需要使用float。

谢谢你。

最佳答案

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

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

此问题可能已在Julia master(0.4-dev)上解决,因此您也可以尝试一下,看看效果如何。

10-08 07:35