Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LABs1-10a.doc
Скачиваний:
36
Добавлен:
10.05.2015
Размер:
1.01 Mб
Скачать

Лабораторная работа n°4.Ознакомление со средствами компиляции и отладки в среде Turbo Pascal 7.0.

Цель работы : знакомство со средой программирования Turbo

Pascal версии 7.0, в частности - со средствами компиляции, за-

пуска и отладки.

Введение

Решение задачи на ЭВМ с помощью интерактивной интегрирован-

ной среды Turbo Pascal 7.0 включает в себя, обычно, набор и ре-

дактирование текста программы в редакторе среды, компиляцию с

одновременным поиском синтаксических ошибок и, наконец, отладку

- наиболее трудоемкий и важный этап разработки программы.

Интегрированная интерактивная среда разработки программ

TurboPascal7.0 (англ.IntegratedDevelopmentEnvironment-IDE)

включает в себя ряд средств, облегчающих разработку программ:

автоматическое управление проектами, средства обеспечения мо-

дульной структуры программы, быструю компиляцию и простые в ис-

пользовании оверлеи. Но несмотря на все это, практически каждая

программа все равно может содержать ошибки, что не позволит ей

корректно работать. Целям выявления и исправления ошибок как раз

и служит процесс отладки, который в IDE обеспечивается возмож-

ностью обнаружения ошибок компилятором среды и специальным ее

компонентом - отладчиком. Далее рассмотрим средства компиляции и

отладки программ в IDE.

I. Теоретическая справка

1. Компиляция и выполнение

IDE предоставляет несколько способов создания выполняемой

программы, модуля или динамически компонуемой библиотеки :

* Компиляция текущего файла с помощью пункта меню (Compile│Compile).

* Компиляция всех измененных файлов (Compile│Make).

* Компиляция всех файлов проекта (построение задачи)(Compile│Build).

* Компиляция и выполнение программы (Run│Run).

На начальном этапе программирования, обычно используется

лишь последний способ. Но в дальнейшем при необходимости постро-

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

все остальные. Каждая из этих возможностей подходит для конкрет-

ной ситуации. Следующие разделы рассказывают о них подробнее.

1.1. Компиляция

Для компиляции текущего файла используется команда среды

(пункт меню) Compile│Compile, которая компилирует только файл в

активном окне редактирования. При компиляции программы выводится

окно состояния, в котором сообщается о ходе и результатах компи-

ляции. Когда компиляция и компоновка будет выполнена успешно,

нажатие любой клавиши приведет к исчезновению окна состояния.

Если же имеется ошибка, то в верхней части окна редактирования

появится сообщение об ошибке, курсор будет позиционирован на ту

строку кода, где она обнаружена и процесс компиляции остановит-

ся. После исправления ошибки компиляцию можно произвести заново.

1.1.1. Выбор места назначения компиляции

С помощью команды Compile│Destination можно выбрать компи-

ляцию программы на диск или в память. При выборе компиляции на

диск, выполняемый код программы сохраняется на диске в виде фай-

ла .EXE. Компиляция на диск увеличивает объем оперативной памя-

ти, доступной в интегрированной среде для компиляции и отладки

программы. При выборе компиляции в память, программа будет запи-

сываться в память, и, если не будет сохранЕн выполняемый код то

он будет потерян при выходе из среды. При компиляции на диск по-

лученные в результате файлы .EXE или .TPU сохраняются в том же

каталоге, что и исходные файлы, или в каталоге EXE & TPU (Opti-

ons│Directories), если он задан.

1.2. Редактирование связей

Если программа включает в себя не только исходный код в ак-

тивном окне, например, основной файл, один или более модулей,

внешние модули на языке ассемблера и т.д., то возможно выполнить

редактирование связей программы. При этом компилируется весь ис-

ходный код, который был модифицирован с момента последней компи-

ляции. Если задан основной файл, то командой Make он компилиру-

ется. В противном случае Make компилирует файл в активном окне

редактирования. Перед компиляцией среда проверяет все файлы,

чтобы убедиться, что они существуют и являются текущими.

1.3. Построение

Выполнение команды Compile│Build перестраивает все компо-

ненты программы независимо от того, являются ли они текущими или

нет.

Эта команда аналогична команде Compile│Make, только она вы-

полняет полную перекомпиляцию, даже если файл не изменялся. Если

остановить команду Build, нажав клавиши Ctrl+Break, или при вы-

явлении ошибок, которые прекращают построение, то, выбрав Compi-

le│ Make, можно определить, где это произошло.

1.4. Выполнение

После создания выполняемого файла программы можно запустить

программу на выполнение, чтобы проверить, как она работает. Для

этого используется команда Run│Run. На самом деле, обычно нет

необходимости предварительно компилировать программу. Если код

программы изменился с момента последней компиляции, команда Run

автоматически производит перепостроение и редактирование связей

программы и затем выполняет ее.

1.4.1. Передача программе параметров

Часто некоторые готовые программы операционной среды при

запуске требуют ввода параметров работы из командной строки

("ключи" запуска, входные данные и пр.). При запуске программы

из среды TP 7.0 ей можно передать параметры командной строки.

(Это, естественно, при условии, что в данной программе уже пре-

дусмотрен механизм чтения параметров из командной строки. Еще

важно не путать параметры командной строки с параметрами , пере-

даваемыми внутри программы.) Для вывода диалогового окна Parame-

ters (Параметры) и набора списка параметров, которые хотите ис-

пользовать, выберите команду Run│Paramenters.

2. Отладка в интегрированной среде

IDE для DOS Turbo Pascal предоставляет инструментальные

средства для отладки программ, то есть поиска и исправления оши-

бок.

2.1. Понятие отладки

Отладка - это процесс поиска и исправления ошибок в прог-

рамме, препятствующих корректной ее работе. Перед тем как углу-

биться в специфические средства IDE, которые помогают при отлад-

ке, дадим краткое описание видов ошибок, которые обычно появля-

ются, и различного рода операций, которые используются для их

поиска.

2.2. Виды ошибок

Все встречающиеся ошибки можно условно разделить на три

группы : ошибки этапа компиляции (синтаксические и ошибочное ис-

пользование конструкций языка), ошибки этапа выполнения (семан-

тические) и логические ошибки.

2.2.1. Ошибки этапа компиляции

Ошибки этапа компиляции происходят, когда исходный код

программы нарушает правила синтаксиса языка программирования

Pascal.

Turbo Pascal не может скомпилировать программу, пока она не

будет содержать допустимые операторы языка. Когда компилятор

встречает оператор, который он не может распознать, соответству-

ющий файл выводится в окне редактирования (при построении много-

модульной программы), курсор позиционируется на то место, кото-

рое не понял компилятор, и выводится сообщение об ошибке.

Наиболее общей причиной ошибок этапа компиляции являются

ошибки набора (опечатки), пропущенные точки с запятой, ссылки на

неописанные переменные, передача неверного числа (или типа) па-

раметров процедуры или функции и присваивание переменной значе-

ний неверного типа.

После исправления ошибки можно выполнить компиляцию заново.

После устранения в программе всех синтаксических ошибок и ее ус-

пешной компиляции программа будет готова к выполнению и поиску

ошибок этапа выполнения и логических ошибок.

2.2.2. Ошибки этапа выполнения

Ошибки этапа выполнения происходят, когда компилируется

полная программа, которая при ее выполнении делает что-то недо-

