1

我有一个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() = 12and this 的输出等于 rows * cols (4 * 3).

你知道为什么会这样吗?谢谢!

4

1 回答 1

1

我没有发现代数矩阵与特征矩阵兼容,并使用 Array 将数据传递给特征矩阵。

C++ 代码:

// Create Eigen::Matrix
void* create_matrix(size_t rows, size_t cols, int points[]) {

    // Init pointer
    Eigen::MatrixXi* M;
    M = new Eigen::MatrixXi;

    Map<Eigen::MatrixXi, Unaligned, Stride<1, 3> > Temp_M(points, rows, cols);

    *M = Temp_M;

    return M;
}

// Print Matrix
void print_matrix(Eigen::MatrixXi* M) {
    cout << *M << std::endl;
}

锈代码:

// Get pointer to the function
let create_matrix: dll::Symbol<fn(usize, usize, *mut i32) -> *mut u8> =
   lib.get(b"create_matrix")?;

// Store pointer to Matrix
let m_ptr = create_matrix(2, 2, [1, 2, 3, 4].as_mut_ptr());

let print_matrix: dll::Symbol<fn(*mut u8)> =
   lib.get(b"print_matrix")?;

print_matrix(m_ptr);
于 2020-06-04T15:43:14.737 回答