Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

osn_progr_final

.pdf
Скачиваний:
37
Добавлен:
12.02.2016
Размер:
3.27 Mб
Скачать

GetExceptionInformation()-повертає вказівник на структуру, яка містить детальний опис виключення Розглянемо приклад використання фільтуючої функції:

#include <except.h> #include<stdio.h>

#define MY_EXCEPTON 0x0000FACE void doSomething(void)

{/*нехай відбулось щось непередбачене і тому заявляємо виключення */ printf(“doSomething():помилковий стан!\n”); printf(“RaiseException()\n”);

RaiseException(MY_EXCEPTON,

EXCEPTION_CONTINUABLE,0,0); printf(“мені дозволили продовжувати”);}

DWORD Exceptionfilter( DWORD dwCode)

{ printf(“фільтр виключення: Код=%ld\n”,dwCode); if(dvCode==MY_EXCEPTON)

return EXCEPTION_EXECUTE_HANDLER; else return EXCEPTION_CONTINUE_SEARCH;

/*можна викликати EXCEPTION_CONTINUE_EXECUTION ,що відновить виконання з точки виключення та перерве пошук обробника*/}

int main(void)

{ __try{dosomathing();} __except(ExceptionFilter(GetExceptCode())) {printf(”виключення перехоплене \n”);} return 0;}

2.3.2 Використання завершуючих обробників виклю-

чень(_try/_finally)

Управління завершення включає в себе дві компоненти:

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

за ним слідує ключове слово _finally з блоком кода, який називається блоком завершення(також міститься у фігурних дужках). Оператори блоку завершення виконуються завжди, коли управління по-

кидає тіло захищеного кода;

__try

{/*тіло*/ }

371

__finally

{/*блок-обробник виключення*/ }

Якщо управління послідовно переходить від захищеного тіла до блоку завершення, то говорять, що тіло захищеного коду завершилось нормально.

Анормальне завершення відбувається, коли управління залишає захищене тіло внаслідок

використання оператора goto, break чи continue

виклику функції longjump()

заявленого виключення

Блок завершення може викликати функцію AbnormalTermination() щоб вияснити, як завершився захищений код. Розглянемо приклад, який демонструє обробку завершення:

#include <except.h> #include<stdio.h> void func(void)

{ /*Grab_A_Resourse();*/ __try

{

/*щось трапилось*/ return 0;

}

__finally {/*Release_The_Resourse();*/

printf(“__finally:Захищений блок завершився%s\n”, AbnormalTermination()?”анормально”:”нормально”);}} int main()

{func(); return 0;

}

Використовуючи вкладені блоки, можна комбінувати обидва варіанти обробки:

void funcA()

/*Якщо заявляється*/

