問題タブ [python-cffi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Ctypes: C 定義からのデータ型
関数のアドレスとその「cのような」表現も持っています(llvmliteからですが、これはそれほど重要ではありません)。
2 つの double 値を加算して返す関数の場合、コードは次のようになります。cfunc = CFUNCTYPE(c_double, c_double, c_double)(func_ptr)
それは非常にうまく機能しますが、私の関数の引数は型と数が異なる場合があります。Pythonでは、これはいくつかのfor arg in args
ジェネレーターで解決できます。
ただし、自分の型を ctype の型に「変換」または解析する方法はありません (または、少なくとも見つかりませんでした)。
引数はllvmlite-Typeオブジェクトなので、c のような型表現が利用可能です。
私のアプローチは、llvmlite-Type オブジェクト、または c-representation を ctypes の Type オブジェクトにマップできる dict を作成することです。小さなパーサーも役立ちます。
ctype はすでにこのようなものを提供していませんか? 魔法の機能:
ctypes.magic("double") == ctypes.c_double
私は ctypes に縛られていません。CFFI が存在することは知っていますが、経験がなく、ドキュメントを見る限り、単一の関数アドレスの基本的な解決策さえ見つけることができませんでした。
これらのライブラリはどちらも特定の関数のアドレスではなく、ライブラリに関心があるため、私の使用例はかなりまれであることを認識しています。
python - Python CFFI が typedef を cdef() から生成された C ファイルにコピーしない
生成されたヘッダー ファイルを にフィードしていますffi.cdef()
。先頭に次のような typedef がたくさんあります。
それから私はそれをコンパイルしようとします:
しかし、次のような C コードを生成します。
LE_GPIO_EDGE_RISING
シンボルがどこにも定義されていない (または他の場所で参照されていない) ため、ビルドが失敗します。