Quelqu'un peut-il expliquer pourquoi ce ccall fonctionne quand je spécifie explicitement le type, mais Julia échoue avec "error interpreting ccall argument tuple" quand j'utilise typeof pour spécifier le type?Julia typeof in ccall
type Foo
end
type Boo
eq::Ptr{Foo}
buf::Array{Float32,1}
s::Array{UInt8,1}
end
function new_boo(p1, p2, p3, p4, p5)
b = Boo(C_NULL,zeros(p1*2),zeros(div(p1,2)))
eqref = Ref{typeof(b.eq)}(C_NULL)
res = ccall((:myfunc, "mydll.dll"), stdcall, Cint, (Ptr{typeof(b.eq)}, Int32, Int8, Int8, Int8, Int8),
eqref, p1, p2, p3, p4, p5)
b.eq = eqref[]
b
end
Si j'imprimer Ptr{typeof(b.eq)}
et Ptr{Ptr{Foo}}
, ils affichent le même. Si je compare avec is()
, ils sont égaux. Quelle est la différence? J'ai également essayé d'attribuer v = typeof(b.eq)
à une variable d'abord et ensuite en passant Ptr{v}
, mais cela n'a pas aidé.
Ce que j'ai réellement est 'struct opaque_obj **', qui alloue la mémoire dans new_boo et réaffecte le pointeur externe de l'appelant. Le code que j'ai fourni était la seule façon de comprendre comment faire l'appel c - pas nécessairement le meilleur moyen. – Todd
'Ptr {Ptr {Void}}' est également disponible. –