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

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

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

Вот код С++ и файл 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>>());
}

тест.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

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


person user3062135    schedule 03.12.2013    source источник
comment
Int8Array() создает 8-битные целые числа?   -  person Anto Jurković    schedule 03.12.2013
comment
да, это массив 8-битных целых чисел   -  person user3062135    schedule 04.12.2013
comment
Я не знаю, как emscripten справляется с этим: ваш целочисленный размер С++ по умолчанию больше 8 бит. short int не менее 16 бит...   -  person Anto Jurković    schedule 04.12.2013
comment
Пробовал с Int32Array() и HEAP32, но результат тот же...   -  person user3062135    schedule 04.12.2013


Ответы (1)


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

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

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);
    ....
}

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

person William    schedule 08.12.2014