我正在尝试使用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);将起作用。

10-06 15:05