Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Обробка помилок в Windows






Більшість функцій Win32 API повертають код, за яким можна визначити, як завершилася функція: успішно чи ні. Якщо функція завершилася невдачею, то код повернення зазвичай дорівнює false, null або -1.

У цьому випадку функція Win32 API також встановлює внутрішній код помилки, який називається кодом останньої помилки (last-error code) і підтримується окремо для кожного потоку. Щоб отримати код останньої помилки, потрібно викликати функцію GetLastError(), яка має наступний прототип:

 

DWORD GetLastError (VOID);

 

Ця функція повертає код останньої помилки, встановленої в потоці. Встановити код останньої помилки в потоці можна за допомогою функції SetLastError(), яка має наступний прототип:

 

VOID SetLastError(DWORD dwErrCode); // код помилки

 

Щоб отримати повідомлення, відповідне коду останньої помилки потрібно використовувати функцію FormatMessage(), яка має наступний прототип:

 

DWORD FormatMessage(

DWORD dwFlags, // режими форматування

LPCVOID lpSource, // джерело повідомлення

DWORD dwMessageId, // ідентифікатор повідомлення

DWORD dwLanguageId, // ідентифікатор мови

LPTSTR lpBuffer, // буфер для повідомлення

DWORD nSize, // максимальний розмір буфера для повідомлення

va list *Arguments // список значень для вставки в повідомлення

);

 

Ми детально не розглядатимемо цю функцію, яка призначена для форматування символьних повідомлень, приведемо тільки приклад її використання для виведення повідомлення про помилку (message box). Для цього приведемо спочатку, в лістингу 2.6, текст функції, яка виводить повідомлення про помилку, а потім, в лістингу 2.7, програму, яка використовує цю функцію.

 

Лістинг 2.6. Функція для виведення повідомлення про помилку в MessageBox()

 

#include < windows.h>

 

void ErrorMessageBox()

{

LPVOID lpMsgBuf;

 

FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |

FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL);

// Показати помилку в MessageBox.

MessageBox(NULL, (LPCTSTR)lpMsgBuf, " Помилка Win32 API", MB_OK | MB_ICONINFORMATION);

// Звільнити буфер.

LocalFree(lpMsgBuf);

}

 

Лістинг 2.7. Приклад виведення повідомлення про помилку в MessageBox

 

#include " StdAfx.h"

#define UNICODE

#define _UNICODE

#include < tchar.h>

#include < windows.h>

 

// прототип функції виведення повідомлення про помилку в MessageBox

void ErrorMessageBox();

 

// тест для функції виведення повідомлення про помилку на консоль

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

HANDLE hHandle=NULL;

// неправильний виклик функції закриття дескриптора

if(! CloseHandle(hHandle))

ErrorMessageBox();

return 0;

}

void ErrorMessageBox()

{

//TCHAR lpszLineErr[] = _TEXT(" Помилка Win32 API");

wchar_t lpszLineErr[] = L" Помилка Win32 API";

LPVOID lpMsgBuf;

 

FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|

FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)& lpMsgBuf, 0, NULL);

 

// Показати помилку в MessageBox.

MessageBox(NULL, (LPCTSTR)lpMsgBuf, lpszLineErr, MB_OK|MB_ICONINFORMATION);

// Звільнити буфер

LocalFree(lpMsgBuf);

}

 

Тепер, раз ми працюємо з консольними застосуваннями, розглянемо, як виводити повідомлення про помилку на консоль. Для цього нам потрібно навчитися виводити російський текст на консоль. Це можна зробити при допомозі функції CharToOem(), яка має наступний прототип:

 

BOOL CharToOem(

LPCTSTR IpszSrc, // рядок для перекодування

LPSTR IpszDst // перекодований рядок

);

 

Ця функція перекодує символи з кодування Microsoft в кодування визначене виробником устаткування. Абревіатура OEM розшифровується як Original Equipment Manufacturer (справжній виробник апаратура).

У лістингу 2.8 Приведений приклад використання функції CharToOem().

 

 

