Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
07.01.2020
Размер:
3.08 Mб
Скачать

Int Comp(const void *а, const void *b);

Int mainO

{

char str[] = "Покажчики на функції дають гнучкість.";

qsort(str, strlen(str), 1, Comp); cout«"Відсортований рядок:"« str; cout« endl; getchQ; return 0;

}

Int Comp(const void *a, const void *b)

{

return * (char *) a - * (char *) b;

}

Ось як виглядають результати виконання цієї програми.

Відсортований рядок: .Пааагджииііїккккннносттууфцччьью

Ця програма сортує рядок str у зростаючому порядку. Оскільки функції qsort() передається вся необхідна їй інформація, в т.ч. покажчик на функцію порівняння, то її можна використовувати для сортування даних будь-якого типу. Наприклад, наведений нижче код програми сортує масив цілих чисел. Для гарантії перенос­ності під час визначення розміру цілочисельного значення в ній використовують оператор sizeof.

Код програми 11.7. Демонстрація механізму використання бібліотечної функції qsort() для сортування елементів цілочисельного масиву

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

int Comp(const void *а, const void *b);

int mainO

{

int num[] = {10,4, 3,6, 5,7,8};

qsort(num, 7, sizeof(int), Comp);

for(int i=0; i<7; І++) cout « num[i]<< " "; cout « endl;

getchO; return 0;

}

int Comp(const void *a, const void *b)

{

return * (char *) a - * (char *) b;

}

He станемо заперечувати, що покажчики на функції є не простими для розу­міння, але практика їх використання допоможе і "з ними знайти порозуміння". Відносно покажчиків на функції необхідно розглянути ще один аспект, що пов'я­заний з перевизначеними функціями.

  1. Пошук адреси перевюначеної функції

Отримати адресу перевизначеної функції трохи складніше, ніж знайти адресу звичайної "одиночної" функції. Якщо ж існує декілька версій перевизначеної фун­кції, то повинен існувати механізм, який би визначав, адресу якої саме її версії ми отримуємо. Під час отримання адреси перевизначеної функції саме спосіб оголо­шення покажчика визначає, адресу якої її версії буде отримано. По суті, оголо­шення покажчика у цьому випадку порівнюється з відповідними оголошеннями покажчиків перевизначених функцій. Функція, оголошення якої виявить збіг, і бу­де тією функцією, адресу якої ми отримали.

У наведеному нижче прикладі коду програми міститься дві версії функції spa- сеО- Перша версія виводить на екран count пропусків, а друга - count символів, пе­реданих як аргумент ch. У функції mainO оголошуються два покажчики на функції. Перший заданий як покажчик на функцію з одним цілочисельним параметром, а другий - як покажчик на функцію з двома параметрами.

Код програми 11.8. Демонстрація механізму використання покажчиків на дві перевпзначені функції для виведення на екран відповідно пропусків і символів

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

// Введення на екран count пропусків, void space(int count)

{

for(; count; count—) cout«"

}

// Введення на екран count символів, переданих в ch. void space(int count, char ch)

{

for(; count; count—) cout« ch;

}