2017-06-11 6 views
0

notes[x]行で計算された127 f64の値の配列が必要です。Rustの配列に値を代入すると、エラーが発生します: '予想されるf64、使用が見つかりました'

let mut notes: [f64; 127]; 
let a = 440; 
for x in 0..127 { 
    notes[x] = (a/32) * (2^((x - 9)/12)); 
} 

これはエラーです:

error[E0308]: mismatched types 
--> src/main.rs:5:20 
    | 
5 |   notes[x] = (a/32) * (2^((x - 9)/12)); 
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected f64, found usize 

答えて

4

コンパイラはxは、それがインデックスnotesのために使用されているようusizeとして推測され、それがの一部ですので、あなたがnotes[x]usizeを割り当てていると考えて右側の式。 xが含まれていない場合、式の戻り値の型は、と推定されます。aには明示的な型がなく、デフォルトの整数型はi32です。

右側の式がf64を返すようにするには、コンポーネントがf64であることを示し、いくつかのキャストを実行する必要があります。あなたも(あなたが電源を実行したいと仮定した場合)powf^を変更する必要があります:

let a = 440f64; 

notes[x] = (a/32.0) * 2f64.powf((x as f64 - 9.0)/12.0); 

これはしかし、十分ではありません。

error[E0381]: use of possibly uninitialized variable: `notes` 
--> <anon>:5:9 
    | 
5 |   notes[x] = (a/32.0) * 2f64.powf((x as f64 - 9.0)/12.0); 
    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ use of possibly uninitialized `notes` 

この問題を解決するために、以下を行う必要があり配列notesを初期化します。 0と一緒に:

let mut notes: [f64;127] = [0f64;127]; 
+0

「^」は「pow」を意味します。 – ildjarn

+0

ああ、私はそれを逃した。私はこれを含めるでしょう。 – ljedrz

+0

ありがとうございました。錆はまだJavaの背景から移行するのは難しい、私にとっては非常に新しいです。 – VikingPingvin

3

あなたは整数除算をしたくないと思います。 440/32はの代わりに13となり、(x - 9)/12と同じ問題が発生します。したがって、厳密にfloat型を使用してください。

let mut notes:[f64;127] = [0.0; 127]; 
let a = 440.0; 
for x in 0..127{ 
    notes[x] = (a/32.0) * ((x as f64 - 9.0) /12.0).exp2(); 
}