Тепер визначимо функцію, яка виводить повідомлення про помилку на консоль, рідною мовою. Текст цієї функції приведений в лістингу 2.9.

 

 

У лістингу 2.10 приведений приклад використання функції CoutErrorMessage() у консольному застосуванні.

 

Зауваження

Якщо при запуску застосування використовується налагоджував, то текст повідомлення відповідний коду останньої помилки, можна подивитися у вікні watch, якщо набрати в рядку " ім'я змінної" наступний текст: @err, hr.

 

Варіанти завдань до лабораторної роботи №2

 

Варіант №1

Розробити програму, яка обчислює суму і добуток чисел від L до U, де L - це нижня межа діапазону, U - верхня межа діапазону. Значення меж вводяться користувачем, потім запускаються два потрібних потоки, а потім на екран виводяться отримані значення.

 

Варіант №2

Розробити дві програми. Перша обчислює число Фібоначі згідно номера, введеного користувачем, і формули Fi = Fi-1 + Fi-2, F0 = F1 = 1. Обчислення числа Фібоначі оформити як функцію потоку. Після завершення функції потоку програма виводить число на екран.

 

Варіант №3

Розробити програму для переведення цілого числа із знаком в його рядковий еквівалент прописом. Переведення числа оформити як функцію потоку. Введення числа відбувається до запуску потоку, а виведення рядка – після його завершення. Наприклад, ввід «-1211» повинне привести до виведення «мінус тисяча двісті одинадцять».

 

Варіант №4

Розробити програму для переведення знакового числа з плаваючою крапкою в його рядковий еквівалент прописом. Переведення числа оформити як функцію потоку. Введення числа відбувається до запуску потоку, а виведення рядка – після його завершення. Наприклад, ввід «-12.11» повинен привести до виведення «мінус дванадцять цілих одинадцять сотих».

 

Варіант №5

Розробити програму, яка здійснює введення двох рядків користувачем. Далі, якщо обидва Перша приймає від користувача два рядки. Далі, якщо обидва рядки зберігають цілі числа із знаком, то на екран виводиться сума чисел, інакше - конкатенація двох введених рядків. Перевірку на відповідність рядка цілому числу, обчислення суми чисел і конкатенацію рядків оформити як три різних функції потоку. Введення рядків здійснюється до запуску всіх потоків, а виведення результатів – після їх завершення.

 

Варіант №6

Розробити програму, яка обчислює суму і добуток двох прямокутних матриць. Виконання цих операцій оформити як дві функції потоку. Спочатку програма здійснює введення елементів матриць, а потім запускає обидва потоки, а після цього виводить результат на екран.

 

Варіант №7

Розробити програми для впорядкування одновимірного цілочисельного масиву. Сортування масиву за зростанням повинно здійснюватися будь-яким із так званих «покращених алгоритмів» сортування масивів і оформляється як функція потоку. Спочатку виконується введення елементів матриці, потім запускається потік і після цього – виведення впорядкованого масиву.

 

Варіант №8

Розробити програму для впорядковування одновимірного масиву чисел з плаваючою крапкою. Сортування масиву за зростанням повинне здійснюватися будь-яким з так званих «поліпшених алгоритмів» сортування і оформляється як функція потоку. Спочатку виконується введення елементів матриці, потім запускається потік і далі - виведення впорядкованого масиву.

 

Варіант №9

Розробити програму для впорядковування одновимірного масиву рядків. Сортування масиву за зростанням повинне здійснюватися будь-яким з так званих «поліпшених алгоритмів» сортування і оформляється як функція потоку. Спочатку виконується введення елементів матриці, потім запускається потік і далі - виведення впорядкованого масиву.

 

Варіант №10

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

 

Варіант №11

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

 

Варіант №12

Розробити програму для обчислення повного числа днів, які пройшли між двома датами. Дати – це рядки виду ЦЦ.ЦЦ.ЦЦЦЦ, де Ц - це будь-яка цифра з діапазону [0-9]. Обчислення різниці між датами оформляється як функція потоку. Спочатку здійснюється введення дат, потім запускається потік, і далі - результат виводиться на екран.

 

