Типы Python и указатели на функции

1

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

В основном, 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 никогда не создается экземпляром программиста, он вызван только из функции инициализации и функций обработки. Мне нужно написать функцию обратного вызова, но проблема в том, что я не знаю, как бы это сделать, поэтому, если кто-либо знает, как я должен это делать, тогда нам будет очень полезно помочь.

Теги:
function-pointers
ctypes

2 ответа

5
Лучший ответ

В соответствии с ctypes callback docs вы можете определить функцию python

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

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

callback = write_callback_prototype(my_callback)

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

  • 0
    Большое спасибо, ваш код заставил меня понять, как я должен был его создать!
1

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

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

import ctypes

class FLAC__Frame(ctypes.Structure):
    pass

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню