通过引用调用从 Julia 调用 C 函数的正确方法是什么?
我正在尝试使用 Julia 的 ccall
调用一个 C 函数,它将其输出作为指针。
所以 C 函数应该做这样的事情:
void plusOne(int* i){
printf("C: i = %i\n", i[0]);
i[0] = i[0]+1;
printf("C: i = %i\n", i[0]);
}
用 gcc -shared -fPIC plusOne.c -o plusOne.dll
(或 .so
在 Linux 上)编译它并在 Julia 中运行:
julia> i = Int32(42)
42
julia> ccall((:plusOne, "plusOne.dll"), Cvoid, (Ref{Cint},),i)
C: i = 42
C: i = 43
julia> println("Julia: i = $i")
Julia: i = 42
从 Julia 中使用此类 C 函数的正确方法是什么?
Julia 文档有 ccall
( https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/index.html ) 的示例,但始终将数组作为返回数据。
当然,我也可以将我的 i
声明为大小为 1 的数组。然后一切都按预期工作。
最佳答案
Int32(42)
不是 Julia 中的引用类型,这就是您无法更新 C 函数中的值的原因。
如果需要修改 Julia 值,则需要更改或将其包装在引用类型中。正如您所知,您可以使用 Array
,但更常用的方法是用 Ref
包装它。因此,尝试使用 Ref(Int32(42))
初始化 i
。您可以使用 i[]
取消引用该值。
关于通过引用调用从 Julia 调用 C 函数的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618616/