我正在尝试使用Emscripten将字符串数组从JS传递到C。我将数组传递给C,但是当我尝试遵循时,它不起作用,这会引起“索引超出范围”。我已经尝试了许多不同的方法,所以我将发布最少的代码来重现该问题(至少在我的机器上!)。我敢肯定我错过了什么...
基本上是尝试将一个字符串放入(字符串的)数组中,并将其提供给C进行打印(我当然在做其他事情)。随时将“ gmp_”或“ mpz_”更改为您的(这不是问题)。
Javascript:
var nbData = 1;
var nbColPerData = 1;
var data = new Uint32Array(nbColPerData);
data[0] = this.i2wasm(this.mod);
var nBytes = data.length * data.BYTES_PER_ELEMENT;
var dataPtr = Module._malloc(nBytes);
var dataHeap = new Uint8Array(Module.HEAP8.buffer,dataPtr,nBytes);
dataHeap.set(new Uint8Array(data.buffer));
// create array of pointers
var pointers = new Uint32Array(nbData);
for (var i =0; i < pointers.length; i++) {
pointers[i] = dataPtr + i * data.BYTES_PER_ELEMENT;
console.log("pointers["+i+"] = " + pointers[i].toString(16));
}
// create pointer array on the heap
var nPointerBytes= pointers.length * pointers.BYTES_PER_ELEMENT;
var pointerPtr = Module._malloc(nPointerBytes);
var pointerHeap = new Uint8Array(Module.HEAP8.buffer, pointerPtr,nPointerBytes);
pointerHeap.set( new Uint8Array(pointers.buffer));
printIntMatrix(pointerHeap,nbData)
Module._free(pointerHeap.byteOffset);
Module._free(dataHeap.byteOffset);
i2wasm(将wasm的十六进制字符串转换为int数组,可以正常工作):
return allocate(intArrayFromString(integer),'i8',ALLOC_NORMAL);
C代码:
void EMSCRIPTEN_KEEPALIVE printInt(char *hex) {
mpz_t n;
mpz_init(n);
printf("printing INT at %p\n",hex);
/////////////////////////////////////
// HERE IT PANICS !
/////////////////////////////////////
printf("printing INT value: %c\n",*hex);
if (mpz_set_str(n,hex,16) != 0) {
printf("hexadecimal invalid");
return;
}
gmp_printf("printInt: %Zd\n",n);
mpz_clear(n);
}
void EMSCRIPTEN_KEEPALIVE printIntMatrix(char **mat, int n) {
printf("printIntMatrix !!\n");
for(int i = 0; i < n; i++) {
printf("matrix[%d] => \n",i);
printf("matrix[%d] => %p\n",i,mat[i]);
printInt(mat[i]);
printf("matrix[%d] => %p DONE\n",i,mat[i]);
}
}
最佳答案
i2wasm()
返回char*
,所以dataPtr
是char**
。_printIntMatrix(pointerHeap, nbData)
表示_printIntMatrix(pointerHeap | 0, nbData)
,最终是_printIntMatrix(NULL, nbData)
。
因此,如果printIntMatrix
不需要char ***mat
,则_printIntMatrix(dataPtr, nbData);
将起作用。