tao-of-rust-codes icon indicating copy to clipboard operation
tao-of-rust-codes copied to clipboard

[第十三章] 13.3.2 代码清单 13-57

Open driftluo opened this issue 6 years ago • 2 comments

页码与行数

  • 第517页
  • 第5行

代码可精简

精简为如下代码,在安全抽象上,不需要用户再次输入对应 slices 的长度

// 链接名为libsorting的静态库
#[link(name = "sorting", kind = "static")]
extern {
    // 绑定CPP中的interop_sort函数
    // 注意参数类型要和CPP中的类型相对应
    fn interop_sort(arr: &[i32;10], n: u32);
}

// 对interop_sort函数的安全抽象
pub fn sort_from_cpp(arr: &[i32; 10]) {
    unsafe {
        interop_sort(arr, arr.len() as u32);
    }
}
fn main() {
   let my_arr: [i32;10]  = [10, 42, -9, 12, 8, 25, 7, 13, 55, -1];
   println!("Before sorting...");
   println!("{:?}\n", my_arr);
   sort_from_cpp(&my_arr);
   println!("After sorting...");
   println!("{:?}", my_arr);
}

driftluo avatar Jan 24 '19 09:01 driftluo

@driftluo 感谢反馈

ZhangHanDong avatar Jan 24 '19 10:01 ZhangHanDong

我觉得精简还是不够,不应该有长度的限制,应该直接传指针才对,如下:

// 链接名为libsorting的静态库
#[link(name = "sorting", kind = "static")]
extern {
    // 绑定CPP中的interop_sort函数
    // 注意参数类型要和CPP中的类型相对应
    fn interop_sort(arr: *const i32, n: u32);
}

// 对interop_sort函数的安全抽象
pub fn sort_from_cpp(arr: &[i32]) {
    unsafe {
        interop_sort(arr.as_ptr(), arr.len() as u32);
    }
}
fn main() {
   let my_arr = vec![10, 42, -9, 12, 8, 25, 7, 13, 55, -1];
   println!("Before sorting...");
   println!("{:?}\n", my_arr);
   sort_from_cpp(&my_arr);
   println!("After sorting...");
   println!("{:?}", my_arr);
}

driftluo avatar Jan 25 '19 03:01 driftluo