Pointers 朱莉娅:将'Ptr'或'Ref'与ccall和'cfunction'结合使用`

Pointers 朱莉娅:将'Ptr'或'Ref'与ccall和'cfunction'结合使用`,pointers,pass-by-reference,julia,Pointers,Pass By Reference,Julia,我的主要问题是关于使用指针修改Julia中的内容。我知道Julia本身就有一个不变的概念,例如允许数组通过引用传递,如果数组的内容在函数中正确更改,那么我们也可以期望在函数之外更改值。但是我想问更多关于cffunction和ccall的集成,使用Ref{T}来更改内容,使变量更改在特定循环或函数之外可见 这与文档中的此主题有关: 我想知道如何可以使用Julia定义的函数以这种方式使用。我认为cfunction可以将我的Julia函数转换成C-可理解的代码,然后我可以通过ccall调用它们,但是我

我的主要问题是关于使用指针修改Julia中的内容。我知道Julia本身就有一个不变的概念,例如允许数组通过引用传递,如果数组的内容在函数中正确更改,那么我们也可以期望在函数之外更改值。但是我想问更多关于
cffunction
ccall
的集成,使用
Ref{T}
来更改内容,使变量更改在特定循环或函数之外可见

这与文档中的此主题有关:

我想知道如何可以使用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)
对于C函数,我得到:

MethodError: no method matching cfunction(::#foo, ::Type{Ref{Int32}}, ::Tuple{DataType}, ::Base.RefValue{Int32})
我所要做的就是让一个变量
y=2
并在函数内部添加
2
更多,因此在函数外部,如果我打印
y
的值,我会得到
4
。(我不是指阵列提供的答案。)

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

c函数(foo,Ref{Cint},(Ref{Cint},),y)
是错误的。它应该是cfunction(foo,Ref{Cint},(Ref{Cint},))。这就是错误的原因。然而,当像这样使用
cfunction
时,它会将参数转换为
Cint
,当您调用
c\u foo
而不是
:c\u foo
时,您会得到方法错误。