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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top