2017-06-11 4 views

Antwort

4

Der Compiler denkt, dass Sie ein usize zu notes[x] zuweisen, weil x als usize geschlossen wird, wie es notes für die Indizierung verwendet wird, und es ist ein Teil der rechte Seite Ausdruck. Wenn er x nicht enthält, wird der Rückgabetyp des Ausdrucks als i32 gefolgert, da er a enthält, der keinen expliziten Typ hat und der Standardintegraltyp i32 ist.

Damit der Ausdruck der rechten Seite f64 zurückgibt, müssen Sie angeben, dass die Komponenten f64 sind und ein paar Umwandlungen durchführen. Sie werden auch ^ zu powf ändern müssen (vorausgesetzt, Sie eine Leistung ausgeführt werden soll):

let a = 440f64; 

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

Das ist nicht genug, aber:

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` 

Um dieses Problem zu lösen, müssen Sie initialisieren das notes Array, z mit Nullen:

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

Ich nehme an '^' meinte 'pow'. – ildjarn

+0

Ah ja, das habe ich verpasst; Ich werde das einbeziehen. – ljedrz

+0

Vielen Dank für die Hilfe. Rust ist immer noch sehr neu für mich, ein bisschen schwer von Java-Hintergründen zu wechseln. – VikingPingvin

3

Ich nehme an, dass Sie keine Integer-Division wollen. 440/32 nimmt 13 statt 13.75 und das gleiche Problem in (x - 9)/12. Verwenden Sie daher ausschließlich Float-Typen.

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(); 
} 
Verwandte Themen