2015-07-14 13 views
5


Ho array di numeri grandi in JS che voglio passare a C++ per l'elaborazione. IMHO il modo più efficace è quello di lasciare JS scrivere direttamente al mucchio C++ e passare un puntatore come argomento nella chiamata diretta, come:Passare l'array di numeri JS a C++ emscripten senza reinterpret_cast

var size = 4096, 
    BPE = Float64Array.BYTES_PER_ELEMENT, 
    buf = Module._malloc(size * BPE), 
    numbers = Module.HEAPF64.subarray(buf/BPE, buf/BPE + size), 
    i; 
// Populate the array and process the numbers: 
parseResult(result, numbers); 
Module.myFunc(buf, size); 

Il C++ funzioni per elaborare i numeri assomigliano:

void origFunc(double *buf, unsigned int size) { 
    // process the data ... 
} 
void myFunc(uintptr_t bufAddr, unsigned int size) { 
    origFunc(reinterpret_cast<double*>(bufAddr), size); 
} 

che funziona come previsto, ma mi chiedo se non v'è alcuna possibilità di chiamare il origFunc direttamente da Javascript per sbarazzarsi di myFunc e la bruttoreinterpret_cast.
quando ho cercato di legare origFunc via:

EMSCRIPTEN_BINDINGS(test) { 
    function("origFunc", &origFunc, emscripten::allow_raw_pointers()); 
} 

... e chiamare direttamente:

Module.origFunc(buf, size); 

ottengo l'errore:
Uncaught UnboundTypeError: Impossibile chiamare origFunc a causa di tipi non legati : Pd

Questa è una limitazione generale di emscripten o esiste una soluzione "meno sporca" rispetto a reinterpret_cast funziona?

+0

Non so emscripten bene, ma sembra che si modifica il percorso di l'array assegnato 'buf/BPE' prima di passarlo nella funzione. Sospetto che debba essere "buf". E possibilmente l'argomento dimensione per la funzione dovrebbe essere solo 'size * BPE'. – Niall

+0

L'errore parla di tipo 'Pd' ma i frammenti di codice non mostrano' Pd', che cos'è 'Pd'? – Niall

+0

IMHO "Pd" deriva da emscripten e rimane per "Pointer double" –

risposta

0

È possibile utilizzare un static_cast se

  • specificare che la funzione prende un void * piuttosto che un uintptr_t;

  • non usano EMSCRIPTEN_BINDINGS, ma utilizzare il modo EMSCRIPTEN_KEEPALIVE + cwrap/ccall di comunicare JS-> C++. Per qualche motivo, il modo EMSCRIPTEN_BINDINGS ha provocato un'eccezione getTypeName is not defined quando l'ho provato.

Quindi la funzione è simile:

extern "C" int EMSCRIPTEN_KEEPALIVE myFunc(void *bufAddr, unsigned int size) { 
    origFunc(static_cast<double *>(bufAddr), size); 
    return 0; 
} 

che può essere chiamato da JavaScript per

Module.ccall('myFunc', 'number' ['number', 'number'], [buf, size]); 
Problemi correlati