将C结构按值返回到Julia

Zac*_*ach 6 c struct julia

我正在尝试将C结构传递给Julia ccall

这是我在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;
}
Run Code Online (Sandbox Code Playgroud)

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

这是我的Julia文件:

immutable TestStruct
    a::Cfloat
    b::Cfloat
end

struct = ccall((:getStruct, "libteststruct"), TestStruct, ())
println("Got struct a: ", struct.a, " b: ", struct.b)
Run Code Online (Sandbox Code Playgroud)

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

Created struct a: 3.000000 b: 5.000000
Got struct a: 3.0 b: 5.0
Run Code Online (Sandbox Code Playgroud)

但是,我反而得到了

Created struct a: 3.000000 b: 5.000000
Got struct a: 3.0 b: 0.0
Run Code Online (Sandbox Code Playgroud)

a永远是正确的,但b始终0.

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

谢谢.

Isa*_*ton 5

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


Ste*_*ski 4

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

struct_buffer = Array(TestStruct)
ccall((:getStruct, "libteststruct"), Void, (Ptr{TestStruct},), struct_buffer)
struct = struct_buffer[]
Run Code Online (Sandbox Code Playgroud)

这个问题可能在 Julia master (0.4-dev) 上得到修复,所以你也可以尝试一下,看看效果如何。