我正在尝试熟悉从 Julia 调用 C
函数。
我在使用像 isalnum
这样简单的函数时遇到了一些麻烦。
运行
ccall( (:isalnum, "libc"), Bool, (ASCIIString,), "k")
总是返回错误。
我还尝试使用函数“div”,它返回商和除法提醒。为了存储这两个值,我创建了一个类型
type Foo
A::Int64
B::Int64
end
然后运行
t = ccall( (:div, "libc"), Foo, (Int64,Int64,), 7,3)
但是结果是错误的。
最佳答案
不幸的是,Julia 目前不支持从 ccalls 返回结构。有一个 open pull request实现这个在 0.3 发布周期中失败了并且没有被合并。如果支持(很快就会在 master 分支上),您将使用不可变 结构来使其工作。像这样:
julia> immutable Cdiv_t
q::Cint
r::Cint
end
julia> ccall(:div, Cdiv_t, (Cint,Cint), 7, 3)
Cdiv_t(2,2)
如您所见,这是错误的,因为 Cdiv_t
结构的剩余部分不正确(目前它始终与商部分相同)。使用不可变结构是必要的,因为可变结构需要将其组件作为单独分配的值存储在堆上——这与 C 结构布局不兼容。由于 Cdiv_t
是不可变的,它的组件可以内联存储,这就是 C 的做法。
另请注意使用 Cint
作为 C int
类型的 Julia 端镜像。这总是被定义为对应于 C 的 int
类型的正确类型——这并不总是那么容易确定。关于调用 C 和 Fortran 的章节包含 a full list对应于 C 类型的 Julia 类型。您通常希望在 Julia 代码中使用中间的列名称,因为它们可以在任何地方使用,而不仅仅是在您的系统上。
关于从 Julia 调用 div C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870010/