2016-06-13 6 views
1

私は呼び出し前に不明なサイズの2つの配列を返すC/C++関数を持っています。 JavaScriptからこの関数を呼び出す必要があります。 (簡単にするために、この例では1つの配列が返されます)。 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のコードは、それを割り当てることができるように、それは 'フロート** 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

具体的なケースでは、エンベンドを使用する方が適切です。公式ドキュメントを1として 便宜上

、embind STDを登録するには、工場の機能を提供します::ベクトル(register_vector())とstd ::マップ(register_map()) タイプ:

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

返されるオブジェクトはに.getのようなメソッド()と.size()

関連する問題