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

标签 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(或 .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/

相关文章:

c++ - strlen() 给出错误的大小,导致数组中出现空字节

c - 将各种参数从 C 传递到汇编器

julia - 如何按实部和虚部对复数进行排序

julia - 如何在宏中将字符串转换为特定的枚举类型?

Julia:检查数组条目是否为 undef

java - 为什么两种技术中的相同代码表现不同

c - 如何在 vi/vim 中查找 C 代码中函数的调用者和被调用者?

arrays - 我应该使用 collect 还是 Array 在 Julia 中浅拷贝一个数组

c - 生成守护函数和信号处理程序

julia - Julia 类型图如何处理数组?