Чтение онлайн

на главную

Жанры

Шрифт:

Рис. 47 – Добавление переменной в окно обзора

Поскольку переменная k была взята на мушку заранее, поле уже содержит её имя. Теперь щелчок по кнопке OK отправит переменную в окно обзора (рис. 48). Если же поле «Watch expression» пусто, или содержит нечто другое, значит, вы промахнулись, не попали курсором. Тогда впечатайте имя нужной переменной и

щелкните OK. Действуя так, добавьте в окно обзора все интересующие вас переменные (рис. 48).

Рис. 48 – Окно обзора переменных Watches

Пока программа не запущена, напротив имен переменных выводится сообщение о невозможности доступа к ним, – пусть вас это не смущает. Лучше взгляните на то, как расположено окно «Watches». Сейчас оно занимает нижнюю часть экрана и закрывает собой часть окна с программой. Это неудобно, а посему обратитесь к пункту меню Window –> Tile (Окна –> Рядом) как показано на рис. 49.

Рис. 49 – Пункт меню Window –> Tile

В результате окна с текстом программы и списком переменных поместятся, не перекрывая друг друга (рис. 50). То же самое можно сделать и мышкой, перетаскивая и меняя размеры окон.

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

Нажав клавишу F7 четыре раза, мы достигнем оператора Readln, – здесь программа остановится в ожидании ввода строки. Введите как обычно строку из латинских букв «QAAAW» и нажмите Enter, – и тогда программа остановится перед входом в процедуру Scan, как показано на рис. 50.

Примечание. В отладчике IDE Free Pascal при вводе строки необходимо нажать клавишу Enter дважды.

Рис.50 – Состояние программы перед входом в процедуру Scan

В этом месте рассмотрим переменные в окне «Watches». Счетчик циклов k равен единице, – это глобальная переменная k, поскольку локальной переменной с этим же именем пока не существует. Переменная S содержит то, что мы ввели с клавиатуры. Параметр arg тоже пока не виден отладчику, о чём говорит сообщение «Unknown identifier».

Нажмите клавишу F7 ещё пару раз, пока цветная полоска не перескочит внутрь процедуры Scan. Здесь параметр arg примет то же значение, что и глобальная переменная S, – это прекрасно видно в отладчике. Продолжайте нажимать клавишу F7,

пока цветная полоска не дойдет до слова END в конце процедуры. Вы увидите, как параметр arg постепенно принимает значение «QBBBW», – это то, что нам нужно. Состояние программы в этот момент показано на рис. 51.

Рис. 51 – Состояние программы перед выходом из процедуры Scan

Теперь переменная k равна пяти, – это длина введенной строки. Но это уже другая, локальная переменная k, поскольку её глобальная тёзка внутри процедуры не видна. Но переменная S (тоже глобальная) по-прежнему видна внутри процедуры, ведь её имя не перекрывается локальной переменной.

Нажмите клавишу F7 ещё раз, – программа выйдет из процедуры и цветная полоска перепрыгнет на строку, следующую за вызовом процедуры Scan (рис. 52).

Рис. 52 – Состояние программы после выхода из процедуры Scan

Итак, к чему мы пришли? Сравнив это состояние с тем, что было до входа в процедуру (рис. 50), находим, что значения переменных не изменились. Переменная k снова стала равна единице, и это понятно – ведь теперь это глобальная переменная. Беда в том, что не изменилась и переменная S, а ведь именно этого мы добивались. В чем же дело?

Причина кроется в способе передачи параметра. При вызове процедуры Scan фактический параметр S копируется в формальный параметр arg, и далее внутри процедуры работа введется с этой копией. Иначе говоря, данные передаются только внутрь процедуры, но не обратно. Этот способ передачи параметров называют передачей по значению. Стало быть, глобальная переменная S не должна была измениться! Здесь надо что-то исправлять!

Ссылка на переменную

Рассмотрим ещё раз объявление параметра в процедуре Scan.

procedure Scan(arg : string);

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

Впрочем, добиться нужного результата несложно: достаточно вставить в объявление параметра ключевое слово VAR.

procedure Scan(var arg : string);

Это мелкое изменение влечет важное следствие: теперь arg – не локальная переменная, а ссылка на другую переменную. Это значит, что в момент вызова процедуры данные не будут копироваться, но параметр arg на время исполнения процедуры станет дублером фактического параметра S. Теперь, изменяя параметр arg, мы тем самым будем изменять и переменную S – наш фактический параметр.

Поделиться:
Популярные книги

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат