Типы Python и указатели на функции - PullRequest
1 голос
/ 17 мая 2009

Это связано с другим моим вопросом , но я чувствовал, что должен задать его в новом вопросе.

В основном FLAC использует указатели функций для обратных вызовов, а для реализации обратных вызовов с ctypes вы используете CFUNCTYPE для их прототипирования, а затем используете функцию prototype() для их создания.

Проблема, с которой я столкнулся, заключается в том, что я решил создать свою функцию обратного вызова как таковую (я не показываю воссозданные структуры, FLAC__Frame - это структура):

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

У меня проблема с реализацией. FLAC__Frame никогда не создается экземпляром программистом, он вызывается только из функции инициализации и функций обработки. Мне нужно написать функцию обратного вызова самостоятельно, но он в том, что я не знаю, как я это сделаю, так что если знает, как я должен это сделать, тогда будет очень признательна за помощь.

Ответы [ 2 ]

5 голосов
/ 17 мая 2009

В соответствии с документами обратного вызова ctypes вы можете определить функцию Python

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

и затем создайте указатель на вызываемую C-функцию следующим образом:

callback = write_callback_prototype(my_callback)

Этот указатель на функцию затем может быть передан в FLAC

1 голос
/ 17 мая 2009

У меня проблема с реализацией. FLAC__Frame никогда не создается экземпляром программистом, он вызывается только из функции инициализации и функций обработки. Мне нужно написать функцию обратного вызова самостоятельно, но он в том, что я не знаю, как я это сделаю, так что если знает, как я должен это сделать, тогда некоторая помощь будет принята с благодарностью.

В этом случае просто используйте:

import ctypes

class FLAC__Frame(ctypes.Structure):
    pass

и притвориться, что оно уже определено, и не волнует, потому что вам нужен только указатель на него, который в основном находится в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...