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