Pythonのctypesのと関数ポインタ
-
22-08-2019 - |
質問
このはhref="https://stackoverflow.com/questions/867850/creating-a-wrapper-for-ac-library-in-python">私の他の質問を関連しているが、私は新しい質問でそれを求める必要がありますように感じます。
基本的にはFLACは、あなたがそれらのプロトタイプを作成するためにCFUNCTYPE
を使用して、あなたがそれらを作成するためにprototype()
機能を使用し、コールバック関数ポインタを使用し、ctypesのでコールバックを実装します。
私はこれを持っている問題は、私は私のような私のコールバック関数を作成することを考え出していることである(私は再作成されている構造を示すわけではない、FLAC__Frameは構造です):
write_callback_prototype = CFUNCTYPE(c_int, c_void_p,
POINTER(FLAC__Frame),
POINTER(c_int32), v_void_p)
私が持っている問題は、実装です。 FLAC__Frameはプログラマによってインスタンス化されることはありません、それが唯一の初期化関数からから呼び出され、処理functions.Iは、コールバック関数を自分で記述する必要があり、彼の問題は、私はこれを行うだろうか分からないということですので、誰であればです私はこれを行うべきかを知って、その後、いくつかの助けをいただければ幸いです。
解決
ctypesのコールバックのドキュメントでは、Pythonの関数を定義することができますを
def my_callback(a, p, frame, p1, p2)
pass
と、このようなC呼び出し可能な関数へのポインタを作成します。
callback = write_callback_prototype(my_callback)
この関数ポインタは、その後、FLACに渡すことができます。
他のヒント
私が持っている問題は、実装です。 FLAC__Frameはプログラマによってインスタンス化されることはありません、それが唯一の初期化関数からから呼び出され、処理functions.Iは、コールバック関数を自分で記述する必要があり、彼の問題は、私はこれを行うだろうか分からないということですので、誰であればです私はこれを行うべきかを知って、その後、いくつかの助けをいただければ幸いです。
その場合は、単に使用します:
import ctypes
class FLAC__Frame(ctypes.Structure):
pass
と、それがすでに定義されていることをふり、そしてあなただけ基本的にメモリ内の位置である、それへのポインタを必要とするので、気にしないでください。