Каков наилучший способ преобразования из C ++ std :: vector <float>в Rust Vec <f32>? - PullRequest
6 голосов
/ 06 июня 2019

Я написал тестовую программу для проверки правильности чтения данных на Rust.

C ++ код:

std::vector<float> vec;
vec.push_back(10);
vec.push_back(20);
std::cout << "len is " << get_len(&vec);

Код ржавчины:

#[no_mangle]
pub extern "C" fn get_len(vec: *const Vec<f32>) -> i32 {
    let vec= unsafe { &*vec};
    vec.len() as i32
}

Мой вывод выглядит так и всегда отличается:

len is 603268424

1 Ответ

9 голосов
/ 06 июня 2019

Следует знать, что C ++ не позволяет передавать права собственности на вектор данных. Это ограничение дизайна C ++. Есть несколько трюков , но я не советую их использовать. Чтобы оставаться «в безопасности», вы можете заимствовать только вектор C ++.

Это можно легко сделать, используя vector::data() и vector::size():

#include <cstddef>
#include <vector>

extern "C" void show_vector(float const *data, std::size_t size);

int main() {
    std::vector<float> vec{10, 20};
    show_vector(vec.data(), vec.size());
}

Сторона Rust может использовать slice::from_raw_parts(), создавая представление о нашем векторе, не вступая во владение.

use libc::{c_float, size_t};

extern "C" fn show_vector(data: *const c_float, size: size_t) {
    let vec = unsafe { std::slice::from_raw_parts(data, size) };
    for x in vec {
        println!("{}", x);
    }
}

Подробнее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...