2015-03-31 16 views
6

Próbuję przekazać C struct Julia używając ccallPowracający elemencie C za-wartość Julia

Tu jest mój plik w 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; 
} 

Potem skompilować to pod wspólną bibliotekę używaj z Julią.

Oto mój plik Julia:

immutable TestStruct 
    a::Cfloat 
    b::Cfloat 
end 

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

Kiedy uruchamiam ten plik Spodziewam się dostać

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

Jestem jednak zamiast coraz

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

a jest zawsze poprawne, ale b jest zawsze 0.

Działa to, gdy używam podwójnych w struct zamiast unoszących się, ale muszę użyć pływaków.

Dziękuję.

+0

Jaka platforma i która wersja Julii? (może być istotne) – IainDunning

+0

Używam 64-bitowych Mac OS X Mavericks i Julii 0.3.7 – Zach

Odpowiedz

4

Jeśli korzystasz z Julia v0.3.x, ccall nie obsługuje poprawnie zwracających struktur przez konwencję wywołującą. Można spróbować zmienić wykorzystanie ccall do tego:

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

Ten problem może być ustalona na Julia mistrza (0,4-dev), dzięki czemu można również spróbować i zobaczyć jak to działa.

+0

Dziękuję, to działa na Julia 0.4 – Zach

5

Działa to dobrze dla mnie na master Julia (0.4-dev) - na Windows do rozruchu. Pełne wsparcie strukturalne dla wartości dodanej było dopiero niedawno merged into master. Może wyglądać na (rodzaj) pracy na 0.3, ale nie jest oficjalnie obsługiwany i prawdopodobnie powinien być błędem.