Julia:将`Ptr`或`Ref`与ccall和`cfunction`结合使用

时间:2017-01-30 09:58:28

标签: pointers pass-by-reference julia

我的主要问题是使用指针修改Julia中的内容。我知道Julia本身有这个不可变的概念,允许数组例如通过引用传递,如果数组的内容在函数中正确更改,那么我们也可以期望函数外部的更改值。但我想更多地询问cfunctionccall使用Ref{T}进行整合以更改内容,以使变量更改在特定循环或函数之外可见。

这是参考文档中的这个主题:Passing pointers for modifying inputs

我想知道如何使用Julia定义的函数以这种方式使用。我认为cfunction是我可以将我的Julia函数转换为C可理解的代码,然后我可以通过ccall调用它们,但是我没有成功。请考虑以下事项:

function foo(x::Ref{Cint})
    x+=convert(Cint,2)
    return x::Cint
end

y=Ref{Cint}(convert(Cint,2))
c_foo = cfunction(foo, Ref{Cint}, (Ref{Cint},),y)
ccall(:c_foo, Ref{Cint}, (Ref{Cint},), y)

对于cfunction,我得到:

MethodError: no method matching cfunction(::#foo, ::Type{Ref{Int32}}, ::Tuple{DataType}, ::Base.RefValue{Int32})

我想做的就是拥有变量y = 2并在函数内添加2更多,所以如果我打印y的值,我会得到{ {1}}。 (我不是指数组提供的答案。)

我的另一个问题是,在解决这个问题时,是否也可以使用自定义的Julia类型?

0 个答案:

没有答案