2015-03-31 11 views
6

Sto cercando di passare una struct C a Julia usando ccallRestituzione di strutture C by-valore a Julia

Ecco il mio file in 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; 
} 

Poi ho compilare questo in una libreria condivisa per usare con Julia.

Ecco il mio file di Julia:

immutable TestStruct 
    a::Cfloat 
    b::Cfloat 
end 

struct = ccall((:getStruct, "libteststruct"), TestStruct,()) 
println("Got struct a: ", struct.a, " b: ", struct.b) 

Quando eseguo questo file mi aspetto di ottenere

Created struct a: 3.000000 b: 5.000000 
Got struct a: 3.0 b: 5.0 

Tuttavia, sono invece ottenendo

Created struct a: 3.000000 b: 5.000000 
Got struct a: 3.0 b: 0.0 

a è sempre corretto ma b è sempre 0.

Questo funziona quando uso i double nella struct invece dei float, ma ho bisogno di usare float.

Grazie.

+0

Quale piattaforma e quale versione di Julia? (potrebbe essere rilevante) – IainDunning

+0

Sto usando 64 bit Mac OS X Mavericks e Julia 0.3.7 – Zach

risposta

4

Se si utilizza Julia v0.3.x, ccall non gestisce correttamente le strutture di ritorno tramite la convenzione di chiamata. Si può provare a cambiare l'utilizzo ccall a questo:

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

Questo problema può essere fissato su Julia master (0.4-dev), in modo da poter provare anche quello e vedere come va.

+0

Grazie, questo funziona su Julia 0.4 – Zach

5

Questo funziona perfettamente per me su Julia master (0.4-dev) - su Windows per l'avvio. Il supporto completo della struttura di valore è stato solo di recente merged into master. Potrebbe sembrare (tipo di) lavorare su 0.3 ma non è ufficialmente supportato e dovrebbe probabilmente essere un errore.