【问题标题】:Correct way to call C function from Julia with call-by-reference?通过引用调用从 Julia 调用 C 函数的正确方法?
【发布时间】:2019-07-04 05:49:09
【问题描述】:

通过引用调用从 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(或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) 的示例,但始终使用数组作为返回数据。

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

【问题讨论】:

    标签: c julia


    【解决方案1】:

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

    如果您需要修改 Julia 值,则需要将其更改或包装在引用类型中。您可以使用Array,正如您已经知道的那样,但更常用的方法是用Ref 包装它。所以,尝试用Ref(Int32(42)) 初始化i。您可以使用 i[] 取消引用该值。

    【讨论】:

    • 感谢您的回答,我在Julia documentation中找到了相应的解释。显然i=Ref(Int32(42)) 就像一个零大小的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2020-02-24
    相关资源
    最近更新 更多