Типы Python и указатели на функции
-
22-08-2019 - |
Вопрос
Это связано с мой другой вопрос, но я чувствовал, что должен задать это в новом вопросе.
По сути, 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, он вызывается только из функции инициализации и функций обработки. Мне приходится самому писать функцию обратного вызова, но проблема в том, что я не знаю, как бы я это сделал, поэтому, если кто-нибудь знает, как мне это сделать, то буду очень признателен за некоторую помощь.
Решение
Согласно Документация по обратному вызову ctypes вы можете определить функцию Python
def my_callback(a, p, frame, p1, p2)
pass
а затем создайте указатель на вызываемую функцию C, например:
callback = write_callback_prototype(my_callback)
Этот указатель функции затем можно передать в FLAC.
Другие советы
Проблема у меня в реализации.Программист никогда не создает экземпляр FLAC__Frame, он вызывается только из функции инициализации и функций обработки. Мне приходится самому писать функцию обратного вызова, но проблема в том, что я не знаю, как бы я это сделал, поэтому, если кто-нибудь знает, как мне это сделать, то буду очень признателен за некоторую помощь.
В этом случае просто используйте:
import ctypes
class FLAC__Frame(ctypes.Structure):
pass
и притворитесь, что он уже определен, и не беспокойтесь, потому что вам нужен только указатель на него, который по сути является позицией в памяти.