gpt4 book ai didi

javascript - 来自 Javascript 的 C 中的 Emscripten OOB 异常

转载 作者:行者123 更新时间:2023-11-30 16:36:59 25 4
gpt4 key购买 nike

我正在尝试使用 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*,因此 dataPtrchar**

_printIntMatrix(pointerHeap, nbData)表示_printIntMatrix(pointerHeap | 0, nbData),最终是_printIntMatrix(NULL, nbData) .

因此,如果 printIntMatrix 不需要 char ***mat_printIntMatrix(dataPtr, nbData); 就可以工作。

关于javascript - 来自 Javascript 的 C 中的 Emscripten OOB 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com