按值将 C 结构返回给 Julia
Returning C structs by-value to 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
.
当我在结构中使用双精度而不是浮点数时这有效,但我需要使用浮点数。
谢谢。
如果您使用的是 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) 上修复,因此您也可以尝试一下,看看效果如何。
这对我来说在 Julia master (0.4-dev) 上运行良好——在 Windows 上启动。完整的按值结构支持最近才 merged into master。它可能看起来(有点)在 0.3 上工作,但没有得到官方支持,可能应该是一个错误。
我正在尝试使用 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
.
当我在结构中使用双精度而不是浮点数时这有效,但我需要使用浮点数。
谢谢。
如果您使用的是 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) 上修复,因此您也可以尝试一下,看看效果如何。
这对我来说在 Julia master (0.4-dev) 上运行良好——在 Windows 上启动。完整的按值结构支持最近才 merged into master。它可能看起来(有点)在 0.3 上工作,但没有得到官方支持,可能应该是一个错误。