2015-01-29 3 views
-4

Я продолжаю получать ошибку переполнения стека, но я не могу понять, почему и как ее исправить. Вот мой код:Ошибка переполнения стека - C#

private void ShowDiff(int leftIndex, int rightIndex) 
     { 
      if (leftIndex > 0 && rightIndex > 0 && 
       _compareFunc(_left[_preSkip + leftIndex - 1], _right[_preSkip + rightIndex - 1])) 
      { 
       ShowDiff(leftIndex - 1, rightIndex - 1); 
       FireLineUpdate(DiffType.None, _preSkip + leftIndex - 1, -1); 
      } 
      else 
      { 
       if (rightIndex > 0 && 
        (leftIndex == 0 || 
        _matrix[leftIndex, rightIndex - 1] >= _matrix[leftIndex - 1, rightIndex])) 
       { 
        ShowDiff(leftIndex, rightIndex - 1); 
        FireLineUpdate(DiffType.Inserted, -1, _preSkip + rightIndex - 1); 
       } 
       else if (leftIndex > 0 && 
         (rightIndex == 0 || 
          _matrix[leftIndex, rightIndex - 1] < _matrix[leftIndex - 1, rightIndex])) 
       { 
        ShowDiff(leftIndex - 1, rightIndex); 
        FireLineUpdate(DiffType.Deleted, _preSkip + leftIndex - 1, -1); 
       } 
      } 

     } 

Это ошибка, я получаю:

Необработанное исключение типа «System.StackOverflowException» произошло в Comparer.exe

Любая помощь приветствуется.

+2

Вам необходимо тщательно оценить, как ведет себя рекурсивность этого метода, так что вы всегда будете кончать. Может быть, вы даете ему большую часть данных, так что даже если она работает точно так, как должна, она будет потреблять больше, чем размер стека по умолчанию, равный 1 МБ? –

+4

Вы пробовали пройти через него или использовать отладочные отпечатки, чтобы увидеть, что происходит? – pquest

+0

Это классический бесконечный цикл. Как было предложено @pquest, напечатайте значения перед вашей функцией сравнения и где вы называете свою рекурсивную точку (1-й, 2-й или 3-й вызов). Вы легко узнаете, где ваш цикл бесконечен. – rodrigogq

ответ

0

EDIT: Добавлен разрыв, в случае, если ни одно условие не является истинным.


Вместо этого перепишите функцию, используя петлю. Кроме того, вы можете немного упростить свою логику.

Примечание: предположение, что и leftIndex, и rightIndex больше, чем 0.

private void ShowDiff(int leftIndex, int rightIndex) 
{ 
    while(leftIndex > 0 && rightIndex > 0) 
    { 
     if (leftIndex > 0 && rightIndex > 0 && 
       _compareFunc(
        _left[_preSkip + leftIndex - 1], 
        _right[_preSkip + rightIndex - 1])) 
     { 
      leftIndex--; 
      rightIndex--; 
      FireLineUpdate(
       DiffType.None, 
       _preSkip + leftIndex - 1, 
       -1); 
     } 
     else 
     { 
      if (rightIndex > 0 && 
        (_matrix[leftIndex, rightIndex - 1] >= 
         _matrix[leftIndex - 1, rightIndex])) 
      { 
       rightIndex--; 
       FireLineUpdate(
        DiffType.Inserted, 
        -1, 
        _preSkip + rightIndex - 1); 
      } 
      else if (_matrix[leftIndex, rightIndex - 1] < 
         _matrix[leftIndex - 1, rightIndex])) 
      { 
       leftIndex--; 
       FireLineUpdate(
        DiffType.Deleted, 
        _preSkip + leftIndex - 1, 
        -1); 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
}