簡體   English   中英

Emscripten:調用修改數組元素的C函數

[英]Emscripten: Calling a C function that modifies array elements

我有一個簡單的C函數來修改整數數組的元素。 我可以使用Emscripten(emcc)將其轉換為JavaScript而不會出現問題。 但是當我在JS數組上調用該函數時,其中的值似乎沒有改變。 請幫忙。

這是C函數定義:

/* modify_array.c */
void modify_array(int X[8]) {
  int i;
  for (i = 0; i < 8; ++i) {
    X[i] += 1;
  }
}

這是我用來將C代碼轉換為JS的命令:

emcc modify_array.c -o modify_array.js -s EXPORTED_FUNCTIONS="['_modify_array']"

這是用於調用已轉換的JS代碼的JavaScript(Node.js)代碼:

var mod = require("./modify_array.js");
var f = mod.cwrap("modify_array", "undefined", ["array"]);

var X = [0, 1, 2, 3, 4, 5, 6, 7];
var bytesX = new Uint8Array(new Int32Array(X).buffer);

/* Invoke the emscripten-transpiled function */
f(bytesX);


console.log(new Int32Array(bytesX.buffer));

運行JS代碼后,緩沖區包含的值與原始值相同,而不是遞增的值。 為什么? 如何獲取更新的值?

Emscripten的內存模型是一個單獨的平面陣列。 這意味着當您向已編譯的C方法提供數據數組時,它將被復制到單個數組中,這是唯一可以訪問它的地方(ccall / cwrap方法為您執行此操作)。 換句話說,您傳遞的所有參數都是按值而不是通過引用,即使它們是數組(在JS中通常通過引用傳遞)。

要在emscripten內存模型中工作,您可以在單個平面陣列中使用內存,

var ptr = Module._malloc(8);
var view = Module.HEAPU8.subarray(ptr, ptr+8);
var f = Module.cwrap("modify_array", "undefined", ["number"]);
f(ptr);

這在單個數組中保留一個空格,並且在單個數組上使用子數組,我們可以訪問它的值。 注意使用number作為類型。 我們正在傳遞ptr ,它是指向緩沖區的指針。 作為指針,它只是一個數字,指的是單個數組中的位置。

(請注意,您應該在適當的時候free撥打電話。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM