Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在EnScript中返回大小未知的数组?_Javascript_C++_C_Emscripten - Fatal编程技术网

Javascript 如何在EnScript中返回大小未知的数组?

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

我有一个C/C++函数,它返回两个数组,每个数组的大小在调用之前是未知的。我需要从JavaScript调用这个函数。(为简单起见,示例中返回一个数组)

请注意,JavaScript不知道
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++内部使用了 <代码>和其他类,但难点在于JS接口。可能确实有效:但不适合获取元素。@SohailSi为什么向量不起作用?vector的embind实现提供了一个.get(position)函数。性能是原因吗?我不知道embind。我试试看。
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");
}