2016-06-13 16 views
1

Ich habe eine C/C++ Funktion, die zwei Arrays jeder Größe zurückgibt, die vor dem Aufruf unbekannt ist. Ich muss diese Funktion von JavaScript aufrufen. (Zur Vereinfachung wird im Beispiel ein Array zurückgegeben).Wie wird ein Array unbekannter Größe in Enscripten zurückgegeben?

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

Beachten Sie, dass Sie JavaScript nicht std::vector und boost:array und andere Arten nicht kennt. Ich reserviere derzeit etwas Speicherplatz, aber es wird nicht funktionieren. Hier ist der Code auf der JavaScript-Seite:

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

Dies ist nicht effizient. Was passiert auch, wenn die Größe des Ergebnisses groß ist und nicht genügend Speicher vorbelegt ist?

+1

es gibt keine Möglichkeit, dass C-Schnittstelle funktioniert so, wie Sie beschreiben, sollte es 'float sein ** verts' so dass der Code C es zuordnen kann in der Größe es braucht. Ansonsten müssen Sie auch in C vorbelegen. – unwind

+0

Wie bereits erwähnt, kann std :: vector nicht aufgerufen werden, wenn es mit Emscript in Java geschrieben wird. Ich markierte als C++, weil ich eine Lösung für diese für meinen C++ Code finden möchte. Ich habe es intern in C++ mit '' und anderen Klassen implementiert, aber die Schwierigkeit liegt in der JS-Schnittstelle. –

+0

kann tatsächlich funktionieren: http://stackoverflow.com/questions/35494467/how-to-bridge-a-javascript-ragged-array-and-an-stdvectorstvectort-obj?rq=1 Aber nicht geeignet, um die Elemente zu bekommen . –

Antwort

0

Für Ihren speziellen Fall ist die Verwendung von Embind eine bessere Option. Gemäß der offiziellen Dokumentation

Zur Vereinfachung embind Fabrik Funktionen bietet std :: vector (register_vector()) und std :: map (register_map()) Typen registrieren:

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

das zurückgegebene Objekt verfügt über Methoden wie .get() und .Size()