пустимое. То есть, программа содержит допустимые операторы языка

программирования Pascal, но при выполнении операторов что-то

происходит неверно. Например, программа может пытаться открыть

для ввода несуществующий файл или выполнить деление на ноль.

Когда Pascal обнаруживает такую ошибку, она завершает вы-

полнение и выводит сообщение следующего вида:

Run-time error ### at seg:ofs

При выполнении программы из IDE, Pascal автоматически нахо-

дит вызвавший ошибку оператор (как и в случае синтаксических

ошибок). Если программа выполняется вне IDE, то можно запустить

IDE и, чтобы найти вызвавший ошибку оператор, использовать ко-

манду Search│Find Error, которая дает адрес сегмента и смещения

(seg:ofs) и позиционирует курсор на оператор, вызвавший сбой.

2.2.3. Логические ошибки

Логические ошибки - это ошибки проектирования и реализации

программы. То есть, операторы программы допустимы и что-то дела-

ют, но не то, что предполагалось. Эти ошибки часто трудно отсле-

дить, поскольку IDE не может найти их автоматически, как синтак-

сические и семантические ошибки. К счастью, IDE включает в себя

средства отладки, помогающие найти логические ошибки.

Логические ошибки приводят к некорректному или непредвиден-

ному значению переменных, неправильному виду графических изобра-

жений или невыполнению кода, когда это ожидается. Далее будут

обсуждаться методы отслеживания этих логических ошибок.

2.3. Методы отладки

Иногда, когда программа делает что-то непредвиденное и при-

чина достаточно очевидна,то можно быстро исправить код програм-

мы. Но, обычно, логические ошибки более трудноуловимы и вызыва-

ются взаимодействием различных частей программы. В этих случаях

лучше всего остановить программу в заданной точке, пройти ее шаг

за шагом и просмотреть состояние переменных и выражений. Такое

управляемое выполнение - ключевой элемент отладки.

Основной смысл использования встроенного отладчика состоит

в управляемом выполнении. Отслеживая выполнение каждой инструк-

ции, можно легко определить, какая часть программы вызывает

проблемы. В отладчике предусмотрено пять основных механизмов уп-

равления выполнением программы, которые позволяют :

- выполнять инструкции по шагам;

- трассировать инструкции;

- выполнять программу до заданной точки;

- находить определенную точку;

- выполнять сброс программы.

Само по себе выполнение программы по шагам может быть не-

достаточно полезным, разве что поможет найти то место, где

что-то происходит совершенно неверно. Но управляемое выполнение

позволяет проверять состояние программы и ее данных, например,

отслеживать вывод программы и ее переменные.

2.3.1. Выполнение по шагам и трассировка

Команды выполнения по шагам Step Over и трассировки Trace

Into, входящие в пункт меню Run, дают возможность построчного

выполнения программы. Единственное отличие выполнения по шагам и

трассировки состоит в том, как они работают с вызовами процедур

и функций. Выполнение по шагам вызова процедуры или функции ин-

терпретирует вызов как простой оператор и после завершения подп-

рограммы возвращает управление на следующую строку. Трассировка

подпрограммы загружает код этой подпрограммы и продолжает ее

построчное выполнение.

2.3.1.1. Выполнение программы по шагам

При отладке программы, наименьшим выполняемым элементом яв-

ляется строка. Этот означает, что можно управлять отладкой до

уровня отдельной строки исходного кода программы. Поэтому, если

на одной строке программы содержится несколько операторов Паска-

ля, то нет возможности отладить эти операторы индивидуально. С

другой стороны, с целью отладки можно разбить оператор на нес-

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

Все выполнение в отладчике, включая выполнение по шагам,

трассировку и останов, основывается на строках. Подсвечивая

строку, встроенный отладчик всегда сообщает пользователю, какая

строка выполняется следующей (строка выполнения). Строка выпол-

нения выводится цветом, отличным от нормального цвета. Благодаря

этому легко определяется текущая позиция программы.

Выполнение по шагам - это простейший способ выполнения

программы по элементарным фрагментам. Выбор команды Run│Step

Over или нажатие клавиши F8 вызывает выполнение отладчиком всего

кода в операторе, указанном строкой выполнения, включая любые

вызываемые на ней процедуры или функции, пока управление не вер-

нется обратно к вызывающему оператору. После этого строка выпол-

нения указывает следующий выполняемый оператор.

Возьмем, например, следующую программу :

(находится в окне N° 1 (файл example1.pas))

Program StepTest;

Var K: Integer;

Function Negative(X: Integer): Integer;

Begin

Negative := -X;

End;

Begin

For K := 1 to 10 do Writeln(Negative(K));

End.

Откройте окно с программой, затем Window│Output и далее

нажмите клавишу F8, строка выполнения перемещается на оператор

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

нажатие клавиши F8 выполняет Begin и перемещает строку выполне-

ния вниз на оператор For на следующей строке. После этого нажа-

тие F8 вызывает выполнение всего цикла For; на экран пользовате-

ля выводятся числа от -1 до -10, а строка выполнения перемещает-

ся к End.

Хотя функция Negative вызывается 10 раз, строка выполнения

никогда на нее не перемещается. Выполнение по шагам позволяет

отладчику не показывать детали любых вызовов для отдельной стро-

ки. Выполнение по шагам вызывает выполнение всего цикла For сра-

зу, поэтому невозможно видеть изменения в ходе выполнения цикла.

Если необходимо видеть подробности цикла, внесите в пример сле-

дующее простое изменение :

(измененный текст в окне N° 2 (файл example2.pas))

Begin

For K := 1 to 10 do

Writeln(Negative(K));

End.

Поскольку оператор Паскаля может занимать несколько строк,

такая программа будет в точности эквивалентна предыдущей версии,

и генерируемый код будет идентичен. Но поскольку оператор Wri-

teln теперь находится на отдельной строке, отладчик может ин-

терпретировать его отдельно. Если теперь нажимать клавишу F8, то

строка выполнения будет при выполнении цикла 10 раз возвращаться

на Writeln.

2.3.1.2. Трассировка программы

Трассировка программы во многом аналогична ее выполнению по

шагам. Единственное исключение состоит в том, что, когда встре-

чается оператор вызова процедуры или функции, при трассировке

эти процедуры и функции также выполняются по шагам, а при прос-

том выполнении по шагам управление возвращается вызывающему опе-

ратору после завершения выполнения подпрограммы.

Например, чтобы выполнить трассировку кода в example1.pas,

необходимо выбрать команду Run│Trace Into или нажать клавишу F7.

Когда вы в первый раз делаете это, управление перемещается на

оператор Begin основной программы. Повторное нажатие F7 снова

перемещает строку управления на оператор For. После этого нажа-

тие клавиши F7 трассирует вызов функции Negative - строка выпол-

нения перемещается на оператор Begin в блоке функции. Если вы

продолжаете нажимать F7, строка выполнения перемещается по функ-

ции, а затем, когда вы дойдете до оператора End, возвращается к

оператору вызова.

Формат программы влияет на поведение строки выполнения при

трассировке, хотя и не в такой степени как при пошаговом выпол-

нении. Если код сформатирован как в example1.pas,то трассировка

оператора For приводит к выполнению 10 раз функции Negative.Если

разбить оператор For на две строки, как в example2.pas,то трас-

сировка оператора End функции возвращает строку выполнения на ту

строку основной программы, которая будет выполняться следующей.

