c - 通过引用调用从 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 的数组。然后一切都按预期工作。
解决方案
Int32(42)
不是 Julia 中的引用类型,这就是为什么不能更新 C 函数中的值的原因。
如果您需要修改 Julia 值,则需要将其更改或包装在引用类型中。你可以使用Array
你已经知道的,但更常用的方法是用Ref
. 因此,请尝试i
使用Ref(Int32(42))
. 您可以使用 取消引用该值i[]
。
推荐阅读
- vba - ShapeNode 的 Points 属性在 MS Word 中失败
- html - Wordpress 在第二页上调整特色产品的大小
- ansible - 当 Ansible 角色中的 ssh 命令行有条件时
- azure - 在 Azure Application Insights 中使用 Serilog 中的 outputTemplate 参数
- python - Far Commander 中的 Anaconda Promt。我怎样才能添加它?
- python - 如何向 cosmosdb 的特定位置/区域发送查询或存储过程执行请求?
- java - 使用 google fit android api 读取数据时出现“任务尚未完成错误”
- c - 如何在 C 中调用“@”at-symbol 引号?
- python - 我无法在 pandas csv 中保存 N/A
- css - 将带有 box-shadow 的 CSS 星形转换为 PNG 图像以提高性能