2017-05-18 18 views
2

以下はan example that calls C code from JavaScript with an arrayan example that calls Rust functions from JavaScript without parametersに基づいて作った私の錆とJavaScriptコードです。 :私は正常に実行することにより、表示array.jsにdisplay-array.rsコードをコンパイルしているEmscriptenでコンパイルされたJavaScriptからRustへ配列を渡すにはどうしたらいいですか?

display-array.rs

#![feature(link_args)] 

#[link_args = "-s EXPORTED_FUNCTIONS=['_display_array']"] 
extern {} 

#[no_mangle] 
pub fn display_array(array: &[f32]) { 
    println!("Rust - array size: {}", array.len()); 
    println!("Rust - array: {:?}", array); 
} 

fn main() { 
    /* Intentionally left blank */ 
} 

callDisplayArray.js

var Module = require("./display-array.js"); 

// Import function from Emscripten generated file 
display_array = Module.cwrap('display_array', 'number', ['number']); 

var data = new Float32Array([1, 2, 3, 4, 5]); 

// Get data byte size, allocate memory on Emscripten heap, and get pointer 
var nDataBytes = data.length * data.BYTES_PER_ELEMENT; 
var dataPtr = Module._malloc(nDataBytes); 

// Copy data to Emscripten heap (directly accessed from Module.HEAPU8) 
var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes); 
dataHeap.set(new Uint8Array(data.buffer)); 

console.log("Javascript - nDataBytes: " + nDataBytes + " , dataHeap.byteOffset: " + dataHeap.byteOffset + " , dataHeap: " + dataHeap); 

display_array(dataHeap.byteOffset); 

rustc --target asmjs-unknown-emscripten display-array.rs 

私はコマンドを使用して、私のJavascriptのコードを実行します。ここでは

node callDisplayArray.js 

は、デバッグメッセージです:

Javascript - nDataBytes: 20 , dataHeap.byteOffset: 5260840 , dataHeap: 0,0,128,63,0,0,0,64,0,0,64,64,0,0,128,64,0,0,160,64 

Rust - array size: 0 

Rust - array: [] 

錆の配列は空です。私はRustとEmscriptenの両方に新しいので、ここで本当に迷っています。おそらく、私はEmscriptenでCを使用するときに呼び出されるようなModule._mallocを呼び出すべきではなく、代わりに何かを使用するべきでしょうか?

+4

錆スライスがあるので、それができる**ない** Cの配列と同じこと。 Cインターフェイスを使って話すときは、Rust特有の型( '&[_]'など)を使うべきではありません。代わりに '* const f32、usize'のようにC互換の引数だけを取ってそこから移動するように関数を変更してみてください。 –

+2

ところで、これ以上不安定なlink_args機能を使用する必要はありません。その記事は古くなっています。代わりに、関数を "extern"とマークするだけで(Cにエクスポートするように)、 "EXPORTED_FUNCTIONS"が生成され、自動的にEmscriptenに渡されます。 – RReverser

答えて

0

ありがとうございました。私は*const f32を使用するコードを編集し、今私は、配列の内容を印刷することができる午前:

pub fn display_array(array_ptr: *const f32, array_length: isize) { 
    for offset in 0..array_length { 
     unsafe { println!("Rust - value in array: {:?}", *array_ptr.offset(offset)); } 
    } 
} 
関連する問題