2009-05-17 12 views
1

Dies ist mit my other question verwandt, aber ich fühlte mich wie ich sollte es in einer neuen Frage stellen.Python Ctypes und Funktion Zeiger

Grundsätzlich FLAC verwendet Funktionszeiger für Rückrufe, und Callbacks mit Ctypes zu implementieren, verwenden Sie CFUNCTYPE, um sie zu prototypieren, und dann verwenden Sie die prototype() Funktion, um sie zu erstellen.

Das Problem, das ich mit diesem ist, dass ich dachte, dass ich meine Callback-Funktion als solche schaffen würde (ich nicht, die Strukturen zeigen, bin, dass ich neu erstellt haben, ist FLAC__Frame eine Struktur):

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

Das Problem dass ich habe, ist die Umsetzung. FLAC__Frame wird niemals vom Programmierer instanziiert, sondern nur von der Initialisierungsfunktion und den Verarbeitungsfunktionen aufgerufen. Ich muss die Callback-Funktion selbst schreiben, aber das Problem ist, dass ich nicht weiß, wie ich das machen würde, also wenn jemand Ich weiß, wie ich das machen soll, dann würde ich sehr dankbar sein.

Antwort

5

Nach der ctypes callback docs können Sie Python Funktion

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

definieren und dann einen Zeiger auf eine C aufrufbaren Funktion wie folgt erstellen:

callback = write_callback_prototype(my_callback) 

Dieser Funktionszeiger kann dann in FLAC weitergegeben werden

+0

Vielen Dank, Ihr Code machte mir klar, wie ich es erstellen sollte! – Bocom

1

Das Problem, das ich habe, ist die Implementierung. FLAC__Frame wird niemals vom Programmierer instanziiert, sondern nur von der Initialisierungsfunktion und den Verarbeitungsfunktionen aufgerufen. Ich muss die Callback-Funktion selbst schreiben, aber das Problem ist, dass ich nicht weiß, wie ich das machen würde, also wenn jemand Ich weiß, wie ich das machen soll, dann würde ich sehr dankbar sein.

In diesem Fall verwenden Sie einfach:

import ctypes 

class FLAC__Frame(ctypes.Structure): 
    pass 

und behaupten, dass es bereits definiert ist, und kümmern sich nicht, weil Sie nur Zeiger auf sie benötigen, die im Speicher grundsätzlich Position befindet.