2016-06-27 5 views
0

asm.js의 함수 사이의 두 배열 전달 같은 크기의 배열 (v2) 출력.난 다음 매개 변수 asm.js로 컴파일 된 C 함수가

나는 컴파일하고 다음 JS 코드를 실행 : 내가 getValue(v2 + 8, "double") 또는 getValue(v2 + 16, "double")을 실행할 때 나는 (잘못) 1.297703e-318, 그것은 0을 반환받을 getValue(v2, "double")를 실행할 때

v1 = new Array(1.0, 1.5, 2.0); 
v2 = Module._malloc(8 * v1.length); 

Module.ccall("myfunc", null, ["array", "number", "number", "number"], [v1, v2, v1.length, 2]); 

을 (이것은 또한 잘못되었습니다).

나는 콘솔의 내용을 v1의 콘솔 로그 아웃으로 줄이고 가비지 데이터도 출력하므로 적어도 전달 된 double 배열을 읽는 데 문제가 있습니다. 자세한 질문은 다음과 같습니다.

  1. 어떻게 double 배열을 asm.js 함수로 올바르게 전달합니까?
  2. asm.js 함수에서 double 배열을 올바르게 반환하려면 어떻게해야합니까?
+0

[ "array", "number", "number", "number"] [ "배열", "배열", "번호", "번호"]가 아니어야합니까? – pah

+0

@threadp : 나는 asm에서 들었다.j2 IRC 채널은 v2가 Javascript 배열이 아니기 때문에 "배열"을 사용하여 "넘버"를 사용해서는 안됩니다. – Lucas

+0

@ 루카스, 그런 경우 왜 [ "number", "number", "number", "number"]가 아닌가요? –

답변

2

나는이에 조금 늦게 해요,하지만 그것은 가치가 무엇인지에 대한 ...

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에 액세스하는 메모리에 쓰기를 시도하면 ccallcwrap이 스택을 전달하는 데 스택을 사용하므로 변경 사항이 무시된다는 것을 알 수 있습니다.

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 데이터를 정리해야하므로 수정하고 싶지 않은 값을 피하는 경향이 있습니다.