2010-05-04 3 views
0
public override Models.CalculationNode Parse(string expression) 
{ 
    var calNode = new Models.CalculationNode(); 

    int i = expression.Length; 
    char[] x = expression.ToCharArray(); 
    string temp = ""; 

    //Backwards assembly of the tree 

    //Right Node 
    while (!IsOperator(x[i]) && i > 0) 
    { 
     if (!x[i].Equals(' ')) temp = x[i] + temp; 
     i--; 
    } 
} 

Прошло некоторое время с тех пор, как я использовал деревья, и я получаю исключение из пределов во время цикла while.Исключение за пределами

ответ

1

У вас есть ошибка при запуске с i = expression.Length. Этот первый индекс будет за пределами дистанции. Вы можете переписать цикл как цикл так:

char[] x = expression.ToCharArray(); 
string temp = ""; 

//Backwards assembly of the tree 

//Right Node 
for (int i = x.Length - 1; i >= 0 && !IsOperator(x[i]); --i) 
{ 
    if (!x[i].Equals(' ')) temp = x[i] + temp; 
} 
+0

спасибо, что это намного чище – Matt

1

массив символов от нуля до длины 1-

1

Вы должны попробовать писать int i = x.Length - 1;.

Как только x содержит элементы проиндексированы от 0 к x.Length - 1, x[expression.Length], кажется, только один элемент из границ.

1

Я бы обратный тест:

while (i >= 0 && !IsOperator(x[i])) 

потому что IsOperator будет оцениваться первым и я буду -1 в конце цикла (не выдерживая любые проблемы, которые могли бы иметь с стартом петля).

0

Понадобится:

int i = expression.Length; 

, а затем в цикле в то время как вам нужно будет:

while (!IsOperator(x[i]) && i >= 0) 

Массивы 0 на основе , поэтому 0 - первое положение, а конечное положение - минус 1.

0

Вы устанавливаете i как длину t строка, начинающаяся с 1. Индексирование массива начинается с 0, поэтому, когда вы получаете доступ к элементу в конце, вы фактически пытаетесь выйти за пределы вашей границы. Это первый запуск цикла, который вызывает ошибку.

Вам необходимо добавить -1 к вашей инициализации i.

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