【发布时间】:2016-03-08 23:05:14
【问题描述】:
我正在尝试使用 Julia 的 ccall 函数与 C 库进行交互。所有类型和指针都是正确的,并且下面的函数调用成功地返回了正确的答案(为简洁起见,此处未显示变量定义和设置)。
ccall((:vDSP_convD, libacc), Void,
(Ptr{T}, Int64, Ptr{T}, Int64, Ptr{T}, Int64, UInt64, UInt64),
x_padded, 1, pointer(K, Ksize), -1, result, 1, Rsize, Ksize)
但是,如果我希望将函数名生成为符号,然后将其用作ccall 的参数,则会失败。
fname = symbol(string("vDSP_conv", "D"))
ccall((fname , libacc), Void,
(Ptr{T}, Int64, Ptr{T}, Int64, Ptr{T}, Int64, UInt64, UInt64),
x_padded, 1, pointer(K, Ksize), -1, result, 1, Rsize, Ksize)
错误是:
ERROR: LoadError: TypeError: conv: in ccall: first argument not a
pointer or valid constant expression, expected Ptr{T},
got Tuple{Symbol,ASCIIString}
如果我打印这两个命名版本的类型,我会得到
julia> println(typeof(:vDSP_convD))
Symbol
julia> println(typeof(fname))
Symbol
有没有办法让它工作?我猜我必须将它包装在一个宏或@eval 中才能完成这项工作,但我很好奇为什么上述功能不能如图所示工作?
任何帮助将不胜感激!
编辑
我最终将其包装在 @eval 块中以使其工作;但是,我仍然对后端逻辑感到好奇,为什么上述语法不起作用(为什么它有时将符号解释为指针,而其他时候则不)
【问题讨论】:
-
有没有办法使用
const或Pair()来完成这项工作?
标签: julia