javascript — emscripten: как я могу решить UnboundTypeError

Я пытаюсь собрать с помощью emscripten программу, которая использует std :: vector и std :: map, и компиляция прошла успешно.
Однако, когда я запустил его в веб-браузере (firefox / chrome), UnboundTypeError был перехвачен.

[03: 21: 26.453] UnboundTypeError: Невозможно вызвать intArrayToVector из-за
несвязанные типы: Pi

Вот код C ++ и HTML-файл, который использует сгенерированный код JavaScript.

test.cpp:

#include <vector>
#include <emscripten/bind.h>

using namespace emscripten;

std::vector<int> intArrayToVector(int* input, int num){
std::vector<int> vec;
for(int i=0; i<num; i++){
int val = *(input+i);
vec.push_back(val);
}
return vec;
}

EMSCRIPTEN_BINDINGS(test){
register_vector<int>("VectorInt");
function("intArrayToVector", &intArrayToVector, allow_raw_pointer<arg<0>>());
}

test.html:

<html>
<body>
<script src="test.js"></script>
<script>
var num = 6;
var buf = Module._malloc(100);
var arr = new Int8Array(num);
for(var i=0; i<num; i++){
arr[i] = i+2;
}
Module.HEAP8.set(arr, buf);
var v = Module.intArrayToVector(buf, num);

for(var i=0; i<num; i++){
console.log(v.get(i));
}
Module._free(buf);
</script>
</body>
</html>

Код JavaScript был сгенерирован командой ниже:

$ em ++ —bind test.cpp -o test.js

Как я могу решить эту проблему?
Спасибо за любую помощь!

6

Решение

Embind не поддерживает указатели на примитивные типы. «Пи» означает «указатель на целое число».

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

std::vector<int> intArrayToVector(const int (&input)[100])

Или вы можете обмануть и использовать целочисленный параметр для указателя и использовать reinterpret_cast рассматривать это как указатель. например

std::vector<int> intArrayToVector(uintptr_t input, size_t len) {
const int* ptr = reinterpret_cast<int*>(input);
....
}

Или вы можете использовать cwrap API который поддерживает указатели на примитивные типы.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]