首页 > 解决方案 > 通过引用调用从 Julia 调用 C 函数的正确方法?

问题描述

通过引用调用从 Julia 调用 C 函数的正确方法是什么?

我正在尝试使用ccall来自 Julia 的 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使用(或在 Linux 上)编译它.so并在 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 ) 的示例,但始终使用数组作为返回数据。

当然,我也可以将 my 声明i为大小为 1 的数组。然后一切都按预期工作。

标签: cjulia

解决方案


Int32(42)不是 Julia 中的引用类型,这就是为什么不能更新 C 函数中的值的原因。

如果您需要修改 Julia 值,则需要将其更改或包装在引用类型中。你可以使用Array你已经知道的,但更常用的方法是用Ref. 因此,请尝试i使用Ref(Int32(42)). 您可以使用 取消引用该值i[]


推荐阅读