Pase la matriz a la función C con emscripten

Creo que esta pregunta es similar a esta y utilicé la mayor parte de su respuesta para mi problema, pero todavía tengo problemas:

Primero el código C:

#include  extern "C" { void fillArray(int* a, int len) { for (int i = 0; i<len; i++) { a[i] = i*i; } for (int j = 0; j < len; ++j) { printf("a[%d] = %d\n", j, a[j]); } } } 

Estoy pasando un puntero a una matriz a mi función C y lo lleno con algo de información. Compilo este código con

 emcc -o writebmp.js dummyCode\cwrapCall.cxx -s EXPORTED_FUNCTIONS="['_fillArray']" 

Mi código html / js es el siguiente:

     fillArray = Module.cwrap('fillArray', null, ['number', 'number']); var nByte = 4 var length = 20; var buffer = Module._malloc(length*nByte); fillArray(buffer, length); for (var i = 0; i < length; i++) { console.log(Module.getValue(buffer+i*nByte)); }   

Cuando ejecuto el script, la salida que obtengo es correcta hasta el elemento 12, después de eso es basura. ¿Es el búfer I malloc demasiado pequeño?

Module.getValue toma un segundo argumento opcional, que denota el tipo de que el ‘puntero’ debe estar desreferenciado y, de forma predeterminada, es 'i8' , lo que significa que los enteros con signo de 32 bits se están desreferiendo como enteros de 8 bits, por lo que no está obteniendo basura, pero envolver alrededor de errores.

Arreglar esto es simple, solo necesita especificar que el ‘puntero’ pasado a Module.getValue debe ser referenciado como un entero con signo de 32 bits:

 console.log(Module.getValue(buffer+i*nByte, 'i32')); 

Podría ser más seguro y claro cambiar la statement de fillArray a

 #include  void fillArray(int32_t* a, int32_t len) 

La sección reveladora de los documentos emscripten se puede encontrar aquí