2009-05-17 6 views
1

Ceci est lié à my other question, mais je me sentais comme si je devrais le poser dans une nouvelle question. Fondamentalement FLAC utilise des pointeurs de fonction pour les rappels, et pour implémenter des rappels avec ctypes, vous utilisez CFUNCTYPE pour les prototyper, puis vous utilisez la fonction prototype() pour les créer.Ctypes Python et pointeurs de fonction

Le problème que j'ai avec ce que je me suis dit que je créerais ma fonction de rappel en tant que telle (je ne montre pas les structures que j'ai recréées, FLAC__Frame est une structure):

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

Le problème que j'ai est la mise en œuvre. FLAC__Frame n'est jamais instancié par le programmeur, il est uniquement appelé depuis la fonction d'initialisation, et les fonctions de traitement. Je dois écrire la fonction callback moi-même, mais le problème est que je ne sais pas comment je ferais ça. sait comment je devrais faire cela, alors une aide serait grandement appréciée.

Répondre

5

Selon le ctypes callback docs vous pouvez définir la fonction python

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

puis créer un pointeur vers une C fonction appelable comme ceci:

callback = write_callback_prototype(my_callback) 

Ce pointeur de fonction peut alors être passé dans flac

+0

Merci beaucoup, votre code m'a fait réaliser comment je devais le créer! – Bocom

1

Le problème que j'ai est la mise en œuvre. FLAC__Frame n'est jamais instancié par le programmeur, il est seulement appelé depuis la fonction d'initialisation, et les fonctions de traitement. Je dois écrire la fonction callback moi-même, mais le problème est que je ne sais pas comment je ferais ça. sait comment je devrais faire cela, alors une aide serait grandement appréciée.

Dans ce cas, il suffit d'utiliser:

import ctypes 

class FLAC__Frame(ctypes.Structure): 
    pass 

et faire semblant qu'il est déjà défini, et ne se soucient pas parce que vous avez seulement besoin pointeur, ce qui est essentiellement la position dans la mémoire.

Questions connexes