Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia ccall接口和符号问题_Julia - Fatal编程技术网

Julia ccall接口和符号问题

Julia ccall接口和符号问题,julia,Julia,我正试图使用Julia的ccall函数与C库接口。所有类型和指针都是正确的,下面的函数调用成功地返回了正确的答案(为简洁起见,此处未显示变量定义和设置) 但是,如果我希望将函数名生成为符号,然后将其用作ccall的参数,则会失败 fname = symbol(string("vDSP_conv", "D")) ccall((fname , libacc), Void, (Ptr{T}, Int64, Ptr{T}, Int64, Ptr{T}, Int64, UIn

我正试图使用Julia的
ccall
函数与C库接口。所有类型和指针都是正确的,下面的函数调用成功地返回了正确的答案(为简洁起见,此处未显示变量定义和设置)

但是,如果我希望将函数名生成为符号,然后将其用作
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
块中,以使其正常工作;然而,我仍然对后端逻辑感到好奇,为什么上面的语法不起作用(为什么它有时将符号解释为指针,而有时则不解释为指针)

ccall
实际上不是一个函数——它是一种语法形式,使用C ABI转换为C函数调用。要发出对C函数的调用,您需要能够静态解析函数的地址——这就是这个需求的来源。注意,在C和Julia中,也可以使用变量函数指针调用函数。在Julia中,有几种方法可以获取这样的指针,通常使用
dlopen
dlsym
ccall
不会用非常量名称解析函数:这在C语言中是不可能的(如果不构建查找表);在Julia中,您可以通过使用
eval
来实现这一点,正如您所了解的,但这样做会带来编译器开销。这就是为什么
ccall
不会自动执行此操作的原因:例如,您不想冒在循环中意外引入编译器开销的风险。

正如文档所说,有没有一种方法可以使用
const
Pair()
?感谢
ccall
的说明性解释;解释了我想知道的一切!
julia> println(typeof(:vDSP_convD))
       Symbol
julia> println(typeof(fname))
       Symbol