Варіант №13

Розробити програми для обчислення повного числа секунд, які минули між двома значеннями часу. Значення часу – це рядки виду ЦЦ.ЦЦ.ЦЦ, де Ц - це будь-яка цифра з діапазону [0-9]. Обчислення різниці між часами оформляється як функція потоку. Спочатку здійснюється введення значень часу, потім запускається потік, і далі - результат виводиться на екран.

 

 

Варіант №14

Розробити програму для пошуку входження підрядка в рядок. Ця операція оформляється як функція потоку і реалізує будь-який з відомих методів пошуку підрядка, окрім прямого. Спочатку здійснюється введення двох рядків, потім запускається потік, і далі виводяться результати: значення індекса елемента першого рядка, з якого почався збіг, або -1 інакше.

 

Варіант №15

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

 

Варіант №16

Розробити програму для отримання рядкового еквівалента дати прописом. Дата – це рядок виду Цц.Цц.Цццц, де Ц - це будь-яка цифра з діапазону [0-9]. Отримання рядкового еквівалента оформляється як функція потоку. Спочатку здійснюється введення дати, потім запускається потік, і далі результат виводиться на екран: число і місяць прописом, а за останніми чотирма - слово «року» (наприклад, введення «29.02.2013» призводить до виведення «Двадцять дев’ятого лютого 2013 року»).

 

Варіант №17

Розробити програму для отримання еквівалента значення часу прописом. Час – це рядок виду Цц.Цц.Цц, де Ц - це будь-яка цифра з діапазону [0-9]. Отримання строкового еквіваленту оформляється як функція потоку. Спочатку здійснюється введення значення часу, потім запускається потік, і далі результат виводиться на екран: значення годин, хвилин і секунд прописом (наприклад, введення «12.01.20» приводить до виведення «дванадцять годин одна хвилина двадцять секунд»).

 

Варіант №18

Розробити програму, яка здійснює інвертування бітового рядка, а також його переведення в десяткове число. Бітовий рядок - це рядок, який складається з нулів і одиниць. Інвертування бітового рядка і переведення рядка в десяткове число оформляється як дві функції потоку. Спочатку здійснюється введення бітового рядка, потім запускаються два потоки, і далі виводяться результати.

 

Варіант №19

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

 

Варіант №20

Розробити програму, яка здійснює обчислення факторіалу числа. Виконання даної операції (згідно формули N! = N * (N - 1)!, де 0! = 1) оформляється як функція потоку. Спочатку здійснюється введення числа, потім запускається потік, і далі результат виводиться на екран.

 

Варіант №21

Розробити програму, яка обчислює суму крайніх елементів квадратної матриці. Виконання цієї операції оформляється як функція потоку. Спочатку здійснюється введення елементів матриці, потім запускається потік, і далі результат виводиться на екран.

 

Варіант №22

Розробити програму, яка здійснює пошук елемента за ключем в цілочисельному векторі будь-яким відомим методом, окрім прямого. Виконання цієї операції оформляється як функція потоку. Спочатку здійснюється введення елементів вектора і значення ключа пошуку, потім запускається потік, і далі - результат виводиться на екран: значення індекса знайденого елемента або -1 інакше.

 

Варіант №23

Розробити програму для заміни всіх латинських букв в рядку на їх аналоги з кирилиці. Виконання цієї операції оформляється як функція потоку. Спочатку здійснюється введення рядка, потім запускається потік, і далі змінений рядок виводиться на екран.

 

Варіант №24

Розробити програму для зміни регістра всіх символів в рядку. Виконання цієї операції оформляється як функція потоку. Спочатку здійснюється введення рядка, потім запускається потік, і далі змінений рядок виводиться на екран.

 

Варіант №25

Розробити програму для перевірки того факту, що беззнакове ціле число є степенем двійки. Виконання цієї операції оформляється як функція потоку. Спочатку здійснюється введення числа, потім запускається потік, і далі на екран виводиться результат: якщо число є степенем двійки, то виводиться показник степеня, або повідомлення «не є степенем двійки» - інакше.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.016 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал