2016-04-23 13 views
0

У меня есть матрица в виде массива в C++ и хотел бы передать ее в библиотечную функцию, написанную в Rust. У меня есть что-то вроде этогоКак передать массив FFI в качестве указателя c_void для DMatrix2 nalgebra?

#![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().

Как я могу это сделать правильно?

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

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

ответ

1

Вы можете использовать std::slice::from_raw_parts, чтобы получить срез:

let slice = std::slice::from_raw_parts(p_data, sizex*sizey); 

Чтобы убедиться, что типы указателей совпадают, вы можете изменить тип p_data «S в списке аргументов в *const N где N тип вы использовать в матрице или использовать литой как p_data as *const N.