ctypes Python e puntatori a funzione
-
22-08-2019 - |
Domanda
Questo è legato a mia altra domanda , ma mi sentivo come dovrei chiedere in una nuova domanda.
In sostanza FLAC utilizza puntatori a funzione per callback, e per implementare callback con ctypes, si utilizza CFUNCTYPE
al prototipo loro, e poi si utilizza la funzione prototype()
per crearli.
Il problema che ho con questo è che ho pensato che vorrei creare la mia funzione di callback come tale (io non sto mostrando le strutture che ho ricreato, FLAC__Frame è una struttura):
write_callback_prototype = CFUNCTYPE(c_int, c_void_p,
POINTER(FLAC__Frame),
POINTER(c_int32), v_void_p)
Il problema che ho è l'implementazione. FLAC__Frame non viene mai istanziato dal programmatore, si chiama solo dalla funzione di inizializzazione, e le functions.I di elaborazione necessario scrivere la funzione di callback me stesso, ma lui problema è che io non so come avrei fatto questo, quindi se qualcuno sa come devo fare questo, allora un po 'di aiuto sarebbe molto apprezzato.
Soluzione
In base alla funzione di pitone ctypes richiamata documenti è possibile definire
def my_callback(a, p, frame, p1, p2)
pass
e quindi creare un puntatore a una funzione callable C in questo modo:
callback = write_callback_prototype(my_callback)
Questa puntatore a funzione può quindi essere passata in FLAC
Altri suggerimenti
Il problema che ho è l'implementazione. FLAC__Frame non viene mai istanziato dal programmatore, si chiama solo dalla funzione di inizializzazione, e le functions.I di elaborazione necessario scrivere la funzione di callback me stesso, ma lui problema è che io non so come avrei fatto questo, quindi se qualcuno sa come devo fare questo, allora un po 'di aiuto sarebbe molto apprezzato.
In questo caso, basta usare:
import ctypes
class FLAC__Frame(ctypes.Structure):
pass
e far finta che sia già definita, e non si preoccupano perché hai solo bisogno puntatore ad esso, che è sostanzialmente la posizione in memoria.