2016-06-13 3 views
1

호출하기 전에 알 수없는 크기의 배열 두 개를 반환하는 C/C++ 함수가 있습니다. JavaScript에서이 함수를 호출해야합니다. (단순화를 위해 예제에서는 하나의 배열이 반환됩니다). 자바 스크립트를 std::vectorboost:array 및 다른 유형을 알고하지 않습니다Enscripten에서 알 수없는 크기의 배열을 반환하는 방법?

extern "C" { 
    void produce_object_3d(float* verts, int *num_verts); 
} 

참고. 현재 일부 공간을 미리 할당하고 있지만 작동하지 않습니다. 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); 

이것은 효율적이지 않습니다. 또한 결과의 크기가 크고 사전 할당 된 메모리가 충분하지 않은 경우 어떻게합니까?

+1

C 인터페이스는 사용자가 설명하는대로 작동하지 않으며 C 코드가 할당 할 수 있도록 'float ** verts'여야합니다 크기로 필요해. 그렇지 않으면 C로 미리 할당해야합니다. – unwind

+0

앞서 언급했듯이 Emdript를 사용하여 JAvaScript로 컴파일 할 때 std :: vector는 호출 할 수 없습니다. 나는 C++ 코드에 대한 해결책을 찾고 싶기 때문에 C++로 태그를 붙였다. 사실 내부적으로 C++에서 ''및 다른 클래스를 사용하여 구현했지만 JS 인터페이스는 어려움이 있습니다. –

+0

실제로 작동 할 수 있습니다 : http://stackoverflow.com/questions/35494467/how-to-bridge-a-javascript-ragged-array-and-an-stdvectorstdvectort-obj?rq=1 그러나 요소를 가져 오는 적합하지 않습니다. . –

답변

0

구체적인 경우에는 embind를 사용하는 것이 더 좋습니다. 공식 문서 편의를 위해

당으로 , embind이 표준을 등록하는 공장 기능을 제공합니다 : 벡터 (register_vector()) 및 표준 : :지도 (register_map()) 유형 :

EMSCRIPTEN_BINDINGS(stl_wrappers) { 
    register_vector<int>("VectorInt"); 
    register_map<int,int>("MapIntInt"); 
} 

반환되는 객체에는 .get() 및 .size()와 같은 메소드가 있습니다.