gpt4 book ai didi

javascript - 如何桥接 JavaScript(参差不齐)数组和 std::vector> 对象?

转载 作者:太空狗 更新时间:2023-10-29 21:16:18 30 4
gpt4 key购买 nike

在 JavaScript 中,我有一个“线”列表,每一个都由不定数量的“点”组成,每个点的形式都是 [x, y] .所以它是一个 3D 参差不齐的数组。现在我需要在 emscripten ( embind ) 的帮助下将它传递给我的 C++ 代码。这是 C++ 函数的声明:

Eigen::MatrixXd f(const std::vector<std::vector<std::vector<double>>>& lines);

我想在调用 [[m11, m12],[m22, m22],...] 后用 JavaScript 获取列表列表 ( f ) .在这种情况下如何编写绑定(bind)代码(例如 EMSCRIPTEN_BINDINGS 中的内容)?

更新:我现在可以将 JavaScript 数组传递给 C++。绑定(bind)部分类似于

typedef std::vector<double> Point;
typedef std::vector<Point> Line;
EMSCRIPTEN_BINDINGS(module) {
register_vector<Line>("LineArray");
register_vector<Point>("Line");
register_vector<double>("Point");
emscripten::function("f_wrapper", &f_wrapper);
}

哪里f_wrapper电话 f但返回 vector<vector<double>>而不是 MatrixXd .现在的问题是我在调用 f_wrapper 后只能得到一个空的 JavaScript 对象。 . JavaScript 是

var Module = require('./bind.js'); // the output of em++
var cppAllLines = new Module.LineArray();
// some initialization
var result = Module.f_wrapper(cppAllLines); // an empty "Line" object

有什么想法吗?

最佳答案

从 C++ 函数传递嵌入 vector 时,例如

std::vector<std::vector<double>> f_wrapper(...);

到 Javascript

var result = Module.f_wrapper(...);

result 对象不是实现 length 属性或数组索引访问的 Javascript 数组,因此如果使用这些来访问其数据,它可能会显示为“空”。

但它确实公开了getsize 函数来访问 vector :

console.log('Back from C++', result.size(), result.get(0).get(1));

(双重 get 是因为我们要返回一个 vector 的 vector )

为了完整起见,查看返回对象的原型(prototype),似乎公开了以下功能。

  • 获取
  • push_back
  • 调整大小
  • 设置
  • 大小

略微不一致,它公开了 getset 函数,而不是 C++ 的等价物 at功能。我怀疑自 at 以来不可能有完全等效的功能返回一个引用,允许它用作 setter,这在 Javascript 中是不可能的。

关于javascript - 如何桥接 JavaScript(参差不齐)数组和 std::vector<std::vector<T>> 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494467/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com