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?
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
L'errore parla di tipo 'Pd' ma i frammenti di codice non mostrano' Pd', che cos'è 'Pd'? – Niall
IMHO "Pd" deriva da emscripten e rimane per "Pointer double" –