За пределами исключения - PullRequest
0 голосов
/ 05 мая 2010
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.

Ответы [ 6 ]

1 голос
/ 05 мая 2010

Вы получаете ошибку off-by-1, когда вы начинаете с i = expression.Length. Этот первый индекс будет вне пределов сразу. Вы можете переписать цикл как цикл for следующим образом:

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;
}
1 голос
/ 05 мая 2010

Я бы поменял тест:

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

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

1 голос
/ 05 мая 2010

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

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

1 голос
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

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

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

0 голосов
/ 05 мая 2010

Вам нужно:

int i = expression.Length;

и затем в цикле while вам понадобится:

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

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

...