Первые девять раз это снова будет вызов функции. В десятый раз

строка выполнения перемещается на оператор End программы.

2.3.1.3 Выбор трассировки или

выполнения по шагам

Пошаговое выполнение или трассировка выполняет одно и то же

действие, кроме того случая, когда строка выполнения находится

под строкой вызова процедуры или функции, или когда выполняется

оператор Begin в начале программы или модуля, который использует

другие модули.

2.3.2. Выполнение больших фрагментов

Иногда, конечно, нежелательно выполнять по шагам всю прог-

рамму только для того, чтобы добраться до того места, где возни-

кает проблема. Отладчик позволяет выполнять сразу большой фраг-

мент программы до той точки, где необходимо начать выполнение по

шагам.

Чтобы задать в программе точку, до которой нужно ее выпол-

нить, а затем остановиться, используется команда Run│Go To Cur-

sor или клавиша F4. (Этим отладчику сообщается, что нет необхо-

димости выполнять программу по шагам, пока не будет достигнута

заданная точка.) Для этого курсор позиционируют на той строке,

где нужно возобновить управление отладкой, затем нажатие клавиши

F4 приводит в действие эту функцию отладчика. Заметим, что можно

это сделать как в начале сеанса отладки, так и когда уже выпол-

нена часть по шагам или протрассирована часть программы.

2.3.3. Поиск нужного места

IDE предусматривает два способа поиска в программе заданно-

го места. Простейший способ предоставляет команда Find Procedure

меню Search. Команда Find Procedure запрашивает у пользователя

имя процедуры или функции, затем находит соответствующую строку

в файле, где определяется эта подпрограмма. Этот подход полезно

использовать при редактировании, но его можно комбинировать с

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

пройти программу до той части кода, которую нужно отладить.

2.3.4. Возможности возврата

Иногда в ходе отладки полезно узнать, каким образом выпол-

нение программы попало в данную часть кода. Окно Call Stack

(Стек вызова) показывает последовательность вызовов процедур или

функций, которые привели к текущему состоянию (глубиной до 128

уровней). Для вывода окна Call Stack используется команда De-

bug│Call Stack.

Окно Call Stack особенно полезно использовать, если вы слу-

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

один шаг. В стеке вызовов вы можете найти тот вызов, который на-

чали трассировать по ошибке, затем выбрать команду Run│Go to

Cursor, чтобы выполнить за один шаг остальную часть вызова.

2.3.5. Повторное выполнение

В ходе сеанса отладки иногда желательно начать все сначала.

Выбор команды Run│Reset Program или нажатие клавиш Ctrl+F2 при-

ведет к полному сбросу, так что выполнение по шагам, или трасси-

ровка начнется в начале основной программы.

2.3.6. Отслеживание и модификация

При выполнении программы по шагам можно наблюдать ее вывод

несколькими способами. Первый состоит в переключении,в случае

необходимости,экранов. При втором способе используется второй

монитор. В-третьих, для вывода программы можно открыть окно в

IDE для DOS.

Кроме того, чтобы показать вывод программы, встроенный от-

ладчик позволяет просматривать значения переменных, выражений и

структур данных. С помощью команды Watch в меню Debug в окне

просмотра Watches можно добавлять или удалять отслеживаемые эле-

менты. В этом диалоговом окне можно проверять переменные и выра-

жения и изменять значения любых переменных, включая строки, ука-

затели, элементы массива и поля записей, что позволяет проверять

реакцию программы на различные условия.

2.3.6.1. Переключение экранов

В любой момент сеанса отладки можно выполнять переключение

экрана IDE и экрана пользователя. Для вывода экрана пользовате-

ля, используются клавиши Alt+F5. Чтобы вернуться в IDE, можно

нажать любую клавишу или щелкнуть "мышью".

При выполнении программы отладчик также может переключать

экраны автоматически. Управлять характером переключения экранов

можно с помощью параметров Display Swapping (Переключение экра-

на) диалогового окна Debugger (Options│Debugger). По умолчанию

задано эффективное переключение. Это означает, что экран пользо-

вателя выводится только в том случае, если выполняемый оператор

выводит информацию на экран или вызывает процедуру (даже если

эта процедура ничего на экран не выводит). После завершения вы-

вода экран переключается обратно в IDE.

Возможно, также, сообщить отладчику, что переключать экран

нужно на каждой строке, независимо от вывода, или не переключать

их вовсе. Переключение экранов для каждой строки полезно исполь-

зовать, если программа посылает информацию непосредственно на

экран, что может затереть содержимое экрана IDE.

2.3.6.2. Окно Output

IDE для DOS предусматривает для экрана пользователя окно,

которое называется окном вывода. Выбрав команду меню Debug│ Out-

put, можно открыть (вывести на переднем плане) активное окно,

содержащее вывод программы. Настроить размер этого окна можно

аналогично окну редактирования.

2.3.6.3. Использование двух мониторов

IDE предоставляет возможность использования для целей от-

ладки второго монитора. Этот монитор должен быть монохромным

дисплеем (поскольку использует память, отличную от цветного

дисплея), и запускать IDE нужно будет с параметром /D. В режиме

с двумя мониторами экран IDE выводится на монохромном экране,

вывод программы - на цветном экране, а переключение экранов не

выполняется.

2.3.7. Просмотр значений выражений

Выполнение программы по шагам или ее трассировка могут по-

мочь найти ошибки в алгоритме программы, но обычно желательно

также знать, что происходит на каждом шаге со значениями отдель-

ных переменных. Например, при выполнении по шагам цикла For по-

лезно знать значение переменной цикла. IDE имеет два инструмен-

тальных средства для проверки содержимого переменных программы:

окно Watches (Просмотр) и диалоговое окно Evaluate and Modify

(Вычисление и модификация).

2.3.7.1. Определение выражения отладчика

Оба средства вычислений и просмотра работают на уровне вы-

ражений, поэтому важно определить, что считается выражением.

Выражение состоит из констант, переменных и структур дан-

ных, скомбинированных с помощью операций и большинства встроен-

ных функций. Почти все, что можно использовать в правой части

оператора присваивания, может также использоваться в качестве

отладочного выражения. Точные спецификации показаны в Таблице 1.

Элементы выражений отладчика

Таблица 1

┌──────────────────────────┬────────────────────────────────────┐

│ Элемент выражения │ Допустимые значения │

├──────────────────────────┼────────────────────────────────────┤

│ Константы │ Все допустимые типы: Boolean, Byte,│

│ │ Char, перечисляемый тип, Integer,│

│ │ Longint, Real, Shortint, Word и│

│ │ строковый тип. │

├──────────────────────────┼────────────────────────────────────┤

│ Переменные │ Все типы, включая типы, определен-│

│ │ ные пользователям. │

│ │ │

│ целочисленный тип │ Любое целочисленное выражение с пе-│

│ │ ременными границами диапазона. │

│ │ │

│ тип с плавающей точкой│ Любые выражения с плавающей точкой│

│ │ или целочисленные выражения; лишние│

│ │ значащие цифры отбрасываются. │

│ │ │

│ символьный тип │ Любое символьное выражение, включая│

│ │ печатаемые символы в одинарных ка-│

│ │ вычках, целочисленные выражения,│

│ │ тип которых приведен к типу Char, и│

