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

时间:2019-02-10 16:41:09

标签: c julia

通过引用调用从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文档提供了ccallhttps://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/index.html)的示例,但始终将数组作为返回数据。

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

1 个答案:

答案 0 :(得分:0)

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

如果需要修改Julia值,则需要更改或将其包装为引用类型。您可以使用Array来使用,但是更常见的方式是将Ref包装起来。因此,尝试使用i初始化Ref(Int32(42))。您可以使用i[]取消引用该值。