2015-03-31 40 views
6

我試圖通過使用ccall返回C的結構通過值朱莉婭

這裏C結構朱莉婭是我在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一起使用。

這裏是我的朱莉婭文件:

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

什麼平臺和哪個版本的Julia? (可能相關) – IainDunning 2015-03-31 18:39:18

+0

我正在使用64位Mac OS X Mavericks和Julia 0.3.7 – Zach 2015-03-31 18:39:42

回答

4

如果您使用的是Julia v0.3.x,則ccall不能正確處理通過調用約定返回的結構。你可以嘗試改變ccall使用這樣:

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

這個問題可以固定在朱莉婭大師(0.4-DEV),所以你也可以試試,看看是怎麼回事。

+0

謝謝,這是對Julia 0.4 – Zach 2015-03-31 18:48:50

5

這對我在茱莉亞大師(0.4-dev)上適用 - 在Windows上啓動。完整的按值結構支持最近纔是merged into master。它可能似乎(種)0.3工作,但沒有正式支持,應該可能是一個錯誤。