│ │ константы ASCII (#xx). │

│ │ │

│ булевский тип │ True, False и все булевские выраже-│

│ (логический) │ ния. │

│ │ │

│ перечисляемый тип │ Любые совместимые перечисляемые кон│

│ │ станты или целочисленные выражения│

│ │ в рамках диапазона, тип которых│

│ │ приведен к совместимому перечисля-│

│ │ емому типу. │

│ │ │

│ указатель │ Любые совместимые указатели или вы-│

│ │ ражения с приведенными к ним типа-│

│ │ ми; функция Ptr с соответствующим│

│ │ параметрами. │

│ │ │

│ строковый тип │ Любая строковая константа (текст в│

│ │ одинарных кавычках); строковые пе-│

│ │ ременные; строковые выражения, сос-│

│ │ тоящие из конкатенированных строко-│

│ │ вых констант и переменных. │

│ │ │

│ множество │ Любая множественная константа; лю-│

│ │ бое выражение, совместимое с мно-│

│ │ жественным типа, в котором исполь-│

│ │ зуются операции +, - и *. │

├──────────────────────────┼────────────────────────────────────┤

│ Приведение типа │ Соблюдаются стандартные правила│

│ │ Паскаля. │

├──────────────────────────┼────────────────────────────────────┤

│ Операции │ Все операции Turbo Pascal. │

├──────────────────────────┼────────────────────────────────────┤

│ Встроенные функции │ Все функции, допустимые в выражени-│

│ │ ях-константах. │

├──────────────────────────┼────────────────────────────────────┤

│ Массивы │ Массивы Borland Pascal - Mem,MemL, │

│ │ MemW │

└──────────────────────────┴────────────────────────────────────┘

2.3.7.2. Просмотр значений выражений

Если необходимо отслеживать значение переменной или выраже-

ния при выполнении программы по шагам, то можно открыть окно

просмотра Watches, которое показывает переменные и их значения в

каждый конкретный момент.

Для открытия окна Watches, используется команда Win-

dow│Watch. IDE открывает активное окно Watches без активных за-

писей. Если выбрать переменную для просмотра, IDE автоматически

открывает окно Watches (если это еще не сделано).

2.3.7.3. Добавление просматриваемого выражения

Для добавления в окно Watches переменной, используется ко-

манда Debug│Watch│Add Watch или клавиши Ctrl+F7. Если окно Watc-

hes является активным окном, можно добавить выражение просмотра,

нажав клавишу Ins. Отладчик открывает диалоговое окно, запраши-

вающее тип просматриваемого выражения. По умолчанию выражением

считается слово в позиции курсора в текущем окне редактирования.

Просматриваемые выражения, которые отслеживались ранее, сохраня-

ются в списке протокола.

2.3.7.4. Отслеживание текущего

просматриваемого выражения

Последнее добавленное или модифицированное просматриваемое

выражение является текущим просматриваемым выражением, которое

указывается выводимым слева от него символом жирной левой точки.

Если окно Watches активно, можно также удалить текущее выраже-

ние, нажав клавишу Del или Ctrl+Y. Чтобы удалить все просматри-

ваемые выражения, используется команда Debug│Watch│Remove All

Watches.

2.3.7.5. Редактирование просматриваемых

выражений

Чтобы отредактировать просматриваемое выражение, нужно

дважды щелкнуть на этом выражении "мышью" или сделать это выра-

жение текущим, затем нажать клавишу Enter или выбрать команду

Debug│ Watch│Edit Watch. Отладчик открывает диалоговое окно,

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

ваемого выражения, которое позволяет вам отредактировать текущее

выражение. При выборе командной кнопки OK или нажатии клавиши

Enter отредактированное выражение заменяет оригинал.

2.3.7.6. Форматирование просматриваемых

выражений

Окно Watches позволяет несколькими способами форматировать

просматриваемые выражения, добавляя запятую и один или более

спецификаторов формата. Например, хотя целочисленные значения

выводятся обычно в десятичном виде, указав после него ,H, можно

задать вывод выражения в шестнадцатиричном формате. Допустимые

спецификаторы формата и их действие перечисляются в Таблице 2.

Спецификаторы формата в выражениях отладчика

Таблица 2

┌──────────────┬─────────────────────┬──────────────────────────┐

│ Символ │ Зона его влияния │ Функция │

├──────────────┼─────────────────────┼──────────────────────────┤

│ $, H или X │ целочисленные типы │ Шестнадцатиричный. Выво-│

│ │ │ дит целочисленные значе-│

│ │ │ ния в префиксом $, вклю-│

│ │ │ чая те, которые содержат-│

│ │ │ ся в структуре данных. │

├──────────────┼─────────────────────┼──────────────────────────┤

│ C │ Char, строковые │ Символьный. Выводит спе-│

│ │ типы │ циальные символы для ко-│

│ │ │ дов ASCII 0..31. По умол-│

│ │ │ чанию такие символы выво-│

│ │ │ дятся в виде значений /xx│

├──────────────┼─────────────────────┼──────────────────────────┤

│ D │ целочисленные │ Десятичный. Выводят цело-│

│ │ типы │ численные значения в де-│

│ │ │ сятичном виде (включая│

│ │ │ те, которые содержатся в│

│ │ │ структурах данных). │

├──────────────┼─────────────────────┼──────────────────────────┤

│ Fn │ с плавающей точкой │ С плавающей точкой. Выво-│

│ │ │ дит n значащих цифр, где│

│ │ │ n лежит в диапазоне 2..18│

│ │ │ (по умолчанию - 11). │

├──────────────┼─────────────────────┼──────────────────────────┤

│ nM │ все │ Дамп памяти. Выводит n│

│ │ │ байт памяти, начиная с│

│ │ │ адреса, указываемого вы-│

│ │ │ ражением. Если n не зада-│

│ │ │ но, то по умолчанию оно│

│ │ │ равно значению размера в│

│ │ │ байтах типа переменной. │

├──────────────┼─────────────────────┼──────────────────────────┤

│ P │ указатели │ Указатель. Выводит указа-│

│ │ │ тели по адресу сегм:смещ│

│ │ │ (на не Ptr(сегм:смещ),│

│ │ │ как это делается по умол-│

│ │ │ чанию. │

├──────────────┼─────────────────────┼──────────────────────────┤

│ R │ записи, объекты │ Запись. Выводит имена по-│

│ │ │ лей, например, (X:1;│

│ │ │ Y:10; Z:5) вместо (1, 10,│

│ │ │ 5). │

├──────────────┼─────────────────────┼──────────────────────────┤

│ S │ Char, строки │ Строки. Выводит символы│

│ │ │ ASCII 0..31 в виде #xx.│

│ │ │ Использует только для мо-│

│ │ │ дификации дампов памяти│

│ │ │ (см. выше nM). │

└──────────────┴─────────────────────┴──────────────────────────┘

2.3.8. Вычисление и модификация

Кроме добавления просматриваемых выражений при выполнении

программы, отладчик имеет средство, позволяющее в любой момент

вычислять выражения и изменять на этапе выполнения значения пе-

ременных (модифицировать его).

2.3.8.1. Вычисление значений выражений

Для вычисления выражения, используется команда Debug│Evalu-

ate/ Modify или клавиши Ctrl+F4. Отладчик выводит диалоговое ок-

но Evaluate and Modify (Вычисление и модификация). По умолчанию

слово в позиции курсора в текущем окне редактирования выводится

подсвеченным в поле Expression (Выражение). Можно отредактиро-

вать это выражение, набрать другое выражение или выбрать вычис-

ляемое ранее выражение из списка протокола.

При нажатии Enter или щелчке "мышью" на командной кнопке

Evaluate, текущее значение выражения в поле Expression показыва-

ется в поле Result.

Допустимые выражения для вычисления подчиняются тем же пра-

вилам, что и выражения для сравнения. Для вывода результатов вы-

числения выражения действуют спецификаторы формата, перечислен-

ные в Таблице 2.

2.3.8.2. Модификация переменных

Во время отладки с помощью диалогового окна Evaluate and

Modify можно изменить значение переменной (модифицировать ее).

Введите переменную в поле Expression, затем в поле New Value на-

берите новое значение.

При изменении значений переменных следует иметь в виду сле-

дующее:

* Можно изменять только отдельные переменные или элемен-

ты массивов или записей, но не сами массивы и записи.

* Выражения в поле New Value должны отвечать ограничениям

для выражений, перечисленных в Таблице 1.

* Выражение в поле New Value (Новое значение) должно в ре-

зультате вычисления давать результат, совместимый по прис-

ваиванию с переменной, которой мы хотим его присвоить.

Здесь можно руководствоваться следующим правилом: если

присваивание дает при компиляции ошибку, то оно не являет-

ся допустимым значением модификации.

2.3.9. Приостановка выполнения

Существует два способа сообщить IDE, что программу нужно

выполнить до определенной точки, а затем остановиться. Первый и

простейший способ состоит в том, чтобы найти позицию в програм-

ме, где нужно остановиться, затем выбрать в меню Run команду Go

to Cursor (Выполнение до позиции курсора). Программа выполняется

как обычно, пока не достигнет оператора(отмеченного курсо-

ром),где она и должна остановиться. В этой точке можно проверить

значения и продолжать выполнение непрерывно или по шагам.

Второй способ состоит в том, чтобы остановить программу в

определенной заданной точке. Эта точка называется точкой остано-

ва.

2.3.9.1 Использование точек останова

IDE позволяет устанавливать в программе для целей отладки

точки останова. Точка останова - это обозначенная в коде прог-

раммы позиция, в которой нужно прекратить выполнение программы и

вернуть выполнение отладчику. В этом смысле точка останова рабо-

тает аналогично команде Go to Cursor, при которой программа вы-

полняется обычным путем до достижения определенной точки. Основ-

ное различие состоит в том, что можно задать несколько точек ос-

танова и точки останова, которые будут срабатывать не при каждом

их достижении.

2.3.9.2. Задание точек останова

Чтобы установить в коде точку останова, поместите курсор на

той строке, где нужно остановиться. Строка должна содержать вы-

полняемый код и не может быть комментарием, описанием или пустой

строкой. Выбор команды Debug│Toggle Breakpoint или нажатие кла-

виш Ctrl+F8 устанавливает на строке точку останова, которая

обозначается подсветкой всей строки.

Теперь при выполнении программы из IDE она будет останавли-

ваться при достижении данной строки, но перед ее выполнением.

Строка, содержащая точку останова, выводится при этом в окне ре-

дактирования как строка выполнения. В этот момент можно выпол-

нить любые другие действия по отладке (выполнение программы по

шагам, трассировку, просмотр и вычисление).

2.3.9.3. Отмена точек останова

Для отмены точки останова, поместите курсор на содержащую

ее строку и выберите команду Debug│Toggle Breakpoint или нажмите

клавиши Ctrl+F8.

2.3.9.4. Модификация точек останова

В процессе сеанса отладки IDE отслеживает все точки остано-

ва. Вместо того, чтобы шарить по исходному коду в поиске точек

останова, она обслуживает точки останова в одном диалоговом окне

Breakpoints. Для вывода диалогового окна Breakpoints выберите

команду Debug│Breakpoints. В этом диалоговом окне можно устанав-

ливать, удалять, редактировать и просматривать точки останова.

Командные кнопки диалогового окна Breakpoints работают сле-

дующим образом:

* Чтобы добавить новую точку останова, подсветите пустую

строку в списке и выберите командную кнопку Edit.

* Чтобы отменить точку останова, подсветите ее и выберите

кнопку Clear.

* Чтобы модифицировать существующую точку останова, подсве-

тите ее и выберите командную кнопку Edit.

* Чтобы найти в исходном коде точку останова, подсветите ее

и выберите кнопку View.

* Чтобы удалить все точки останова, выберите командную кноп-

ку Clear All.

2.3.9.5. Создание условных точек останова

Точки останова, добавленные командой Toggle Breakpoint, яв-

ляются безусловными: когда выполнение попадает на такую строку,

отладчик в любом случае останавливает программу. При редактиро-

вании новой или существующей точки останова есть две дополни-

тельные возможности - с помощью параметров диалогового окна Edit

можно создать условные точки останова. В этих точках останова

можно задать два вида условий: счетчик проходов и логические ус-

ловия.

2.3.9.6. Подсчет числа проходов

Задание для точки останова счетчика проходов сообщает от-

ладчику, что останавливать программу нужно не при каждом дости-

жении точки останова, а только на n-ый раз. То есть, если счет-

чик проходов равен 3, то отладчик останавливает программу только

при третьем достижении данной точки останова.

2.3.9.7. Проверка условий

В качестве условия для точки останова можно также задать

выражение типа Boolean. Например, можно проверить, попадает ли

переменная в заданный диапазон, или установлен ли некоторый

флаг. В таких условиях для точек останова можно задавать любые

булевские выражения, подчиняющиеся правилам Таблицы 1.

2.3.9.8. Прерывание программы без точек останова

Даже если не установлено точек останова, то все равно есть

возможность выйти в отладчик при выполнении программы из IDE. В

любой момент работы программы нажатие клавиш Ctrl+Break приведет

к прекращению выполнения программы. Отладчик находит позицию в

исходном коде, где была прервана программа. Как и в случае обыч-

ной точки останова можно затем выполнить программу по шагам,

трассировать ее, отследить или вычислить выражения.

II. Задание к лабораторной работе

1. Постановка задачи

Задача : отладить заданную программу, то есть найти причины

некорректной работы программы (или же ее неработоспособности) и

устранить их, по мере возможности - все.

1.1. Вопросы выполнения задания

Обратите внимание не только на компилируемость и возмож-

ность запуска программы, но и на ее функциональность и результа-

тивность, то есть - на возможность получения от нее результатов

решения поставленой задачи, а не задачи, которую, она "хочет"

решать.

Программа должна решать следующую задачу : поиск равных

элементов в двух введенных пользователем векторах и создание из

них результирующего вектора; максимальный размер вектора задает-

ся константой в начале программы.За исключением некоторых ошибок

и неточностей программа предназначена для решения поставленной

задачи. Ваша задача - исправить программу так, чтобы она соот-

ветствовала понятию верноработающей, гибкой программы.

Исходный текст отлаживаемой программы приведен в окне N°3

или в файле "example3.pas".

1.2. Содержание отчета

Отчет должен содержать помимо обычного оформления :

* список найденых ошибок с их классификацией;

* описание всех примененных методов (в практической форме,

т.е. не так как описано в теоретической справке, а так,

как они были вами применены) и их результативность;

* анализ выявленых ошибок;

* принятые меры к приведению программы в должный вид.

III. Контрольные вопросы

Контрольные вопросы приведены для самоконтроля студента

после ознакомления с теоретической справкой, что должно послу-

жить лучшему усвоению материала.

1. В чем состоит сущность процесса компиляции программы с любого

языка программирования, для чего нужна компиляция?

2. Какие средства компиляции предоставляет IDE ?

3. В чем состоит различие между командами компиляции Make и Build?

4. Каков смысл выбора места назначения компиляции и какие различия

и преимущества у каждого из них ?

5. Что такое отладка, цели отладки, каков должен быть результат

отладки (идеальный/реальный) ?

6. Какие существуют виды ошибок ?

7. Опишите каждый вид ошибок в отдельности : скажите, что явля-

ется причиной появления ошибок каждого вида, как можно избежать

их появления ?

8. Что означает "явность" ошибки, какие сложности возникают в

связи со степенью явности ?

9. Приведите краткий список методов отладки.

10. Опишите кратко каждый из методов.

11. Укажите различие между трассировкой программы и выполнением ее

по шагам. Каковы преимущества каждого метода и недостатки ?

12. Какими способами можно проследить в ходе отладки за результа-

тами работы программы ?

13. Что такое шаг ?

14. Как можно отследить изменение значений переменных и выражений ?

15. Что такое выражение ?

16. Для чего существуют точки останова ?

17. Как можно задать , модифицировать или отменить точку останова ?

18. Что такое условная точка останова , для чего предназначена ?

19. Для обнаружения какого рода ошибок, по вашему мнению, использу-

ются точки останова в процессе отладки ?

20. Как можно прервать выполнение программы ?

IV. Литература

1. Епанешников А., Епанешников В. Программирование в среде

Turbo Pascal 7.0. - М.: Диалог-МИФИ, 1993.

2. Марченко А.И., Марченко Л.А. Программирование в среде Turbo

Pascal 7.0. - М.: Бином Универсал, Киев.: ЮНИОР, 1997.

3. Borland Pascal with Objects. Version 7.0. User's Guide.

Borland International INC, 1992.

ПРИЛОЖЕНИЕ 1

Клавиши быстрого управления среды TURBO PASCAL 7.0

F1 Вызвать контекстную помощь

F2 File|Save Сохранить на диске редактируемый файл

F3 File|Open Открыть файл для редактирования

F4 Run|Go to Cursor Выполнить программу до строки,

в которой находится курсор

F5 Winodow|Zoom Расширить окно до полного экрана

(вернуть исходный размер окна)

F6 Window|Next Активизировать следующее окно

F7 Run|Trace into Трассировка с заходом в подпрограммы

F8 Run|Step over Трассировка без захода в подпрограммы

F9 Compile|Make Скомпилировать программу,начиная с

основного файла

F10 Перейти к системе меню

ALT+F1 Help|Previous topic Вывести предыдущее окно подсказки

ALT+F3 Window|Close Закрыть окно

ALT+F5 Debug|User Screen Открыть окно пользователя

ALT+F7 Tools|Go to previous Перейти к предыдущей строке окна сообщений

ALT+F8 Tools|Go to next Перейти к следующей строке окна сообщений

ALT+F9 Compile|Compile Скомпилировать программу из

окна редактирования

ALT+F10 Вызвать локальное меню

ALT+BKSP Edit|Undo Отменить изменения в текущей строке

ALT+C | | Compile

ALT+D | | Debug

ALT+E | | Edit

ALT+F | | File

ALT+H |== ВЫЗВАТЬ == | Help

ALT+O |== МЕНЮ == | Options

ALT+R | | Run

ALT+S | | Search

ALT+T | | Tools

ALT+W | | Window

ALT+X File|Exit Выход из среды в операционную систему

ALT+0 Window|List Показать список открытых окон

CTRL+F1 Help|Topic search Осуществить предметный поиск

CTRL+F2 Run|Program reset Прекратить отладку программы

CTRL+F3 Debug|Call stack Вызвать окно используемых подпрограмм

CTRL+F4 Debug|Evaluate/Modify Вычислить/модифицировать выражение

CTRL+F5 Window|Size/Move Изменить размер окна/переместить окно

CTRL+F7 Debug|Add watches Добавить контролируемый параметр

CTRL+F8 Задать(снять) точку останова)

CTRL+F9 Run|Run Запустить программу на выполнение

CTRL+DEL Edit|Clear Удалить выделенный блок

CTRL+INS Edit|Copy Скопировать выделенный блок в окно

переносимой информации

SHIFT+F1 Help|Index Вывести словарь контекстной помощи

SHIFT+F6 Window|Previous Активизировать предыдущее окно

ESC Выход из меню,информационного окна

...........................ПРИЛОЖЕНИЕ 2

Сообщения об ошибках компиляции.

────────────────────────────────────────────────────────────────────

Приведенные ниже списки возможных сообщений об ошибках можно

получить от компилятора при разработке программы. Когда это

возможно, компилятор будет выводить на дисплей дополнительную

диагностическую информацию в виде имени идентификатора или файла, например :

Error 15 : File not found (Window.TPU)

(Ошибка 15 : Файл не найден)

Когда ошибка обнаружена,TP 7.0 автоматически загружает исходный

файл и помещает курсор в позицию ошибки.

Примечание : приведенный список не исчерпывающий, более подробную

информацию можно получить (на английском языке) в Help│Error messages...

┌───────────────────┐

│ 1. Out of memory │

└───────────────────┘

(не хватает памяти)

Эта ошибка происходит, когда компилятору не хватает памяти.

┌─────────────────────────┐

│ 2. Identifier expected │

└─────────────────────────┘

(ожидается идентификатор)

┌─────────────────────────┐

│ 3. Unknown identifier │

└─────────────────────────┘

(неизвестный идентификатор)

Этот идентификатор не объявлен или невидим внутри текущей

сферы действия.

┌──────────────────────────┐

│ 4. Duplicate identifier │

└──────────────────────────┘

(дублируемый идентификатор)

Этот идентификатор уже был использован в текущем блоке в ином смысле.

┌──────────────────────┐

│ 5. Syntax error │

└──────────────────────┘

(синтаксическая ошибка)

┌───────────────────────────────┐

│ 6. Error in real constant │

└───────────────────────────────┘

(ошибка в константе вещественного типа)

┌────────────────────────────────┐

│ 7. Error in integer constant │

└────────────────────────────────┘

(ошибка в константе целого типа)

┌─────────────────────────────────┐

│ 8. String constant exceeds line│

└─────────────────────────────────┘

(строковая константа выходит за пределы строки)

┌───────────────────────────────┐

│ 10. Unexpected end of file │

└───────────────────────────────┘

(неожиданный конец файла)

- исходный файл заканчивается перед последним end главной

операторной части. Наиболее вероятно, что количество операторов

begin и end несбалансировано.

- не закрыт комментарий.

┌──────────────────────┐

│ 11. Line too long │

└──────────────────────┘

(строка слишком длинная)

Максимальная длина строки равна 126 символам.

┌─────────────────────────────────┐

│ 12. Type identifier expected │

└─────────────────────────────────┘

(ожидается тип идентификатора)

Этот идентификатор не обозначает тип, как это должно быть.

┌─────────────────────────────┐

│ 13. Too many open files │

└─────────────────────────────┘

(слишком много открытых файлов)

Если произошла эта ошибка, то или в файле CONFIG.SYS нет

записи FILES = xx, или эта запись задает слишком мало файлов.

Увеличьте это значение до некоторого подходящего значения, например до 20.

┌──────────────────────────┐

│ 14. Invalid file name │

└──────────────────────────┘

(неправильное имя файла)

Неправильное имя файла или задается несуществующий путь доступа.

┌─────────────────────────┐

│ 15. File not found │

└─────────────────────────┘

(файл не найден)

┌────────────────────────┐

│ 16. Disk full │

└────────────────────────┘

(диск полон)

┌────────────────────────┐

│ 18. Too many files │

└────────────────────────┘

(слишком много файлов)

┌──────────────────────────────────────┐

│ 20. Variable identifier expected │

└──────────────────────────────────────┘

(ожидается идентификатор переменной)

┌─────────────────────┐

│ 21. Error in type │

└─────────────────────┘

(ошибка в типе)

Этот символ не может начинать определение типа.

┌───────────────────────────┐

│ 22. Structure too large │

└───────────────────────────┘

(структура слишком большая)

Максимальный допустимый размер структурного типа равен 65520 байтам.

┌─────────────────────────────────────┐

│ 23. Set base type out of range │

└─────────────────────────────────────┘

(базовый тип множества выходит за допустимый диапазон)

┌──────────────────────────────────────────────────────┐

│ 24. File components may not be files or objects │

└──────────────────────────────────────────────────────┘

(компонентами файла не могут быть файлы или объекты)

В качестве файловых компонент не могут быть файлы или объекты,

а так же ни один из структурных типов, которые включают тип объекта или файла.

┌─────────────────────────────┐

│ 25. Invalid string length │

└─────────────────────────────┘

(неправильная длина строки)

Объявленная максимальная длина строки должна быть в диапазоне 1..255

┌───────────────────────┐

│ 26. Type mismatch │

└───────────────────────┘

(несоответствие типов)

Это может быть по следующим причинам:

- несовместимые типы переменной и выражения в операторе присваивания

- несовместимые типы фактического и формального параметра в

вызове процедуры или функции

- тип выражения, который несовместим с типом индекса в

индексации массива

- несовместимые типы операндов в выражении.

┌──────────────────────────────────────────────────┐

│ 28. Lower bound greater than upper bound │

└──────────────────────────────────────────────────┘

(нижняя граница больше верхней границы)

В объявлении поддиапазонного типа нижняя граница указана

больше верхней границы.

┌────────────────────────────────┐

│ 29. Orginal type expected │

└────────────────────────────────┘

(ожидается порядковый тип)

В данном случае вещественный, строковый, структурный тип и тип

указателя недопустим.

┌────────────────────────────────────┐

│ 30. Integer constant expected │

└────────────────────────────────────┘

(ожидается целая константа)

┌────────────────────────────────────┐

│ 31. Constant expected │

└────────────────────────────────────┘

(ожидается константа)

┌──────────────────────────────────────────┐

│ 32. Integer or real constant expected │

└──────────────────────────────────────────┘

(ожидается целая или вещественная константа)

┌──────────────────────────────────────┐

│ 34. Invalid function result type │

└──────────────────────────────────────┘

(неправильный тип результата функции)

Правильными типами результатов функций являются все простые

типы, строковые типы и типы указателей.

┌────────────────────────────────────┐

│ 35. Label identifier expected │

└────────────────────────────────────┘

(ожидается идентификатор метки)

┌────────────────────────────────────┐

│ 36. Begin expected │

└────────────────────────────────────┘

(ожидается оператор begin)

┌────────────────────────────────┐

│ 37. End expected │

└────────────────────────────────┘

(ожидается оператор end)

┌───────────────────────────────────┐

│ 38. Integer expession expected │

└───────────────────────────────────┘

(ожидается целое выражение)

┌─────────────────────────────────────┐

│ 39. Ordinal expession expected │

└─────────────────────────────────────┘

(ожидается выражение порядкового типа)

┌───────────────────────────────────────┐

│ 40. Boolean expression expected │

└───────────────────────────────────────┘

(ожидается выражение булевского типа)

┌────────────────────────────────────────────┐

│ 41. Operand types do not match operator │

└────────────────────────────────────────────┘

(типы операндов не соответствуют оператору)

┌───────────────────────────────┐

│ 42. Error in expression │

└───────────────────────────────┘

(ошибка в выражении)

┌────────────────────────────────┐

│ 43. Illegal assignment │

└────────────────────────────────┘

(неправильное присваивание)

┌─────────────────────┐

│ 50. Do expеcted │

└─────────────────────┘

(ожидается ключевое слово do)

┌───────────────────┐

│ 54. OF expected │

└───────────────────┘

(ожидается ключевое слово OF)

┌────────────────────┐

│ 57. THEN expected │

└────────────────────┘

(ожидается ключевое слово then)

┌───────────────────────────────┐

│ 58. TO or DOWNTO expected │

└───────────────────────────────┘

(ожидается ключевое слово to или downto)

┌────────────────────────┐

│ 62. Division by zero │

└────────────────────────┘

(деление на ноль)

┌────────────────────────┐

│ 63. Invalid file type│

└────────────────────────┘

(неправильный тип файла)

Этот тип файла не поддерживается процедурой обработки файлов,

например, readln c типированным файлом или Seek c текстовым файлом.

┌───────────────────────────────────────────────┐

│ 64. Cannot Read or Write variables of type │

└───────────────────────────────────────────────┘

(нельзя читать или писать переменные этого типа)

- Read или Readln могут вводить значения типа Char,

Integer, Real, и String.

- Write или Writeln могут выводить значения типа

Char, Integer, Real, String и Boolean.

┌────────────────────────────────┐

│ 66. String variable expected │

└────────────────────────────────┘

(ожидается строковая переменная)

┌────────────────────────────────────┐

│ 67. String expession expected │

└────────────────────────────────────┘

(ожидается выражение строкового типа)

┌──────────────────────────────────┬──────────────┐

│ 74. Constant and case types do not match │

└─────────────────────────────────────────────────┘

(константа и тип переключателя в операторе case не соответствуют друг другу)

┌───────────────────────────────────┐

│ 76. Constant out of range │

└───────────────────────────────────┘

(константа выходит за допустимый диапазон)

┌──────────────────────────────────┐

│ 77. File variable expected │

└──────────────────────────────────┘

(ожидается переменная типа file)

┌───────────────────────────────────────────┐

│ 79. Integer or real expression expected │

└───────────────────────────────────────────┘

(ожидается выражение типа integer или real).

┌─────────────────────────────┐

│ 81. Label already defined │

└─────────────────────────────┘

(метка уже определена)

┌─────────────────────┐

│ 84. UNIT expected │

└─────────────────────┘

(ожидается ключевое слово UNIT)

┌───────────────────────┐

│ 85. ";" expected │

└───────────────────────┘

(ожидается ; )

┌──────────────────────┐

│ 86. ":" expected │

└──────────────────────┘

(ожидается : )

┌────────────────────────┐

│ 87. "," expected │

└────────────────────────┘

(ожидается , )

┌─────────────────────────┐

│ 88. "(" expected │

└─────────────────────────┘

(ожидается ( )

┌────────────────────────┐

│ 89. ")" expected │

└────────────────────────┘

(ожидается ) )

┌───────────────────────┐

│ 90. "=" expected │

└───────────────────────┘

(ожидается = )

┌────────────────────────┐

│ 91. ":=" expected │

└────────────────────────┘

(ожидается := )

┌──────────────────────────────┐

│ 92. "[" or "(." expected │

└──────────────────────────────┘

(ожидается [ или (. )

┌──────────────────────────────┐

│ 93. "]" or ".)" expected │

└──────────────────────────────┘

(ожидается ] или .) )

┌─────────────────────────┐

│ 94. "." expected │

└─────────────────────────┘

(ожидается . )

┌─────────────────────┐

│ 95. ".." expected │

└─────────────────────┘

(ожидается .. )

┌──────────────────────────┐

│ 96. Too many variables │

└──────────────────────────┘

(слишком много переменных)

- Общий размер глобальных переменных, объявленных внутри

программы или модуля, не может превышать 64К.

- Общий размер локальных переменных, объявленных внутри

процедуры или функции, не может превышать 64К.

┌────────────────────────────────────────┐

│ 97. Invalid FOR control variable │

└────────────────────────────────────────┘

(неправильная управляющая переменная в операторе for)

┌─────────────────────────────────────┐

│ 98. Integer variable expected │

└─────────────────────────────────────┘

(ожидается переменная целого типа)

┌────────────────────────────────────────────────────┐

│ 99. File and procedure types are not allowed here │

└────────────────────────────────────────────────────┘

(файловый и процедурный тип недопустимы здесь)

┌─────────────────────────────────┐

│ 100. String length mismatch │

└─────────────────────────────────┘

(длина строки не соответствует)

┌───────────────────────────────────────┐

│ 102. String constant expected │

└───────────────────────────────────────┘

(ожидается константа типа string)

┌───────────────────────────────────────────┐

│ 103. Integer or real variable expected │

└───────────────────────────────────────────┘

(ожидается переменная типа Integer или Real)

┌──────────────────────────────────────────┐

│ 106. Character expession expected │

└──────────────────────────────────────────┘

(ожидается выражение символьного типа)

┌─────────────────────────────────────────┐

│ 112. Case constant out of range │

└─────────────────────────────────────────┘

(константа оператора case выходит за допустимый диапазон)

Для операторов case целого типа константы должны быть внутри

диапазона -32768...32767.

┌─────────────────────────────┐

│ 113. Error in statement │

└─────────────────────────────┘

(ошибка в операторе)

С этого символа не может начинаться оператор.

┌─────────────────────────────┐

│ 132. Critical dick error │

└─────────────────────────────┘

(критическая ошибка диска)

┌──────────────────────────────────────────┐

│ 133. Cannot evaluate this expression│

└──────────────────────────────────────────┘

(нельзя вычислить это выражение)

┌──────────────────────────────────────────┐

│ 134. Expession incorrectly terminated │

└──────────────────────────────────────────┘

(выражение завершается неправильно)

┌────────────────────────────────────────┐

│ 135. Invalid format specifier │

└────────────────────────────────────────┘

(неправильный спецификатор формата )

┌─────────────────────────────────────────────┐

│ 138. Cannot evaluate without System unit │

└─────────────────────────────────────────────┘

(Нельзя вычислить без модуля System)

Библиотека TURBO.TPL должна содержать модуль System для

того, чтобы отладчик мог вычислить выражение.

┌─────────────────────────────────────────────┐

│ 140.Invalid floating-point operation │

└─────────────────────────────────────────────┘

(Неправильная операция с плавающей точкой)

┌────────────────────────────────────────────────────┐

│ 143. Invalid procedure or function reference │

└────────────────────────────────────────────────────┘

(неправильная ссылка на процедуру или функцию)

╔════════════════╗

║ Кафедра АТМ. ║

║ 1997г. ║

╚════════════════╝

.............................EXAMPLE 1

ProgramStepTest;

Function Negative(X: Integer): Integer;

Begin

Negative := -X;

End;

Var K: Integer;

Begin

For K := 1 to 10 do Writeln(Negative(K));

End.

.............................EXAMPLE 2

Program StepTest;

Function Negative(X: Integer): Integer;

Begin

Negative := -X;

End;

Var K: Integer;

Begin

For K := 1 to 10 do

Writeln(Negative(K));

End.

.............................EXAMPLE 3

Programm Array;

USES CRT,MY_DLL;

CONST N=-5;

TYPE VECTOR=ARRAY[1..N] OF INTEGER;

VAR A,B,COM:VECTOR;

USEFUL:INTEGER

CONTINUE:BOOLEAN;

Eq:INTEGER;

PROCEDURE INPVECTOR(USED:INTEGER;VAR K:VECTOR);

VAR F:INTEGER;

BEGIN

CLRSCR;

WRITELN('ВВОДИМ ВЕКТОР - ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ ',USED,' ЭЛЕМЕНТОВ ');

FOR F:=1 DOWNTO USED DO

BEGIN

WRITELN('ВВЕДИТЕ ',F,'-Й ЭЛЕМЕНТ ');

READLN(K[F]);

END;

END;

PROCEDURE INP(MAX:INTEGER;VAR VECTOR_A,VECTOR_B:VECTOR;VAR USED:INTEGER;

VAR LOG:BOOLEAN);

VAR CH:CHAR;

BEGIN

REPEAT

WRITELN('ВВЕДИТЕ РАЗМЕРНОСТЬ СРАВНИВАЕМЫХ ВЕКТОРОВ ');

READLN(USED);

LOG:=NOT((USED<1) OR (USED>MAX));

IFNOTLOGTHEN

BEGIN

WRITELN('вы ввели недопустимую размерность вектора.. ');

writeln('вы хотите отказаться от ввода [введите "Y"] ');

writeln('или повторить ввод [введите "N"] ');

READLN(CH);

LOG:=NOT((CH='Y') OR (CH='y'));

END

UNTIL LOG;

END;

PROCEDURE COMP(USED:INTEGER;VECTOR_A,VECTOR_B:VECTOR;VAR VECTOR_C:VECTOR;

VAR EQ:INTEGER);

VAR F,G:INTEGER;

BEGIN

EQ:=0;

FOR F:=1 TO USED DO

FOR G:=1 TO USED DO

IF VECTOR_A[F]=VECTOR_B[G] THEN

BEGIN

EQ:=EQ+1;

VECTOR_C[EQ]:=VECTOR_B[G];

END;

PROCEDURE DISPLAY(USED:INTEGER;VECTOR_C:VECTOR);

VAR F:INTEGER;

BEGIN

writeln('ВЕКТОР СОВПАВШИХ ЭЛЕМЕНТОВ ВЕКТОРОВ:');

writeln;

FOR F:=1 TO USED DO

BEGIN

WRITE(VECTOR_C[F],' ');

END;

END;

{--------------------------------------------------}

BEGIN {MAIN}

TEXTCOLOR(14);

TEXTBACKGROUND(13);

CLRSCR;

WRITELN('ПРГРАММА НАХОДИТ СОВПАДАЮЩИЕ ЭЛЕМЕНТЫ В 2х ВВОДИМЫХ ВЕКТОРАХ');

iNP(N,A,B,USEFUL,CONTINUE);

IF CONTINUE THEN

BEGIN

INPVECTOR(A,USEFUL);

INPVECTOR(USEFUL,B);

CLRSCR;

COMP(USEFUL,A,B,COM,EQ);

IF EQ>=1 THEN

DISPLAY(EQ,COM,A);

ELSE

WRITELN('СОВПАДАЮЩИХ ЭЛЕМЕНТОВ НЕ ОБНАРУЖЕНО');

END;

ELSE

WRITELN('РАБОТА ПРОГРАММЫ ПРЕРВАНА...');

END

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]