5403-1 (662849), страница 3
Текст из файла (страница 3)
Вы можете осуществлять пошаговое выполнение программы, используя команду Run / Trace Into, Step Over или Go to Cursor (F7, F8 или F4). Вы можете проверить или изменить значения переменных.
Вы можете добавить или удалить выражения из окна Watch.
Можно назначить или удалить точки прерывания.
Можно просмотреть выходные результаты программы, используя команду Windows/User Screen (Alt-F5).
Вы можете перезапустить программу сначала ( Run/Program Reset и, затем, команду пошагового выполнения).
Можно продолжить выполнение до следующей точки прерывания (или до конца программы), выполнив команду Run/Run (Ctrl-F9).
Для удаления точки прерывания из строки переместите курсор на данную строку и, выполнив команду Debug/Toggle Breakpoint (или нажмите Ctrl-F8) еще раз. Эта команда включает или отключает точку прерывания в строке; если она используется для строки с точкой прерывания, то строка становится нормальной.
Давайте вернемся к примеру, который был рассмотрен ранее.
begin {основная часть программы Test.Sort}
Randomize;
Count := NLMax;
for I := 1 to Count do
List [I] := Random (1000);
Sort ( List,Count );
for I := 1 to Count do
Write ( List [I] : 8 );
Readln
end. {программа Test.Sort}
Как уже говорилось, идея была в том, чтобы обойти первоначальный цикл и начать трассировку с вызова процедуры Sort. Новый вариант. Передвиньте курсор на строку с вызовом процедуры и выполните команду Debug/Toggle Breakpoint ( Ctrl-F8), которая отметит строку, как точку прерывания. Теперь выполните программу до этой точки, используя команду Run/Run (Ctrl-F9 ). Когда программа достигнет этой строки, она остановится и позволит Вам начать отладку.
Использование Ctrl-Break.
Кроме назначения точек прерывания, пользователь может сделать немедленную остановку во время выполнения программы, используя клавишу Ctrl-Break. Это означает, что можно прервать работу программы в любое время. Когда Вы нажимаете на клавишу Ctrl-Break, выполнение программы прекращается. Вы возвращаетесь в редактор, курсор выполнения расположен на следующей строке программы, и программа готова к дальнейшему пошаговому выполнению.
Фактически, отладчик автоматически подключает DOS, BIOS и другие сервисные функции. Он знает, является ли текущий выполняющийся код программой DOS, программой BIOS или программой пользователя. Когда Вы нажимаете на клавишу Ctrl-Break, отладчик ждет, пока программа выполняется сама. Затем он делает пошаговое выполнение инструкций машинного уровня, пока следующая инструкция не будет в начале строки исходного кода на Паскале. С этого момента отладчик прекращает работу, перемещает курсор выполнения на эту строку и предлагает Вам нажать на клавишу ESC.
Примечание: Если пользователь нажимает на клавишу Ctrl-Break второй раз еще до того, как отладчик находит и отображает следующую строку исходного кода для выполнения, то отладчик завершает работу и не пытается найти строку исходного кода. В этом случае, процедуры выхода не выполняются, что означает, что файлы, видеорежим и распределение памяти DOS могут быть не полностью очищены.
Просмотр значений.
Выполнение программы предоставляет много информации, но не в том объеме, как хотелось бы. Может возникнуть необходимость просмотреть за тем, как изменяются значения переменных во время выполнения программы. Рассмотрим процедуру Sort из предыдущей программы:
procedure Sort ( var L : NumList; C : word );
var
Top,Min,k : word;
Temp : integer;
begin
for Top := 1 to C-1 do
begin
Min := Top;
for k := Top+1 to C do
if L[k] Top then
begin
Temp := L[Top];
Top := L[Min];
L[Min] := Temp;
end;
end;
end; {процедуры Sort}
Примечание: Измените NLMax в теле программы на 10 так, чтобы Вы могли работать с меньшим массивом.
В этой процедуре есть ошибки, будем просматривать ее (используя команду Run/Trace Into или клавишу F7) и наблюдать за значениями переменных L, Top, Min и k.
Отладчик дает возможность пользователю задать объекты для просмотра во время выполнения Вашей программы. Как Вы и предполагаете, объектами просмотра являются переменные, структуры данных и выражения, расположенные в окне Watch, где отображаются их текущие значения, обновляемые по мере выполнения каждой строки программы. Давайте вернемся к предыдущему примеру. Установить объекты наблюдения просто.
Передвигайте курсор к каждому идентификатору и выполняйте команду Debug/Watch/Add Watch (Ctrl -F7) для добавления каждого выражения в окно Watch.
Результат может выглядеть так:
k : 21341
Min : 51
Top :21383
L : (163,143,454,622,476,161,850,402,375,34)
Предполагается, что Вы только что вошли в процедуру Sort, курсор выполнения расположен на начальном операторе begin. (Если Вы еще не вошли в процедуру Sort, то для каждого выражения в окне Watch будет появляться сообщение "unknown identifier" (неизвестный идентификатор), пока Вы не войдете в процедуру). Заметим, что переменные K, Min и Top имеют произвольные значения, т.к. они еще не были инициализированы. Значения переменной L, предположительно, тоже должно быть произвольным; они не будут таковыми при выполнении всей программы; все они должны быть неотрицательными и лежать в интервале от 0 до 999.
Если нажать на клавишу F7 четыре раза, то мы продвинемся к строке if L[k]Top then, назад к вершине внешнего цикла, и снова вниз к строке if L[k] < L[Min] then. В этот момент окно Watch будет выглядеть следующим образом (для L даны предыдущие значения):
k : 3
Min : 2
Top : 2
L : ( 34,143,454,622,476,161,850,402,375,34 )
Теперь Вы можете заметить две вещи. Первое, последнее значение переменной L(34), которое является также и наименьшим значением, скопировалось в первое значение L, и значение, которое уже было там раньше (163), исчезло. Второе, переменные Min и Top имели одинаковые значения во время трассировки процедуры. Фактически, Вы можете заметить, что переменная Min получает значение переменной Top, но она никогда не изменяется где-либо еще. Однако, ниже цикла располагается проверка:
if Min<>Top then.
Или эта проверка ошибочна, или существует какое-то несоответствие между этими двумя частями процедуры. Оказывается, ошибочна пятая строка программы. Она должна выглядеть так:
Min := k, вместо L[Min] := L[k].
Исправьте строку, переместите курсор к первоначальному оператору begin в процедуре Sort и выполните команду Run/Go to Cursor (F4). Так как Вы изменили программу, на экране появится окно с вопросом Source modified, rebild? (Y/N) (исходный модуль модифицирован, нужна ли сборка? Да/Нет). Ответьте Y. Программа будет перекомпилироваться, начнется ее выполнение, затем произойдет остановка на начальном операторе begin процедуры Sort. Теперь программа работает верно. Значение первого элемента теперь не меняется на наименьшее из значений элементов массива L, происходит обмен-перемещение значения первого элемента массива на место, где до этого располагался элемент с наименьшим значением. Затем процесс повторяется со второй позицией, третьей и т.д., пока список элементов не будет отсортирован полностью.
Список литературы
Для подготовки данной работы были использованы материалы с сайта http://bestcode.org/