2016-04-23 13 views
0

Ich habe eine Matrix in Form eines Arrays in C++ und möchte es an eine in Rust geschriebene gemeinsame Bibliothek übergeben. Ich habe so etwas wie diesesWie kann ich ein FFI-Array als c_void-Zeiger an Nalgebras DMatrix2 übergeben?

#![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 
} 

dies nicht kompilieren, da ich eine c_void-from_row_vector() passieren.

Wie kann ich das richtig machen?

Die Matrix ist eine Reihe von Doppel, aber ich versuche, die Schnittstelle generisch zu halten, so kann ich auch die Funktionen von z. Python.

Ich möchte die Matrix nicht freigeben, wenn ich von der Funktion zurückkomme (ich möchte ausleihen, die Matrix nicht besitzen).

Antwort

1

Sie können std::slice::from_raw_parts verwenden, um eine Scheibe zu erhalten:

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

Um sicherzustellen, dass die Zeigertypen zusammenpassen, können Sie entweder p_data ‚s Art in der Argumentliste zu *const N ändern, in der N der Typ Sie ist Verwenden Sie in der Matrix oder verwenden Sie einen Cast wie p_data as *const N.

Verwandte Themen