Как я могу передать массив FFI как указатель c_void на DMatrix2 Налгебры?

У меня есть матрица в виде массива в 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.

Я не хочу освобождать матрицу при возвращении из функции (я хочу заимствовать, а не владеть матрицей).

0

Решение

Ты можешь использовать 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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]