8

std::vector と std::map を使用するプログラムを emscripten でビルドしようとしていますが、コンパイルは成功しています。しかし、Webブラウザ(firefox/chrome)で実行すると、UnboundTypeErrorがキャッチされました。

[03:21:26.453] UnboundTypeError: 型がバインドされていないため、intArrayToVector を呼び出せません: Pi

生成された JavaScript コードを使用する C++ コードと HTML ファイルを次に示します。

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

どうすればこの問題を解決できますか? 助けてくれてありがとう!

4

1 に答える 1

8

Embind は、プリミティブ型へのポインターをサポートしていません。 「Pi」は「整数へのポインタ」を意味します。

配列のサイズが常に事前にわかっている場合は、配列を const 参照として渡すことができます。例えば

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

または、プリミティブ型へのポインターをサポートするcwrapAPIを使用できます。

于 2014-12-08T18:38:58.553 に答える