我正在尝试将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.
这在我在结构中使用双精度而不是浮点数时有效,但我需要使用浮点数.
谢谢.
这对我来说在Julia master(0.4-dev)上运行正常 - 在Windows上启动.完全按值结构支持最近才合并到master中.它可能看起来(有点)在0.3上工作但是没有得到官方支持,应该是一个错误.
如果您使用的是 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) 上得到修复,所以你也可以尝试一下,看看效果如何。
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |