Emscripten pass stl c ++ параметр карты - PullRequest
1 голос
/ 29 апреля 2019

Я не могу понять, как вызвать сгенерированный JS код для следующей функции:

void printmap(const map<string, vector<string> > &ms)
{
    map<string, vector<string> >::const_iterator m1i;
    for (m1i = ms.begin(); m1i != ms.end(); m1i++)
    {
        printf("%s:\n", m1i->first.c_str());
        vector<string>::const_iterator m2i;
        for (m2i = m1i->second.begin(); m2i != m1i->second.end(); m2i++)
            printf("\t%s\n", m2i->c_str());
    }
}

В частности, как выглядит JS для подготовки параметра 'ms'?

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете , а не позвонить на printmap() в JS.

WebAssembly в настоящее время определяет только числовые типы : 32/64-битное целое число / число с плавающей запятой.Из-за этого ограничения скомпилированный Emscripten код WASM может взаимодействовать с JS с помощью следующих типов:

  1. Числовые типы (целые числа и числа с плавающей запятой)
  2. Типы указателей (путем обработки целого числа смещения дляадрес памяти WASM 0x00000000)
    • A указатель байтового (или целочисленного) массива
    • A указатель строки (хотя это * 1021)* не просто )
    • указатель экземпляра класса (через Embind )

Я не знаю, как указатели и ссылки ведут себя по-разному, , таким образом, вы не можете использовать ссылочный тип для взаимодействия с JS .

Как вы можете догадаться здесь, нет способа манипулировать такими сложными типами C ++, как map<string, vector<string>.

Подводя итог, у меня есть несколько предложений для вас:

  1. Измените тип ссылки на указатель.

void printmap(const map<string, vector<string> > &ms)

до

void printmap(const map<string, vector<string> > *ms)

Напишите функцию инициализации для ms, чтобы вы могли сделать что-то подобное в JS:
let map_ptr = module._initmap();
...Do something..
module._printmap(map_ptr);
Просто избегайте использования таких сложных типов C / C ++ на стороне JS напрямую или используйте функции получения и установки для ms.
...