나는이에 조금 늦게 해요,하지만 그것은 가치가 무엇인지에 대한 ...
JS와 Emscripten 사이에 내가 했어 발견했습니다 런타임 숫자 형식을 전달 작업
Uint8Array
유형의 유형이 지정된 배열로 작업하고, 필요한 경우 다른 유형에서보기를 변경하십시오. 이런 일이 같은 C 함수
myfunc = Module.cwrap('myfunc', null, ['array']);
var v1 = new Float64Array([2.3, 4.2, 6.8, 8.9]);
var uarray = new Uint8Array(v1.buffer); // change the view to Uint8
// before passing
myfunc(uarray);
:
void mfunc(const double *v1)
{
printf("%f %f %f %f\n", v1[0], v1[1], v1[2], v1[3]);
}
인쇄 한 값을 참조한다. 자바 스크립트에서 const
을 먼저 제거하고 v1
에 액세스하는 메모리에 쓰기를 시도하면 ccall
과 cwrap
이 스택을 전달하는 데 스택을 사용하므로 변경 사항이 무시된다는 것을 알 수 있습니다.
C면의 배열을 변경하려면 Module._malloc
을 사용하여 Emscripten 런타임에 일부 메모리를 할당해야합니다.이 포인터는 '포인터'를 제공합니다 (자바 스크립트로 숫자로 처리되고 cwrap
)을 읽고 쓸 수 있습니다. 브라우저 JS 콘솔에 두 배로 인쇄되는
void mfunc(const double *v1, double *v2)
{
printf("%f %f %f %f\n", v1[0], v1[1], v1[2], v1[3]);
int i = 0;
for (i = 0; i < 4; i++)
{
v2[i] = 2 * v1[i];
}
}
은 V1의 값의 목록이 표시됩니다 :
myfunc = Module.cwrap('myfunc', null, ['array', 'number']);
var v1 = new Float64Array([2.3, 4.2, 6.8, 8.9]);
var uarray = new UintArray(v1.buffer);
var ptr = Module._malloc(v1.byteLength);
myfunc(uarray, ptr);
for (var i=0; i<v1.length; i++)
{
console.log(Module.getValue(ptr+i*v1.BYTES_PER_ELEMENT, 'double'));
}
이 같은 C 기능 : 당신은 포인터 '역 참조'에 Module.getValue
을 사용할 수 있습니다 .
분명히 비슷한 방법을 사용하여 myfunc
에 배열을 전달할 수도 있지만 _malloc
데이터를 정리해야하므로 수정하고 싶지 않은 값을 피하는 경향이 있습니다.
[ "array", "number", "number", "number"] [ "배열", "배열", "번호", "번호"]가 아니어야합니까? – pah
@threadp : 나는 asm에서 들었다.j2 IRC 채널은 v2가 Javascript 배열이 아니기 때문에 "배열"을 사용하여 "넘버"를 사용해서는 안됩니다. – Lucas
@ 루카스, 그런 경우 왜 [ "number", "number", "number", "number"]가 아닌가요? –