知道为什么这个函数不修改'eta'参数但返回期望值?
function str2et!( date::String, eta::SpiceDouble )
ptr = convert(Ptr{ConstSpiceChar}, date)
et = Array(SpiceDouble,1)
ccall((:str2et_c,"/home/don/.julia/v0.3/cspice.so"),Void,(Ptr{ConstSpiceChar},Ptr{SpiceDouble}),
ptr,
et )
eta = et[1]
end
答案 0 :(得分:3)
您的问题类似于以下
function f(x)
x=1
end
该函数不修改参数,但替换。
y=2
f(y)
y # Still 2 -- no side effect
f(2) # Equivalent to f(y)
如果要修改值,可以定义自己的(可变)类型。
type Result
value
end
function g(x::Result)
x.value = 1
end
y=Result(2)
y.value # This is 2
g(y)
y.value # This is now 1
在这个例子中,当然,返回一个值会更清楚。
答案 1 :(得分:0)
制作一个可变类型不是答案;然而,制作一个单元素数组确实有效,但看起来效率不高(以下函数的code_native会产生几个汇编程序的屏幕)
void raxisa_c( double* x ) {
*x = 3;
}
function returnViaDoublePtr()
angle = Array{Float64}(1)
ccall((:raxisa_c,libNasaSpice),Void,
(Ptr{Float64},),
angle )
return angle[1]
end