У меня DLL
написано в C++
, и мне нужно вызвать функцию с именем print_matrix(Eigen::MatrixXf *m)
из программы на Rust.
Я создал mactrix 4x3, и рассматриваемая функция получает указатель в качестве входного параметра.
Код ржавчины:
use nalgebra::Matrix;
pub type MatrixX = Matrix<f32, Dynamic, Dynamic, VecStorage<f32, Dynamic, Dynamic>>;
pub fn main() {
match call_dynamic() {
Ok(_) => println!("Func ok",),
Err(e) => println!("{:?}", e),
}
}
pub fn call_dynamic() -> Result<(), Box<dyn std::error::Error>> {
let lib = dll::Library::new("MyDLL.dll")?;
unsafe {
let func: dll::Symbol<fn(*mut MatrixX)> = lib.get(b"print_matrix")?;
func(init_cube());
Ok(())
}
}
// Init matrix and return raw pointer
pub fn init_matrix() -> *mut MatrixX {
let points: MatrixX = DMatrix::from_row_slice(
4,
3,
&[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0],
);
Box::into_raw(Box::new(points))
}
Код C ++:
extern "C" __declspec(dllexport) void print_matrix(Eigen::MatrixXf *m);
void print_matrix(Eigen::MatrixXf* m) {
using namespace Eigen;
using namespace std;
// Print size of a matrix
std::cout << "m->size() : " << m->size() << std::endl;
// Print number of rows
std::cout << "m->rows() : " << m->rows() << std::endl;
// Print number of columns
std::cout << "m->cols() : " << m->cols() << std::endl;
// Print first column
std::cout << "m->col(0) : " << m->col(0) << std::endl;
}
И мой вывод выглядит так:
m->size() : 144
m->rows() : 12
m->cols() : 12
m->col(0) :
0
0
0
0
0
0
1
1
0
1
0
1
Но я не могу понять, почему вывод m->rows() = 12
и это равно rows * cols (4 * 3)
.
У вас есть идеи, почему это происходит? Спасибо!