Как соединить массив JavaScript (неоднородный) и объект std::vector‹std::vector‹T››?

В JavaScript у меня есть список «строк», каждая из которых состоит из неопределенного количества «точек», каждая из которых имеет форму [x, y]. Итак, это трехмерный рваный массив. Теперь мне нужно передать его в мой код C++ с помощью emscripten (вставить). Вот объявление функции C++:

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

И я хотел бы получить список списков ([[m11, m12],[m22, m22],...]) в JavaScript после вызова f. Как написать код привязки в этом случае (например, внутри EMSCRIPTEN_BINDINGS)?

ОБНОВЛЕНИЕ: теперь я могу передать массив JavaScript в C++. Связующая часть что-то вроде

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. Теперь проблема в том, что я могу получить пустой объект JavaScript только после вызова f_wrapper. 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

Любые идеи?


person ziyuang    schedule 18.02.2016    source источник
comment
Связано.   -  person Avi Ginsburg    schedule 19.02.2016
comment
@AviGinsburg Все наоборот.   -  person ziyuang    schedule 19.02.2016
comment
Можете ли вы пояснить, почему вы имеете в виду пустой объект Line? Основываясь на вашем коде, я только что создал небольшой тест передачи LineArray в функцию C++ из Javascript, которая возвращает строку обратно, и связь, похоже, работает в обоих направлениях. Я использую Emscripten 1.35.23-64bit. pastebin.com/9g8vJFc9 и pastebin.com/P0BmKY3K   -  person Michal Charemza    schedule 22.02.2016
comment
@MichalCharemza Ага! Я рассматривал его как массив JavaScript и, таким образом, проверял такие значения, как result.length или result[0], но не нашел ничего определенного. Я должен был заглянуть в emscripten/bind.h, чтобы узнать, что на самом деле делает register_vector. Теперь я могу нормально посещать контент. Если вы можете написать комментарий в ответ, я хотел бы принять его. Благодарю вас!   -  person ziyuang    schedule 23.02.2016


Ответы (1)


При передаче вектора вложения из функции C++, такой как

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

на Javascript

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

Объект result не является массивом Javascript, который реализует свойство length или доступ по индексу массива, поэтому он может казаться "пустым" при использовании их для доступа к своим данным.

Но он предоставляет функции get и size для доступа к вектору:

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

(Двойной get потому что мы возвращаем вектор векторов)

Для полноты, глядя на прототип возвращаемого объекта, он, кажется, предоставляет следующие функции.

  • get
  • push_back
  • resize
  • set
  • size

Несколько непоследовательно он предоставляет функции get и set, а не эквивалент C++ at. функция. Я подозреваю, что точно эквивалентная функция невозможна, поскольку at возвращает ссылку что позволяет использовать его в качестве установщика, что невозможно в Javascript.

person Michal Charemza    schedule 22.02.2016
comment
Управляет ли он автоматически освобождением? Работает без утечек памяти? - person Sohail Si; 13.06.2016
comment
@Sohail Я подозреваю, что да, но это может быть достойным отдельного вопроса. - person Michal Charemza; 13.06.2016
comment
Где документация для функции .get, push_back, как вы нашли эту функцию get для myVector? Пожалуйста, киньте ссылку, спасибо - person Buddhika Chaturanga; 05.04.2017
comment
@BuddhikaChaturanga Я не думаю, что нашел это в какой-либо документации, я изучил объект, возвращенный в консоли в браузере. - person Michal Charemza; 06.04.2017
comment
@MichalCharemza Спасибо, братан, за ответ!! Я пытался найти любую ссылку или документ emscripten по этому методу, но ничего не нашел. Вот почему я спросил. - person Buddhika Chaturanga; 06.04.2017
comment
@MichalCharemza Я не уверен, что освобождение происходит автоматически. Возможно, требуется изменение размера (0,0). - person garrettmaring; 16.08.2019