从 Julia 调用 div C 函数

标签 c julia

我正在尝试熟悉从 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/

相关文章:

c - 使用C中的套接字将文件从客户端发送到服务器

Julia:添加包的问题 (BinDeps)

julia - Julia 中类型稳定的 do-blocks

julia - Julia中nx1数组和n元素数组的区别

julia - 四舍五入到 Julia 的下一个最大整数?

type-conversion - 如何将整数转换为字符

c - 确保在编译时初始化固定大小数组的所有元素

c - 为什么最高的元素没有返回?

c - 将 C 程序分成 void 函数

c - --PIC32MX 启动闪存上的填充命令