ジュリアのccall
関数を使用してCライブラリとのインターフェイスを確立しようとしています。すべての型とポインタが正しく、以下の関数呼び出しは正解を返すようになりました(簡潔にするためにここでは示していない変数定義と設定)。私は、シンボルとしての機能名を生成し、その後ccall
に引数としてそれを使用したい場合はジュリアのccallインターフェイスと記号に関する問題
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)
しかし、それは失敗します。
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}
私は、これら2つの命名のバージョンのそれぞれの種類を印刷する場合、私は
julia> println(typeof(:vDSP_convD))
Symbol
julia> println(typeof(fname))
Symbol
この作業を取得する方法はありますを取得しますか?私はこの作業をするためにマクロまたは@eval
でこれをラップする必要があると推測していますが、上記の機能がなぜ表示されているように機能しないのか不思議です。
ご協力いただければ幸いです。私はそれが仕事を得るために@eval
ブロックでこれをラップ終わった
EDIT
。しかし、私はまだ上記の構文がうまくいかない理由(なぜそれは時々ポインタを記号として解釈するのか、それ以外の時は解釈しないのか)についてのバックエンドの論理について興味があります
["(:function、" library ")のペアは定数である必要があります]](http://docs.julialang.org/ja/latest/manual/calling-c-and-fortran-code/ #calling-cとfortran-code) – Gnimuc
これを 'const'や' Pair() 'を使って作る方法はありますか? –