ยังไงให้ฉันช่วยเติมให้เป็น uninitialized สนิมเว็กเตองใช้ C ฟังก์ชัน?

0

คำถาม

ฉันกำลังพยายามโทรหาซีฟังก์ชันที่ทะในเว็กเตออกจากสนิม ที่นี่คือสมบูรณ์ขนาดเล็กที่สุดทำงานตัวอย่าง:

สินค้าชิ้นนั้น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 แต่เรื่องนี้คนเดียวกันเหมือนไม่มีปัญหาอยู่เลยสินะ

ffi rust
2021-11-23 17:31:41
1

คำตอบที่ดีที่สุด

1

แต่ไม่ต้องเซ็น integers ในการส่งออกเป็นไม่ถูกต้องและดูเหมือนจะเป็นขยะ

ถ้าคุณไม่ใช้ Vec::set_lenที่ความยาวของ Vec ยังคงเป็นศูนย์ถึงแม้ว่าคุณกำความทรงจำและกำหนดค่าของ. ถ้าคุณพิมพ์ออกมา Vecมันจะเป็นช่องว่างเพื่อฉันสงสัยว่าคุณกำลังดูอยู่ ไหน integers อยู่ในส่วนส่งออก

นั่นบอกว่าการใช้ set_len ควรจะแก้ไขปัญหา:

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.set_len(len as usize); // HERE
    }
    out
}

ฉันคิดว่า with_capacity เป็นการตั้งค่าความยาว(ผมยังไม่แน่ใจว่าทำไมมันไม่ได้).

เมื่อคุณตั้งค่าความสามารถของเว็กเตอร์คุณไม่ได้เป็นคนตั้งมี ค่า อยู่ในเว็กเตอร์ ถ้าค่าเป็นยกเลิกตั้งค่า,เข้าถึงพวกเขาน่าจะเป็นสาเหตุทำดัชนีเทียบสีพฤติกรรม

ถ้าคุณต้องการกำหนดค่าของคุณอาจจะใช้บางอย่างอย่าง Vec::resize.

ดูเพิ่มเติม:

2021-11-23 21:02:23

ฉันไม่แน่ใจว่าสิ่งที่ฉันกำลังทำอะไรเพื่อเอาขยะค่าตั้งแต่ฉันไม่สามารถ reproduce แต่ปัญหาก็คือซ่อมแล้ว
wyoumans

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่