通过Julia的C接口将值赋给`* x`

时间:2016-04-22 12:09:13

标签: c interface julia

我想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

我该如何正确地做到这一点?

当我刚刚打印xy时,它会显示:

x = Ptr{Int32} @0x00007fff5d57685c
y = Ptr{Int32} @0x00007fff5d576858

1 个答案:

答案 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的指针解除引用更安全。)