ฉันกำลังพยายามโทรหาซีฟังก์ชันที่ทะในเว็กเตออกจากสนิม ที่นี่คือสมบูรณ์ขนาดเล็กที่สุดทำงานตัวอย่าง:
สินค้าชิ้นนั้นtoml
[package]
name = "so"
version = "0.1.0"
edition = "2021"
[build-dependencies]
cc = "1.0.72"
สร้างขึ้นrs
fn main() {
cc::Build::new().file("src/library.c").compile("library");
}
src/องสมุดc
void get_ui_array(unsigned long *out, long len) {
long i;
for (i = 0; i < len; i++) {
out[i] = 42;
}
}
src/หลัก.rs
use std::os::raw::{c_long, c_ulong};
extern "C" {
pub fn get_ui_array(out: *mut c_ulong, len: c_long);
}
fn get_ui_vector(len: c_long) -> Vec<c_ulong> {
let mut out = Vec::<c_ulong>::with_capacity(len as usize);
unsafe {
get_ui_array(out.as_mut_ptr(), len);
}
out
}
fn main() {
dbg!(get_ui_vector(12));
}
รหัส compiles แต่ไม่ต้องเซ็น integers ในการส่งออกเป็นไม่ถูกต้องและดูเหมือนจะเป็นขยะดังนั้นฉันคิดว่ามันคือชีวิตเหมือนไม่มีปัญหาอยู่เลยสินะ ฉันทำอะไรผิดเหรอ? ฉันยังพยายามใช้ MaybeUninit
กับ as_mut_ptr
จากนั้นก็ใช้ std::slice::from_raw_parts
แต่เรื่องนี้คนเดียวกันเหมือนไม่มีปัญหาอยู่เลยสินะ