Отладка

Вы иногда будуте замечать, что написанная вами функция не работает, или ведёт себя не так, как предпологалась. Это печально, особенно когда неясна причина проблеммы. Это может заставить пологать вас, что:
1) Язык программирования не работает.
2) Я не способен для программирования игры.
Все скрипты были хорошо протестированны, так что вы можете быть уверены, что 1) не место. И не надо себя винить, что вы не способны, ошибки случаются с даже самыми опытными программистами. Фактически, это весьма нормально, что функция не работает с первого раза. И также весьма нормально, что даже профессиональный программист не найдёт причину просто уставившись на код. Профессионалы делают отладку (debug) кода. Эта отладка не является большой тайной. Обычно это происходит по принципу - исследуя подробно весь код, который вы написали, линию за линией. И таким образом вы сможете проверить наличие ошибок в вашем коде. C-Script имеет встроенный отладчик. Его можно запустить, добавив следующую команду, breakpoint, в начале функции, которую вы желаете проверить:

function count_x
{
  breakpoint; // старт для режима отладки
  print("Please enter number...");
  . . .

Если мы теперь запустим уровень и нажмем [P], игра приостановится, мы услышим короткий звук и увидим следующую линию на экране:

<= print(@2)

Это - следующая команда после контрольной точки. Значёк @# является внутренним представлением введенной строки. Теперь нажмите [Space]. Линия прокручивается вверх, и мы видим:

0.000 <= print(@2)
<= screen_txt.string = str

И так, мы выполнили одну команду, вызвав функцию print. Следующая отображенная команда - это первая линия недавно вызванной функции print. Str наша строка "please enter number", которая назначается на screen_txt.string. Нажмите снова [Space] для продолжения:

15135.457 <= screen_txt.string = str
<= screen_txt.visible = on

Странное число (15135.457) это код результата вашего выражения - это внутренний указатель на назначенную строку. Наверняка она будет другой на вашем PC, но скорей всего не изменится. Далее [Space]:

16.000 <= screen_txt.visible = on
<= sleep(1)

Значение screen_tst.visible ушло вверх. Далее код результата не важен для нас, так как на экране мы видим результат запроса: "please enter number". Функция print последняя команда так как следующая линия, sleep(1), возвращается нас к нашей функции count_x. Нажмите [Space] еще несколько раз, и продвигайтесь через функцию линию за линией, пока не добираетесь к следующему:
0.000 <= inkey(entry_line)
<= entered_number = str_to_num(entry_line)
Теперь, там где быстро мигающий курсор, введите "2", и нажмите [Enter]. Далее [Space]:

2.000 <= entered_number = str_to_num(entry_line)
<= str_cpy(entry_line,@4)

Как видим, команда str_to_num преобразовала нашу строку "2" в номер 2, как ожидалось. Для числовых выражений код результата просто показывает число результата. Если мы нажмём [Space] ещё два раза, то можем видеть другой интересный код результата:

1.000 <= (counter < entered_number)
<= str_cat(entry_line,@6)

Код результата для условий if или while ( if или while не отображаются) 1.000 для истины, и 0.000 для ложи. Поэтому мы можем видеть, что условие while здесь было выполнено, и мы теперь входим в цикл. Таким образом, судя по нашим пошаговым инструкциям, мы видим идиальный результат того, что случается когда человек вводит 2 "x" при запросе:

Первый проход

Возвращение в цикл:

Второй проход

Возвращение в цикл:

Третий проход

И так, пока всё хорошо. Мы закончили делать отладку для нашей функции. Нажмите [Ctrl-Space], чтобы выйти из режима отладки и вернуться к нормальному режиму тестирования. Функция в первый раз вела себя как ожидалось, но мы то знаем, что проблема возникает только со второй попытки. Нажмите снова [P], что бы повторно выполнить вход в режим отладки. Теперь при запросе кода, мы вводим число "3". И теперь мы ожидаем 3 цикла. Однако, при первом цикле:

3.000 <= counter += 1;
<= }

Это совсем не то, что мы ожидали! counter увеличивается на 3 в первом цикле, где мы ожидали только 1! В последствии, только один цыкл выполнен, и только один 'x' произведен. И теперь мы можем найти причину: Переменная counter, все еще имеет значение 2 от последнего выполнения функции. Теперь, когда мы нашли ошибку, исправление столь же просто как добавление:

counter = 0;

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

Используйте отладчик в максимально возможной степени. Это - хороший способ учиться, и смотреть как работают ваши функции и как выполняется ваш код. Профессионалы обычно делают отладку кода, даже если им кажется,что программа работает - это способ, которым они могут обнаружить "скрытые ошибки", которые происходят только при некоторых обстоятельствах. Если вы действительно столкнётесь с серьездной проблемой, которую не сможете решить, то обратитесь к статье "общие проблеммы в сценарии" (и как их решать).Узнав об отладке, теперь вы смело можете назвать себя младшим компьютерным программистом. Для нашего следующего урока, мы собираемся воплощать эти навыки в действие и начинать иметь дело с реальной игрой игры. Мы узнаем, как вы можете использовать сценарии, чтобы определить поведение игрока, актеров, или интерфейса пользователя, мощными и интересными способами.

Используются технологии uCoz