我正在尝试使用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;
}
然后我将其编译成一个共享库,与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
。
当我在结构中使用双精度而不是浮点数时,这是有效的,但我需要使用浮点数。
谢谢。
答案 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)上修复,所以你也可以尝试一下,看看它是怎么回事。