У меня есть матрица в виде массива в C ++, и я хотел бы передать ее функции совместно используемой библиотеки, написанной на Rust. У меня есть что-то вроде этого
#![crate_type = "dylib"]
extern crate libc;
use libc::c_void;
extern crate nalgebra as na;
use na::DMatrix2;
#[no_mangle]
pub extern "C" fn rust_fn(p_data: *const c_void, sizex: usize, sizey: usize) {
let matrix = DMatrix2::from_row_vector(sizey, sizex, p_data);
// Do something usefull with the matrix
}
Это не компилируется, так как я передаю c_void
в from_row_vector()
,
Как я могу сделать это правильно?
Матрица представляет собой массив значений типа double, но я пытаюсь сделать интерфейс универсальным, чтобы я также мог вызывать функции, например, из Python.
Я не хочу освобождать матрицу при возвращении из функции (я хочу заимствовать, а не владеть матрицей).
Ты можешь использовать std::slice::from_raw_parts
чтобы получить ломтик:
let slice = std::slice::from_raw_parts(p_data, sizex*sizey);
Чтобы убедиться, что типы указателей совпадают, вы можете изменить p_data
введите в список аргументов *const N
где N
это тип, который вы используете в матрице, или использовать приведение типа p_data as *const N
,
Других решений пока нет …