我有一个DLL
写好的C++
,我需要调用一个print_matrix(Eigen::MatrixXf *m)
从 Rust 程序调用的函数。
我创建了一个 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
and this 的输出等于 rows * cols (4 * 3)
.
你知道为什么会这样吗?谢谢!