Добро пожаловать в Forum.iCoder.Uz

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. После регистрации и входа в систему вы сможете создавать темы, публиковать ответы на существующие темы, повышать репутацию других участников, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?

Задать вопрос

Задавайте вопросы и получайте ответы от нашего сообщества

Отвечать

Отвечайте на вопросы и станьте экспертом в своей теме

Связаться с нами

Наши специалисты готовы ответить на ваши вопросы

[Урок] Как бороться с выходами за пределы массива (CrashDetect)

  • Автор темы Froost
  • Дата начала
  • Ответы 0
  • Просмотры 1K

Информация о теме

О теме Здравствуйте, вы читаете тему Как бороться с выходами за пределы массива (CrashDetect) созданную в в разделе Уроки пользователем Froost. Эта тема была просмотрена 1 102 раз(а), получила 0 комментариев и 3 очки реакции...
Название категории Уроки
Название темы Как бороться с выходами за пределы массива (CrashDetect)
Автор темы Froost
Дата начала
Ответы
Просмотры
Количество реакций к первому сообщению
Последнее сообщение Froost

Froost

Модератор #2
Регистрация
26.04.2017
Сообщения
118
Реакции
223
Баллы
35
распишу здесь один распространённый случай, в котором срабатывает CrashDetect.

[HIDE-THANKS]Допустим, у нас есть скрипт test.pwn:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
При выполнении этого кода плагин CrashDetect выведет сообщение:
Код:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!

Для начала откомпилируем код в режиме отладки (в теме про CrashDetect написано, как это сделать) и запустим скрипт заново:
Код:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Теперь данных в сообщении достаточно, чтобы найти причину ошибки.
"Array index out of bounds" переводится как "выход за пределы массива".
Означает это, что вы что-то пытаетесь сделать с несуществующим элементом массива.

Обратите внимание: в сообщении красным цветом выделен несуществующий элемент, зелёным - максимальный номер элемента в массиве.
Код:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Ошибка произошла из-за того, что сервер попытался получить доступ к 10-му элементу массива, когда в массиве есть только элементы с номерами от 0 до 9.
Также синим цветом выделено название исходного файла (иногда ошибки возникают не только в .pwn мода, но и в инклудах и фильтрскриптах) и номер строки, на которой произошла ошибка.
Код:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Смотрим строку №7 в test.pwn:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Обратите внимание на условие выхода из цикла: выход происходит только когда i становится равно 20.
При этом размер массива - 10 элементов.

Как нам исправить эту проблему? Нужно сделать так, чтобы цикл был не до 20, а до (<размер массива> - 1).
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Проблема решена? Ещё нет.
Выхода за пределы массива не будет, но что, если в будущем понадобится изменить размер массива, скажем, с 10 до 8?
Представьте себе мод из 30 000 строк кода: вам придётся обыскивать весь мод, чтобы найти, в каких циклах происходит перебор массива, и во всех этих циклах заменять 10 на 8.
Это как бомба замедленного действия: сейчас вы решите проблему, но вместо неё в будущем появится другая.
Чтобы такого не было, в цикле следует использовать оператор sizeof, который возвращает размер массива.
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Можно немного упростить запись, убрав "- 1" и заменив знак "меньше или равно" на "меньше".
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
В итоге получится такой код:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Компилируем и запускаем:
Код:
PHP:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого кодов!
Код работает без ошибок. Проблема решена.[/HIDE-THANKS]
 
shape1
shape2
shape3
shape4
shape7
shape8
Сверху Снизу