Я изо всех сил пытаюсь передать структуру через FFI, который принимает void, и читать ее на другом конце.
Речь идет о libtsm, конечном автомате. Он позволяет вводить ввод, а затем выяснять, в каком состоянии будет находиться терминал после ввода.
Он объявляет свою функцию рисования как:
pub fn tsm_screen_draw(con: *tsm_screen, draw_cb: tsm_screen_draw_cb, data: *mut c_void) -> tsm_age_t;
где tsm_screen_draw_cb - это обратный вызов, который должен быть реализован пользователем библиотеки, с подписью:
pub type tsm_screen_draw_cb = extern "C" fn(
con: *tsm_screen,
id: u32,
ch: *const uint32_t,
len: size_t,
width: uint,
posx: uint,
posy: uint,
attr: *tsm_screen_attr,
age: tsm_age_t,
data: *mut c_void
);
Важной частью здесь является параметр data
. Он позволяет пользователю передавать указатель на самореализованное состояние, манипулировать им и использовать его после рисования. Учитывая простую структуру:
struct State {
state: int
}
как бы я сделал это правильно? Я не уверен, как правильно преобразовать указатель на структуру в void и обратно.