Директивы компилятора и обработка ошибок ввода
Компилятор Паскаля -- сложное приложение, имеющее множество настроек. При написании учебных программ большинство этих настроек не имеют значения, но некоторые из них окажутся нам полезны. Для управления компилятором существует 2 основных возможности: настройка режимов работы с помощью верхнего меню Options оболочки Turbo Pascal и настройка конкретной программы с помощью директив компилятора, которую мы кратко рассмотрим. В общем виде директива компилятора представляет собой конструкцию вида {$X+} или {$X-}, где X -- латинская буква. Вариант со знаком "+" включает некоторый режим работы компилятора (например, строгий контроль программой соответствия типов данных, вывод системных диагностических сообщений и т. д.), а вариант со знаком "-" выключает его. Расположение директив, в общем, произвольно, однако, директивы, влияющие на всю программу, принято располагать в самом начале файла с исходным текстом. Фигурные скобки комментария {... } необходимы как часть синтаксиса директивы. Подробную информацию о назначении всех директив можно получить в справочной системе оболочки. Основные директивы компилятора также кратко описаны в Приложении 2. Наиболее полезной для нас выглядит директива {$I-}/{$I+}, соответственно, выключающая и включающая автоматический контроль программой результатов операций ввода/вывода (в/в). К операциям в/в относятся, в числе прочего, ввод данных пользователем, вывод строки на принтер, открытие файла для получения или вывода данных и т. п. Понятно, что даже несложная учебная программа выглядит лучше, если она умеет реагировать на неправильные действия пользователя или возникающие ошибки не просто выводом маловразумительного системного сообщения на английском языке, а доступным неискушенному пользователю текстом. По умолчанию контроль в/в включен и системные сообщения об ошибках генерируются автоматически. Все они кратко приведены в Приложении 3. Для замены системной диагностики своей собственной следует, во-первых, отключить директиву контроля оператором {$I-}, а во-вторых, сразу же после оператора, который мог породить ошибку, проверить значение, возвращаемое системной функцией IoResult. Эта функция возвращает ноль, если последняя операция в/в прошла успешно, в противном случае возвращается ненулевое значение. После завершения "критического" оператора директиву следует включить снова, чтобы не создавать потенциально опасных ситуаций в коде, который будет писаться далее. Приведем пример, написав "расширенную" программу решения квадратного уравнения, корректно реагирующую на возникающие ошибки:
uses printer; var a,b,c,d,x1,x2:real; begin writeln; writeln ('Введите коэффициенты a,b,c:'); {$I-} read (a,b,c); {$I+} if IoResult<>0 then begin {Возникла ошибка!} writeln ('Вы не ввели 3 числа, ', 'это что-то другое!'); reset (input); {очищаем стандартный поток ввода перед ожиданием нажатия Enter} readln; halt; {а этим оператором можно аварийно завершить программу} end; d:=sqr(b)-4*a*c; if d<0 then begin writeln ('Ошибка - дискриминант<0'); reset (input); readln; halt; end; x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); {$I-} writeln (lst,'x1=',x1:8:2,' x2=',x2:8:2); {$I+} if IoResult<>0 then writeln ('Не удалось напечатать') else writeln ('Результаты напечатаны'); reset (input); readln; halt; end. Специальной директивы для контроля математических ошибок в Паскале не предусмотрено, но это почти всегда можно сделать обычными проверками корректности данных. Обратите внимание на альтернативное решение проблемы "двух readln" в этом коде, а также на новый оператор halt и способ контроля того, удалось ли вывести строку на принтер. В дальнейшем мы не всегда будем выполнять подобные проверки, однако, их никогда не помешает делать, если вы хотите создать удобные для пользователя и понятные для разработчика программы.
Для работы с вещественными числами с двойной точностью (тип double) может также понадобиться указать перед программой директиву {$N+}, позволяющую сгенерировать код для аппаратной обработки таких чисел.
Читайте также: II. Проведение эксперимента и обработка результатов Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|