私は、C++ で記述されたライブラリとのインターフェイスを試みるために、Cython を使用してきました。これまでのところ順調に進んでおり、ライブラリ内で MOST 関数を効果的に使用できます。私の唯一の問題は、コールバックの実装にあります。ライブラリには、次のような 4 つの関数定義があります。
typedef void (*Function1)(const uint16_t *data,
unsigned width, unsigned height);
void SetCallBack(Function1);
したがって、それらを実装するには、cython で次のようなことを行うと考えました。
ctypedef void (*Function1)(unsigned short *data,
unsigned width, unsigned height);
cdef extern from "lib.hpp":
void SetCallBack(Function1)
これは実際には正しくコンパイルされますが、コールバックが機能するように実際にそれを実装する方法を考えることができません。最初に、他の関数の場合と同様に、それを呼び出すだけの関数を作成しようとしましたが、次のようになりました。
def PySetCallBack(Func):
SetCallBack(Func)
しかし、それは私に(予測可能な)エラーを与えます:
「Python オブジェクトを 'Function1' に変換できません」
そうそう、それが私がいるところです。Cython でコールバックを設定した経験のある方がいらっしゃいましたら、よろしくお願いいたします。ありがとう。
編集:あなたのアドバイスに従って、次のようなcdefを使用して中間関数を作成しました:
cdef void cSetCallBack(Function1 function):
SetCallBack(function)
これは私を手に入れたようです...もっと近くに?少なくとも今は別のエラーが発生しています:
error: invalid conversion from ‘void (*)(short unsigned int*, unsigned int, unsigned int)’ to ‘void (*)(const uint16_t*, unsigned int, unsigned int)’
今、私が知る限り、これらのタイプは同一であるため、何が起こっているのかわかりません.
Edit2 : 新しい typedef を宣言することでその問題を修正しました:
ctypedef unsigned short uint16_t
それを呼び出す引数として使用しますが、実際にはそれ以上近づいていないようですが、その関数を呼び出そうとすると、同じ「Pythonオブジェクトを「Function1」に変換できません"エラーが再び発生しました。
というわけで、ほぼスタート地点に戻ってきました。私が今できることは、そのような ac 関数として入ってくる python オブジェクトを明示的にキャストすることだけですが、正直なところ、どうやってそれを行うのかわかりません。
3番目を編集してください:さて、あなたの答えを分析した後、私はついにそれを手に入れました、そしてそれはうまくいきました。私がやったことは、次のような関数を作成することでした:
cdef void cSetCallback(Function1 function):
SetCallback(function)
cdef void callcallback(const_ushort *data, unsigned width, unsigned height):
global callbackfunc
callbackfunc(data,width,height)
cSetCallback(callcallback)
def PySetCallback(callbackFunc):
global callbackfunc
callbackfunc = callbackFunc
したがって、唯一の問題は const_ushort *data を python オブジェクトに変換できないことですが、それはまったく別の問題であるため、これは解決されたと思います。どうもありがとうございました。