Система визуального объектно-ориентированного проектирования C++Builder 105

На рис. 2.37 представлено окно наблюдения в момент, когда в нашем прило-
жении произошла генерация исключения. Можно видеть, что переменная А равна
10380, а значение выражения А * 10000 указано равным +INF. Этот идентифика-
тор соответствует плюс бесконечности. Значит, при очередном умножении А на
10000 возникает переполнение, так как переменная типа int не может хранить
столь большого числа. В этом и заключается причина возникновения ошибки в на-
шем примере.

Окно наблюдения прекрасный инструмент, но при его использовании надо со-
блюдать некоторые правила. Когда вы пишете код, то по умолчанию считается,
что все компоненты принадлежат текущей форме и все свойства, для которых вы
не указываете объект, относятся также к текущей форме. В окне наблюдений по-
добных предположений не делается. Поэтому, если вы занесете в окно, например,
выражение Labell->Caption, то при останове выполнения приложения получите
вместо значения этого выражения сообщение: «Undefined symbol 'Labell'» — не
определен символ 'Labell'. Если же вы добавите в это выражение ссылку на форму
Formi, как это сделано на рис. 2.37, то все будет работать нормально.

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

volatile int x;

' Спецификатор volatile говорит компилятору, что данную переменную нельзя
хранить в регистре.

Другой (и лучший) вариант достичь той же цели — выполнить команду Project
Options и в открывшемся окне на странице Advanced Compiler выключить опцию
Register Variables (см. подробнее в главе 13 в разделе 13.2.2.2).

Только имейте в виду, что после окончания отладки оба эти варианта лучше
убрать, чтобы не снижать эффективность своего приложения.

К сожалению, не со всеми трудностями удается справиться так легко. Некото-
рые переменные становятся ненаблюдаемыми в момент генерации исключения. В
частности, если в нашем примере вы выведите в окно наблюдения переменную i, то
ее значение можно будет наблюдать при использовании описанных далее (см. раз-
делы 2.4.8.6 и 2.4.8.7) точек прерывания и пошаговом выполнении приложения.
Однако, в момент генерации исключения эта переменная становится недоступной
и с этим ничего поделать невозможно.

Рассмотрим теперь работу с окном наблюдения. Перейдя в него вы можете
щелкнуть правой кнопкой мыши и во всплывшем меню выбрать ряд команд, в ча-
стности: Edit Watch (отредактировать наблюдаемое выражение) или Add Watch
(вставить новое наблюдаемое выражение). В обоих случаях вы попадете в окно
Watch Properties, представленное на рис. 2.38. Вы можете попасть в это окно из
окна наблюдения и проще, нажав клавиши Ctrl+F5.

Рис. 2.38

Окно задания списка наблюдения Watch
Properties