русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2014-11-28; переглядів: 719.


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

 


<== попередня лекція | наступна лекція ==>
Приклади програм з умовним оператором | Оператор циклу. Цикли із передумовою і після-умовою


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн