Программирование >>  Инициализация объектов класса, структура 

1 ... 118 119 120 [ 121 ] 122 123 124 ... 395


const int size = 10; PFV testCases[size]; int testResults[size];

void runtests() {

for ( int i = 0; i < size; ++i )

вызов через элемент массива

testResults[ i ] = testCases[ i ](); образом:

Массив указателей на функции может быть инициализирован списком, каждый элемент которого является функцией. Например:

Результат в обоих случаях одинаковый, но вторая форма говорит читателю, что вызов осуществляется через указатель на функцию.

Конечно, если такой указатель имеет нулевое значение, то любая форма вызова приведет к ошибке во время выполнения. Использовать можно только те указатели, которые адресуют какую-либо функцию или были проинициализированы таким значением.

7.9.4. Массивы указателей на функции

Можно объявить массив указателей на функции. Например:

int (*testCases[10])();

testCases - это массив из десяти элементов, каждый из которгх является указателем на функцию, возвращающую значение типа int и не имеющую параметров.

Подобные объявления трудно читать, поскольку не сразу видно, с какой частью ассоциируется тип функции.

В этом случае помогает использование имен, определенных с помощью директивы

typedef делает объявление более понятн typedef int (*PFV)(); typedef для указателя на функцию

typedef:

PFV testCases[10];

Данное объявление эквивалентно предыдущему.

Вызов функций, адресуемых элементами массива testCases, выглядит следующим



int lexicoCompare( const string &, const string & ); sizeCompare( const string &, const string

typedef int ( *PFI2S )( const string &, const string & ); PFI2S compareFuncs[2] = {

lexicoCompare, sizeCompare

Можно объявить и указатель на comipareFuncs, его типом будет указатель на массив указателей на функции :

PFI2S (*pfCompare)[2] = compareFuncs;

Это объявление раскладывается на составные части следующим образом:

(*pfCompare)

Оператор разыменования говорит, что pfCompare является указателем. [2] сообщает о количестве элементов массива:

(*pfCompare) [2]

PFI2S - имя, определенное с помощью директивы typedef, называет тип элементов. Это указатель на функцию, возвращающую int и имеющую два параметра типа const string & . Тип элемента массива тот же, что и выражения &lexicoCompare.

Такой тип имеет и первый элемент массива compareFuncs, который может быть получен

compareFunc[ 0 ];

с помощью любого из выражений:

(*pfCompare)[ 0 ];

Чтобы вызвать функцию lexicoCompare через pfCompare, нужно написать одну из

эквивалентные вызовы

pfCompare [ 0 ]( string1, string2 ); сокращенная форма

следующих инструкций:

((*pfCompare)[ 0 ])( string1, string2 ); явная форма

7.9.5. Параметры и тип возврата

Вернемся к задаче, сформулированной в начале данного раздела. Как использовать указатели на функции для сортировки элементов? Мы можем передать в алгоритм сортировки указатель на функцию, которая выполняет сравнение:



Использование директивы typedef делает объявление sort() более понятным

typedef int ( *PFI2S )( const string &, const string & );

понятным:

int sort( string*, string*, PFI2S ); Поскольку в большинстве случаев употребляется функция lexicoCompare, можно

значение по умолчанию для третьего параметра int lexicoCompare( const string &, const string & );

использовать значение параметра по умолчанию:

int sort( string*, string*, PFI2S = lexicoCompare );

1 void sort( string *sl, string *s2,

2 PFI2S compare = lexicoCompare )

4 условие окончания рекурсии

5 if ( si < s2 ) {

6 string elem = *s1;

7 string *1ow = s1;

8 string *high = s2 + 1; 9

10 for (;;) {

11 while ( compare ( *++1ow, elem ) < 0 && low < s2) ;

12 while ( compare( elem, *-high ) < 0 && high > s1)

14 if ( low < high )

15 1ow->swap(*high);

16 else break;

17 } end, for(;;)

19 s1->swap(*high);

20 sort( s1, high - 1 );

21 sort( high +1, s2 );

22 } end, if ( si < s2 )

Определение sort() выглядит следующим образом:

23 }

sort() реализует алгоритм быстрой сортировки Хоара (C.A.R.Hoare). Рассмотрим ее определение детально. Она сортирует элементы массива от s1 до s2. Это рекурсивная функция, которая вызывает сама себя для последовательно уменьшающихся подмассивов. Рекурсия окончится тогда, когда s1 и s2 укажут на один и тот же элемент или s1 будет располагаться после s2 (строка 5).

int sort( string*, string*,

int (*)( const string &, const string & ) );

И в этом случае директива typedef помогает сделать объявление sort() более



1 ... 118 119 120 [ 121 ] 122 123 124 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика