Javascript 如何在EnScript中返回大小未知的数组?
我有一个C/C++函数,它返回两个数组,每个数组的大小在调用之前是未知的。我需要从JavaScript调用这个函数。(为简单起见,示例中返回一个数组) 请注意,JavaScript不知道Javascript 如何在EnScript中返回大小未知的数组?,javascript,c++,c,emscripten,Javascript,C++,C,Emscripten,我有一个C/C++函数,它返回两个数组,每个数组的大小在调用之前是未知的。我需要从JavaScript调用这个函数。(为简单起见,示例中返回一个数组) 请注意,JavaScript不知道std::vector和boost:array以及其他类型。我目前预先分配了一些空间,但它不会工作。下面是JavaScript端的代码: var verts_address = Module._malloc(FLOAT_SIZE*3*max_verts); var nv_address = Module._mal
std::vector
和boost:array
以及其他类型。我目前预先分配了一些空间,但它不会工作。下面是JavaScript端的代码:
var verts_address = Module._malloc(FLOAT_SIZE*3*max_verts);
var nv_address = Module._malloc(INT_SIZE*1);
//
produce_object_3d (verts_address, nv_address);
//
var nverts = Module.HEAPU32[nv_address/INT_SIZE];
var verts = Module.HEAPF32.subarray(verts_address/FLOAT_SIZE, verts_address/FLOAT_SIZE + 3*nverts);
这是没有效率的。另外,如果结果的大小很大,并且没有预分配足够的内存,该怎么办?对于您的特定情况,使用embind是一个更好的选择。 根据官方文件 为了方便起见,embind提供了注册的工厂函数 std::vector(register_vector())和std::map(register_map()) 类型:
EMSCRIPTEN_绑定(stl_包装器){
寄存器_向量(“向量”);
注册地图(“地图”);
}
返回的对象有.get()和.size()之类的方法。C接口不可能按照您描述的方式工作,它应该是
float**verts
,以便C代码可以按需要的大小分配它。正如我提到的,当std::vector使用Emscripten编译成JAvaScript时,它将不可调用。我把它标记为C++,因为我想为C++代码找到一个解决方案。实际上,我在C++内部使用了var verts_address = Module._malloc(FLOAT_SIZE*3*max_verts);
var nv_address = Module._malloc(INT_SIZE*1);
//
produce_object_3d (verts_address, nv_address);
//
var nverts = Module.HEAPU32[nv_address/INT_SIZE];
var verts = Module.HEAPF32.subarray(verts_address/FLOAT_SIZE, verts_address/FLOAT_SIZE + 3*nverts);
EMSCRIPTEN_BINDINGS(stl_wrappers) {
register_vector<int>("VectorInt");
register_map<int,int>("MapIntInt");
}