1

これは私の他の質問と関係がありますが、私は新しい質問でそれを尋ねるべきだと感じました。

基本的に、FLACはコールバックに関数ポインターを使用し、ctypesを使用してコールバックを実装するにはCFUNCTYPE、それらのプロトタイプを作成してから、prototype()関数を使用してそれらを作成します。

これに関する問題は、コールバック関数をそのように作成することを考えたということです(再作成した構造体は表示していません。FLAC__Frameは構造体です)。

write_callback_prototype = CFUNCTYPE(c_int, c_void_p, 
                                     POINTER(FLAC__Frame), 
                                     POINTER(c_int32), v_void_p)

私が抱えている問題は実装です。FLAC__Frameはプログラマーによってインスタンス化されることはなく、初期化関数と処理関数からのみ呼び出されます。コールバック関数を自分で作成する必要がありますが、彼の問題は、これをどのように行うかわからないことです。私がこれをどのように行うべきかを知っているなら、いくつかの助けをいただければ幸いです。

4

2 に答える 2

7

ctypes callback docsによると、Python関数を定義できます

def my_callback(a, p, frame, p1, p2)
    pass

次に、次のように C の呼び出し可能な関数へのポインターを作成します。

callback = write_callback_prototype(my_callback)

この関数ポインタは FLAC に渡すことができます

于 2009-05-17T10:27:01.973 に答える
1

私が抱えている問題は実装です。FLAC__Frame はプログラマーによってインスタンス化されることはなく、初期化関数と処理関数からのみ呼び出されます。コールバック関数を自分で作成する必要がありますが、彼の問題は、これをどのように行うかわからないことです。私がこれを行う方法を知っているので、いくつかの助けをいただければ幸いです。

その場合は、次を使用してください。

import ctypes

class FLAC__Frame(ctypes.Structure):
    pass

すでに定義されているふりをして、基本的にメモリ内の位置であるポインターへのポインターのみが必要なため、気にしません。

于 2009-05-17T11:16:13.463 に答える