2015-01-31 5 views
-2

Я побежал следующую программу мимо rustc:Почему rustc говорит, что переменная «totalSplitInv» выходит за рамки?

#![feature(slicing_syntax)] 
fn sortAndCountInv(arr: &mut [i64]) -> i64 { 
    return sortAndCountInv_(arr, 0, arr.length - 1) 
} 

fn sortAndCountInv_(arr: &mut [i64], start: i64, finish: i64) { 
    let lengthOfSubarray = finish - start + 1; 
    if (lengthOfSubarray == 0) || (lengthOfSubarray == 1) { 
     return totalSplitInv 
    } 
    else { 
     let half = (start + finish)/2; 
     let leftInv = sortAndCountInv_(arr, start, half); 
     let rightInv = sortAndCountInv_(arr, half + 1, finish); 
     let splitInv = mergeAndCountSplitInv(arr, start, finish, half); 
     return leftInv + rightInv + splitInv 
    } 
} 
fn mergeAndCountSplitInv(arr: &mut [i64], start: i64, finish: i64, half: i64) -> i64 { 
    let aux = arr[start..finish + 1]; 
    let divider = half - start; 
    let mut i = 0; 
    let mut j = divider + 1; 
    let mut totalSplitInv = 0; 
    let lastIndex = aux.length - 1; 
    for k in range(start, finish + 1) { 
     if i > divider { 
      arr[k] = aux[j]; 
      j += 1 
     } else if j > lastIndex { 
      arr[k] = aux[i]; 
      i += 1 
     } else if aux[i] < aux[j] { 
      arr[k] = aux[i]; 
      i += 1 
     } else { 
      arr[k] = aux[j]; 
      j += 1; 
      totalSplitInv += (divider - i) + 1; 
     } 
    } 
    return totalSplitInv 
} 

Когда я пытаюсь скомпилировать его с rustc об-0.12.0-разработчика, я получаю следующее сообщение об ошибке сферы:

inversions.rs:9:16: 9:29 error: unresolved name `totalSplitInv`. 
inversions.rs:9   return totalSplitInv 

Который является скажем, в функции mergeAndCountSplitInv, строка return totalSplitInv недействительна, потому что totalSplitInv выходит за пределы области видимости? Почему это так?

ответ

3

Я думаю, что ошибка указана на return totalSplitInv в sortAndCountInv_, а не mergeAndCountSplitInv.

fn sortAndCountInv_(arr: &mut [i64], start: i64, finish: i64) { 
    let lengthOfSubarray = finish - start + 1; 
    if (lengthOfSubarray == 0) || (lengthOfSubarray == 1) { 
     return totalSplitInv // here 
... 
+0

Да, глупая ошибка. – 11Kilobytes

Смежные вопросы