{

/* виключення, порядок*/

__try

/*виконання такий:*/

{/*1. вираз фільтра*/

__try /*2. обробник виключення*/ { /*3. обробник завершення*/ /*захищений код*/

}

__except(фільтруючий вираз) {/*обробник виключення*/}

}

372

void funcB()

/*Якщо заявляється*/

{

/* виключення, порядок*/

__try

/*виконання такий:*/

{

/*1. вираз фільтра*/

__try

/*2. обробник завершення*/

{

/*3. обробник виключення*/

/*захищений код*/}

__finally

{/*обробник завершення*/}

}

__except(фільтруючий вираз) {/*обробник виключення*/}

Відмітимо, що

управління виключеннями С++(try/throw/catch) не може використовуватись в модулях мови С;

синтаксис управління завершення (__try/__finally) не може використовуватись в модулях С++;

кадроване управління С може використовуватись в модулях С++. Для реалізації кадрованого обробника в модулі С++ необхідно використовувати пару ключових слів try/__except чи try/except;

ЗАВДАННЯ ДЛЯ САМОСТІЙНОЇ РОБОТИ

1.Написати програму, у якій викидається деяке виключення у випадку помилки відкриття файлу.Визначити тип виключення як деякий клас Error, який містить інформацію про стан потоку (відповідних прапорців) та методи, що видають відповідні повідомлення про помилку.

2. Описати деякий клас, в якому виключення може викидатись з конструктора у випадку, коли не вистачає пам’яті. У відповідному обробнику передбачити виділення пам’яті шляхом знищення непотрібних файлів.

3.Написати власну функцію terminate(), яка викликається у випадку, коли для виключення не знайдено відповідного обробника.

4. Написати власну функцію unexpected(), що викликається у випадку порушення списку допустимих виключень.

373

374

3 ДОВІДНИК ФУНКЦІЙ С

ABORT <process.h>, <stdlib.h> void abort();

Роздруковує повідомлення "Abnormal program termination" (аварійне завершення програми) у stderr, завершує викликаний процес та повертає управління процесу, що його викликав. Функція abort не здійснює оновлення буферів потоків.

ABS <stdlib.h> int abs(n); int n;

Повертає абсолютне значення свого операнда.

ACCESS <io.h>

int access(pathname, mode);

char *pathname; //ім’я файла чи папки int mode; //доступ

Визначає, чи існує визначений файл та чи може він бути доступний у заданому режимі mode.

Повертає 0, якщо заданий файл має режим доступу mode і -1 в противному випадку.

ACOS <math.h> double acos(x); double x;

Повертає арккосинус x в інтервалі від 0 до n. Значення x повинно бути в межах від -1 до 1.

ALLOCA <malloc.h> char *alloca(size);

unsigned size; //виділені байти із стеку

Виділяє size байт із стеку програми. Пам’ять автоматично звільняється при виході із функції, що викликала alloca. Повертає вказівник на char на виділену область.

ASCTIME <time.h>

char *asctime(time);

struct tm *time; //вказівник на структуру, оголошену в

<time.h>

Перетворює час, поданий у вигляді структури, у символьний рядок.

375

Повертає вказівник на символьний рядок. Результуючий рядок містить 26 символів. Наприклад: Mon Jan 02 02:03:55 1980\n\0.

ASIN <math.h> double asin(x); double x;

Обчислює арксинус x в інтервалі [-Pi/2; Pi/2]. Значення x повинно бути в межах [-1; 1].

Повертає арксинус числа.

ASSERT <assert.h>

void assert(expression);

Друкує діагностичне повідомлення і завершує викликаний процес, якщо вираз expression є хибним (дорівнює 0). Діагностичне повідомлення має вигляд:

Assertion failed: file <filename>, line <linenumber>,

де filename – ім’я вихідного файла, linenumber – номер помилкового рядка. Якщо вираз expression є істинним (відмінним від 0), ніякої дії не виконується. Як правило, процедура assert використовується для пошуку логічних помилок в програмі.

ATOF <math.h> або <stdlib.h> double atof (string); char *string

Перетворює рядок string у дійсне число типу double. Повертає відповідне значення типу double.

ATOI <math.h> або <stdlib.h> int atoi (string)

char *string

Перетворює рядок string у ціле число типу int. Повертає відповідне значення типу int.

ATOL <stdlib.h>

long atol (string) char *string

Перетворює рядок string в значення типу long. Повертає відповідне значення типу long. Повертає значення 0L, якщо вхідний рядок не може бути перетворений до значення відповідного типу.

BDOS <dos.h>

int bdos(dosfn, dosdx, dosal); int dosfn; // номер функції

376

unsigned int dosdx; //значення регістра DX unsigned int dosal; //значення регістра AL

Виконує системний виклик переривання MS DOS, номер якого визначений dosfn, після розміщення відповідно в регістрах DX і AL значень dosdx і dosal. Функція bdos виконує команду INT 21H для здійснення системного виклику.

Повертає значення регістра AX, яке запам’ятовується.

BESSEL <math.h> double j0(x); double j1(x); double jn(n,x); double y0(x); double y1(x); double yn(n,x);

double x; //значення x int n; //цілий порядок

Процедури j0, j1, jn обчислюють відповідно функції Бесселя першого роду – 0, 1 і n.

Процедури y0, y1, yn обчислюють функції Бесселя другого роду – 0, 1 і n, відповідно.

Аргумент x повинен бути додатнім.

Повертають значення відповідних функцій Бесселя для x.

BSEARCH <search.h>

char *bsearch(key,base,num,width,compare); char *key; // ключ пошуку

char *base; //вказівник на масив

unsigned num,width; //кількість та розмір елементів int (*compare)(); //вказівник на функцію порівняння

Функція bsearch виконує двійковий пошук у відсортованому масиві з num елементів, розмір кожного елемента якого дорівнює width байт. Base – вказівник на початок масиву, key

– значення ключа пошуку. Аргумент compare є вказівником на процедуру, що задається користувачем. Дана функція порівнює два елементи масиву та повертає значення, що визначає відношення між елементами:

ЗНАЧЕННЯ

ЗМІСТ

менше 0

element1 менше, ніж element2;

0

element1 дорівнює element2;

більше 0

element1 більше, ніж element2.

377

Повертає вказівник на перше входження ключа key у масив, на який вказує base або NULL, якщо key не знайдений, функція повертає NULL.

CABS <math.h> double cabs(z);

struct complex z; //містить дійсну та уявну частини числа Обчислює абсолютне значення комплексного числа.

Комплексне число повинно бути структурою типу complex. CALLOC <malloc.h>

char *calloc(n,size);

unsigned n; //кількість елементів

unsigned size; //розмір кожного елемента в байтах

Виділяє пам’ять для збереження масиву з n элементів, кожен з яких має розмір size байт.

Кожен елемент ініціалізується 0. Повертає вказівник на char, що містить адресу виділеної області пам’яті та NULL, якщо виділити пам’ять не вдається.

CEIL <math.h> double ceil(x); double x;

Повертає значення double, яке є найменшим цілим, більшим або рівним x.

CGETS <conio.h>

char *cgets(str);

char *str; //пам’ять для збереження даних

Читає рядок символів з консолі і запам’ятовує рядок та його довжину в str. Масив повинен вмістити рядок, ‘\0’ та два додаткових байта. Перший элемент масива str[0] повинен містити максимальну довжину рядка, що читається. Другому елементу масива str[1] буде присвоєно дійсну довжину рядка. Сам рядок буде починатись із третього елемента str[2].

Повертає вказівник на початок рядка, котрий знаходиться починаючи з str[2]. У випадку помилки нічого не повертається.

CHDIR <direct.h>

int chdir(pathname);

char *pathname; //path-ім’я нового робочого каталогу

Змінює біжучий робочий каталог на новий, що визначається параметром pathname.

378

Повертає 0, якщо робочий каталог успішно змінений і -1, якщо виникла помилкова ситуація.

CHMOD <sys\types.h>, <sys\stat.h>, <io.h> int chmod(pathname,pmode);

char *pathname; //ім’я існуючого файлу int pmode; // доступ до файла

Змінює режим доступу до файла, заданого path-іменем. Доступ може включати читання чи запис. Константний вираз pmode складається з однієї чи обох констант S_IWRITE та S_IREAD, визначених в <sys\stat.h>. Будь-яке інше значення для pmode ігнорується. Коли задані обидві константи, вони об’єднуються логічним оператором АБО (|).

Значення аргументів pmode:

S_IWRITE

дозволено запис;

S_IREAD

дозволено читання;

S_IREAD | S_IWRITE дозволено читання та запис. Повертає 0, якщо доступ успішно змінений та -1, якщо виникла помилка.

CHSIZE <io.h>

int chsize(handle,size);

int handle; //handle посилається на відкритий файл long size; //нова довжина файла в байтах

Збільшує чи зменшує файл, пов’язаний з дескриптором handle до розміру size.

Файл повинен бути відкритим в режимі, що дозволяє запис. Якщо файл збільшується, до нього додаються нульові символи ‘\0’, якщо зменшується, то дані в кінці файлу втрачаються.

CLEARERR <stdio.h>

void clearerr(stream); FILE *stream;

Очищає для потоку stream індикатор помилки та індикатор кінця файлу(EOF).

Індикатори помилок автоматично не очищаються; якщо для потоку встановлений індикатор помилки, то операції над потоком будуть повертати значення помилок доти, доки функції clearerr чи rewind не будуть викликані

COS-COSH <math.h> double cos(x); double cosh(x);

379

double x; // в радіанах

Повертають відповідно косинус та косинус гіперболічний x.

CPRINTF <conio.h>

int cprintf(format-string[,argument...]);

char *format-string; //рядок управління форматом

Форматує та друкує різні значення прямо на консоль. format-string має має ту ж саму форму та функцію, що і у фу-

нкції printf.

Повертає кількість надрукованих символів.

CPUTS <conio.h> void cputs(str);

char *str; //вказівник на рядок, що виводиться

Записує рядок, що завершується нулевим символом прямо на консоль.

CREAT <sys\types.h>,<sys\stat.h>,<io.h> int creat(pathname, pmode);

char *pathname; //path-ім’я нового файла int pmode; // режим доступу

Створює новий файл або відкриває та відсікає до довжини 0 існуючий, знищуючи весь вміст. Режим доступу pmode використовується лише для створених файлів.

Значення аргументів pmode:

S_IWRITE

дозволений запис;

S_IREAD

дозволено читання;

S_IREAD | S_IWRITE дозволено читання та запис. Повертає дескриптор handle створеного файлу або -1, якщо виникла помилка.

CSCANF <conio.h>

int cscanf(format-string[,argument...]);

char *format-string; строка управления форматом

Читає дані з консолі у змінні, задані параметрами arguments (якщо вони є), використовуючи для читання символів функцію getch. Кожен аргумент argument повинен бути вказівником на змінну відповідного типу, що відповідає специфікації в format-string. Format-string управляє інтерпретацією полів вводу і має таку ж форму і функцію, що й аргумент format-string для функції scanf. Повертає кількість перетворених та призначених полів.

380

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]