Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

8. Директиви компілятора й обробка помилок уведення

Компілятор Паскаля – складний додаток, що має безліч настроювань. При написанні навчальних програм більшість цих настроювань не мають значення, але деякі з них виявляться нам корисні. Для керування компілятором існує 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 ('Уведіть 3 дійсних числа:');

{$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 очистили стандартний потік уведення}

Readln;

Halt;

end.

Спеціальної директиви для контролю математичних помилок у Паскалі не передбачене, але це майже завжди можна зробити звичайними перевірками коректності даних. Зверніть увагу на альтернативний розв'язок проблеми "двох readln" у цьому коді, а також на новий операторHaltі спосіб контролю того, чи вдалося вивести рядок на принтер.

Надалі ми не завжди будемо виконувати подібні перевірки, однак, їхнім ніколи не перешкодить робити, якщо Ви прагнете створити зручні для користувача й зрозумілі для розроблювача програми.

Для роботи з речовинними числами з подвійною точністю (тип double) може також знадобитися вказати перед програмою директиву{$N+}, що дозволяє згенерувати код для апаратної обробки таких чисел.