Подтвердить что ты не робот

Что такое ошибка типа "один за другим" и как ее исправить?

Что такое ошибка "один за другим"? Если у меня есть один, как я могу это исправить?

4b9b3361

Ответ 1

ошибка "один за другим", например, когда вы пишете, намереваетесь выполнить цикл n раз и напишите что-то вроде:

for (int i = 1; i < n; ++i) { ... }

или:

for (int i = 0; i <= n; ++i) { ... }

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

Цикл может быть написан правильно как:

for (int i = 0; i < n; ++i) { ... }

Цикл for - это особый случай цикла while. Такая же ошибка может быть допущена в циклах while.

Ответ 2

Распространенная путаница возникает из-за того, что некоторые языки нумеруют векторы с нуля (например, C), а другие языки - с одного (например, R). Таким образом, вектор x размера n имеет элементы, идущие от x[0] до x[n-1] в C, но от x[1] до x[n] в R.

Вы также сталкиваетесь с проблемой "один за другим" при кодировании общей идиомы для циклического увеличения:

В C:

i = (i+1)%n

В R:

i <- (i-1)%%n + 1

Ответ 3

Скажем, у вас есть следующий код с массивом и циклом for:

char exampleArray[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };

for(int i = 0; i <= 11; i++)
{
  print(exampleArray[i])
}

Видите проблему здесь? Поскольку я посчитал, что в моем массиве одиннадцать символов, я настроил цикл на 11 итераций. Однако в большинстве языков массивы начинаются с нуля, а это означает, что когда мой код отправляется на печать

exampleArray[11]

Я получу ошибку индекса вне границ, потому что массив в примере не имеет значения в индексе одиннадцать.

В этом случае я могу легко это исправить, просто попросив мой цикл выполнить итерации несколько раз.

Самый простой способ устранить эту проблему - распечатать верхнюю и нижнюю границы и посмотреть, какое значение генерирует ошибку индекса за пределами границ, а затем установить значение на единицу больше или на единицу меньше, чем на протяжении всей итерации.

Конечно, это предполагает, что ошибка генерируется циклом, идущим на один или меньше границ массива, существуют другие ситуации, когда может возникнуть ошибка индекса вне границ, однако это наиболее распространенный случай. Индекс вне границ всегда будет относиться к попытке доступа к данным, где данные не существуют из-за того, что границы прошлого не находятся в границах данных.