我想translate
以下C函数:
static void my_C_func(int *x) {
*x = 100;
return;
}
成朱莉娅的功能。也许:
function my_julia_func(x::Ptr{Cint})
*x = 100
return
end
在my_julia_func
中,*x = 100
的行当然不起作用。该怎么办?
仅仅是为了获取更多信息,my_C_func
是C中的回调函数,我正在尝试为回调创建Julia包装器。
更新
好像是Ptr(x)=100
。我测试了两个指针参数:
function my_julia_func(x::Ptr{Cint}, y::Ptr{Cint})
Ptr(x) = 100
Ptr(y) = 200
println("*x = ", Ptr(x))
println("*y = ", Ptr(y))
end
结果是
*x = 200
*y = 200
似乎很奇怪。如果我这样做:
function my_julia_func(x::Ptr{Cint}, y::Ptr{Cint})
Ptr(x) = 100
println("*x = ", Ptr(x))
Ptr(y) = 200
println("*y = ", Ptr(y))
end
我获得:
*x = 100
*y = 200
我该如何正确地做到这一点?
当我刚刚打印x
和y
时,它会显示:
x = Ptr{Int32} @0x00007fff5d57685c
y = Ptr{Int32} @0x00007fff5d576858
答案 0 :(得分:4)
Ptr(x) = 100
定义了一个局部函数,遮蔽了Ptr
的全局定义。这根本不是您想要的,这就是为什么定义Ptr(y) = 200
会改变Ptr(x)
的价值的原因。 <{1}}无论如何都不会取消引用指针,因此这不是正确的函数。
你想:
Ptr
(function my_julia_func!(x::Ptr{Cint})
unsafe_store!(x, 100)
nothing
end
与您的nothing
服务的目的相似,但更具惯用性
同样地,&#34; dereference&#34; return
,您需要x
。请注意,这些操作是unsafe_load(x)
,因此您可以确保在执行操作之前知道自己在做什么,或者存在分段错误或内存损坏的风险。 (虽然它们不比C&C的指针解除引用更安全。)