朱莉娅在ccall之后没有修改参数

时间:2015-03-07 22:57:18

标签: julia

知道为什么这个函数不修改'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

2 个答案:

答案 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