Здавалка
Главная | Обратная связь

Отладка и выполнение программы



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

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

Если программа набирается заново, то есть активное окно имеет имя NONAME00.PAS, то при нажатии клавиши F2 выполнится команда File/ Save as... При этом появится диалоговое окно со списком файлов - программ из текущего раздела. В области Save file as набирается имя файла, с которым он будет сохранен на диске. Если не ставить точку и расширение, то имя автоматически будет дополнено расширением .PAS. После записи на диск имя в текущем окне редактора сменится на заданное. После дальнейшего набора программы или ее корректировки при нажатии клавиши F2 будет выполняться команда File/ Save, и никаких дополнительных запросов происходить не будет.

При переходе к новой программе окно с текстом старой программы закрывают (<Alt+F3> или Window/ Close, хотя это и не обязательно) и открывают новое активное окно (File/ New). При необходимости чтения другой, ранее набранной программы, выполняется команда File/ Open... (F3), в появляющемся диалоговом окне в области Files перемещением маркера выбирается нужный файл и нажимается клавиша Enter, эквивалентная кнопке диалогового окна Open.

После ввода всей программы ее можно либо откомпилировать с целью устранения синтаксических ошибок (<Alt+F9>), либо сразу отдать команду на выполнение (<Ctrl+F9>). В последнем случае все равно выполнится предварительная компиляция, и если присутствуют синтаксические ошибки, программа выполняться не будет.

 

Все ошибки программ делятся на два больших класса: ошибки компиляции и ошибки выполнения. О первом типе ошибок сообщает компилятор до запуска программы на выполнение с указанием типа ошибки и предполагаемого ее места. К сожалению, ошибка может быть и не там, где стоит курсор; его положение это фактически то место, где компилятор "осознает" ошибку. Например, если имеется лишний BEGIN в программе, то компилятор не поймет этого до тех пор, пока пары BEGIN... END не будут сбалансированы. На начальном этапе программирования большинство синтаксических ошибок происходит из-за невнимательности набора программы. Даже в первой строке часто делаются ошибки:

 

Programm Summa;

...

Error 36: BEGIN expected.

 

Служебное слово Program пишется с одним m. В данном примере пояснение причины ошибки не имеет особого смысла, ожидается оператор BEGIN, — и такое случается довольно часто. Более осмысленное толкование происходит в следующем случае:

 

Program Summa 1;

...

Error 85: ";" expected.

 

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

Довольно часто курсор устанавливается в строке, следующей за ошибочной:

 

Error 85: ";" expected.

...

C:=2.3

A:=B*C;

 

Точка с запятой должна стоять перед А, то есть в конце предыдущей строки.

В любом случае при непонимании ошибки следует обратиться к синтаксису отмеченной конструкции языка Турбо Паскаль, либо к предыдущей.

 

Ошибки выполнения появляются после компиляции и запуска программы на выполнение, и на экране пользователя выдается сообщение вида

 

Run-time error < nnn > at < xxxx:yyyy >

 

где nnn номер ошибки выполнения, xxxx:yyyy адрес ошибки выполнения.

Ошибки выполнения искать труднее, чем синтаксические. Это и ошибки на уровне DOS, и ошибки ввода - вывода, и критические ошибки, и фатальные ошибки. Но, хотя ошибок данного класса довольно много, в данном курсе лабораторных работ чаще всего появляются только две фатальные ошибки:

 

200 Division by zerro (Деление на нуль)

205 Floating point overflow (Переполнение при операции с плавающей точкой)

 

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

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

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

Проверка границ.{$R+}, эквивалент меню Options/ Compiler, опция Runtime errors/ Range checking.

Данная директива приводит в действие генерацию кода проверки границ. Все выражения с индексированными строками и массивы проверяются на предмет нахождения их внутри указанных границ, а все операторы присваивания значений скалярным величинам и переменным поддиапазонов также проверяются на нахождение в заданных границах. Если обнаруживается нарушение диапазона, программа завершает свою работу, выводя сообщение об ошибке выполнения при проверке границ:

 

201 Range check error

 

Проверка переполнения при математических операциях. {Q+}, эквивалент меню Options/ Compiler, опция Runtime errors/ Overflow checking.

Проверяется результат операций над целочисленными данными. Программа завершает работу аналогично:

 

215 Arithmetic overflow error

 

ИИО Турбо Паскаля имеет два экрана. На основном экране набираются, просматриваются и редактируются программы, отдаются команды ИИО, устанавливаются параметры работы и так далее. Но при запуске программы появляется другой экран экран пользователя. Сюда помещаются результаты работы по программе, и он виден до тех пор, пока программа не перестанет выполняться. Так как в данном курсе лабораторных работ программы весьма просты, то они выполняются практически мгновенно, и снова появляется основной экран ИИО. Для просмотра экрана пользователя нажимается комбинация клавиш <Alt+F5>.Для возврата к основному экрану можно нажать любую клавишу. Если в процессе запуска программы возникнет необходимость прервать ее работу, например в случае "зацикливания" программы, используют комбинацию клавиш <Ctrl+Break>.

На экране пользователя мы увидим либо сообщение об ошибке выполнения, либо результат (если пропущен оператор вывода, естественно, результата не будет). Результат может быть и неверным как из-за неправильно составленного алгоритма, так и из-за ошибок в программе, которые формально, с точки зрения транслятора, ошибками не являются. Например, при вычислении суммы по следующему фрагменту программы

 

S:=0;

For I:=1 to 10 do ;

S:=S+1/I ;

Writeln (S:8:5);

 

результат вычислений будет равен 0.10000. Здесь после служебного слова DO стоит пустой оператор, поэтому именно он, то есть "ничто" будет выполняться десять раз. Затем к нулю прибавится одна десятая. Формально программа составлена правильно, и такую конструкцию иногда используют в качестве задержки по времени, но фактически десять раз должен выполняться оператор из третьей строки.

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

Первый метод самый универсальный и может использоваться с любыми языками программирования, трансляторами и ассемблерами. Заключается он в выводе промежуточных результатов. Внутрь цикла, или в "подозрительные" места программы временно вставляются операторы вывода изменяемых переменных. Например, программа (приведен фрагмент)

 

For i:=1 to 15 do

Begin

S:=S+1/i;

i:=i+1

end;

 

просто "зацикливается" (если не используются директивы контроля). Но если перед i:=i+1 поставить оператор

 

Writeln (S:8:5,i:8);

 

то после запуска программы появятся два столбика бегущих чисел. Если приостановить вывод информации на экран монитора клавишей Pause, то сразу будет видно, что i изменяется не с шагом 1, а 2. То есть параметр цикла изменяется и в операторе For, и в операторе присваивания.

Второй метод привлекает средства отладки ИИО. Предварительно установив программный счетчик на начало программы (<Ctrl+F2>), открывается окно наблюдаемых переменных (<Ctrl+F7>): в Watch-окне набирается имя первой контролируемой переменной, нажимается Enter. После этого появляется окно с именем Watches и значением этой переменной. Добавление переменных в окно выполняется необходимое количество раз. Для пооператорного выполнения программы предназначена "горячая" клавиша F7. После каждого нажатия клавиши F7 выполняется один оператор. Если он производит изменение значения переменной, то это сразу отразится в окне наблюдения.

Таким образом, анализируя изменение значений переменных при пооператорном выполнении программы, легко найти ошибку в алгоритме, и соответственно в программе.

По завершении работы с ИИО, из нее можно выйти по комбинации клавиш <Alt+X>.

 








©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.