7.9.5. Параметры и тип возврата
7.9.5. Параметры и тип возврата
Вернемся к задаче, сформулированной в начале данного раздела. Как использовать указатели на функции для сортировки элементов? Мы можем передать в алгоритм сортировки указатель на функцию, которая выполняет сравнение:
int sort( string*, string*,
int (*)( const string , const string ) );
И в этом случае директива typedef помогает сделать объявление sort() более понятным:
// Использование директивы 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 );
Определение sort() выглядит следующим образом:
1 void sort( string *sl, string *s2,
2 PFI2S compare = lexicoCompare )
3 {
4 // условие окончания рекурсии
5 if ( si s1)
14 if ( low swap(*high);
16 else break;
17 } // end, for(;;)
18
19 s1-swap(*high);
20 sort( s1, high - 1 );
21 sort( high +1, s2 );
22 } // end, if ( si
sort() реализует алгоритм быстрой сортировки Хоара (C.A.R.Hoare). Рассмотрим
ее определение детально. Она сортирует элементы массива от s1 до s2. Это рекурсивная
функция, которая вызывает сама себя для последовательно уменьшающихся подмассивов.
Рекурсия окончится тогда, когда s1 и s2 укажут на один и тот же элемент или
s1 будет располагаться после s2 (строка 5).
elem (строка 6) является разделяющим элементом. Все элементы, меньшие чем elem,
перемещаются влево от него, а большие – вправо. Теперь массив разбит на две
части. sort() рекурсивно вызывается для каждой из них (строки 20-21).
Цикл for(;;) проводит разделение (строки 10-17). На каждой итерации цикла индекс
low увеличивается до первого элемента, большего или равного elem (строка 11).
Аналогично high уменьшается до последнего элемента, меньшего или равного elem
(строка 12). Когда low становится равным или большим high, мы выходим из цикла,
в противном случае нужно поменять местами значения элементов и начать новую
итерацию (строки 14-16). Хотя элементы разделены, elem все еще остается первым
в массиве. swap() в строке 19 ставит его на место до рекурсивного вызова sort()
для двух частей массива.
Сравнение производится вызовом функции, на которую указывает compare (строки
11-12). Чтобы поменять элементы массива местами, используется операция swap()
с аргументами типа string, представленная в разделе 6.11.
Вот как выглядит main(), в которой применяется наша функция сортировки:
#include
#include
// это должно бы находиться в заголовочном файле
int lexicoCompare( const string &, const string & );
int sizeCompare( const string &, const string & );
typedef int (*PFI)( const string &, const string & );
void sort( string *, string *, PFI=lexicoCompare );
string as[10] = { "a", "light", "drizzle", "was", "falling",
"when", "they", "left", "the", "museum" };
int main() {
// вызов sort() с значением по умолчанию параметра compare
sort( as, as + sizeof(as)/sizeof(as[0]) - 1 );
// выводим результат сортировки
for ( int i = 0; i
Результат работы программы:
"a"
"drizzle"
"falling"
"left"
"light"
"museum"
"the"
"they"
"was"
"when"
Параметр функции автоматически приводится к типу указателя на функцию:
// typedef представляет собой тип функции
typedef int functype( const string , const string );
void sort( string *, string *, functype );
sort() рассматривается компилятором как объявленная в виде
void sort( string *, string *,
int (*)( const string , const string ) );
Два этих объявления sort() эквивалентны.
Заметим, что, помимо использования в качестве параметра, указатель на функцию может быть еще и типом возвращаемого значения. Например:
int (*ff( int ))( int*, int );
ff() объявляется как функция, имеющая один параметр типа int и возвращающая указатель на функцию типа
int (*)( int*, int );
И здесь использование директивы typedef делает объявление понятнее. Объявив PF с помощью typedef, мы видим, что ff() возвращает указатель на функцию:
// Использование директивы typedef делает
// объявления более понятными
typedef int (*PF)( int*, int );
PF ff( int );
Типом возвращаемого значения функции не может быть тип функции. В этом случае выдается ошибка компиляции. Например, нельзя объявить ff() таким образом:
// typedef представляет собой тип функции
typedef int func( int*, int );
func ff( int ); // ошибка: тип возврата ff() - функция
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
9.2.2. Коды возврата системных вызов
9.2.2. Коды возврата системных вызов Коды возврата, зарезервированные для всех системных вызовов — это универсальные коды возврата ошибок, представленные небольшими отрицательными числами. Библиотека С проверяет наличие ошибок каждый раз, когда происходит системный
9.2.4. Общие коды возврата ошибок
9.2.4. Общие коды возврата ошибок Существует множество общих кодов ошибок, для которых вы вполне могли наблюдать сообщения. Некоторые из этих сообщений могут сбивать с толку. Без знаний о том, что можно делать в Linux-системе, трудно понять ошибки, которые могут возникать в
Параметры TCP
Параметры TCP Каждый сегмент SYN может содержать параметры TCP. Ниже перечислены наиболее общеупотребительные параметры TCP.? Параметр MSS. Этот параметр TCP позволяет узлу, отправляющему сегмент SYN, объявить свой максимальный размер сегмента (maximum segment size, MSS) — максимальное
27.5. Параметры транзитных узлов и параметры получателя IPv6
27.5. Параметры транзитных узлов и параметры получателя IPv6 Параметры для транзитных узлов и параметры получателя IPv6 имеют одинаковый формат, показанный на рис. 27.3. Восьмиразрядное поле следующий заголовок (next header) идентифицирует следующий заголовок, который следует за
Параметры
Параметры Сеть (Проигрыватель Windows Media 8.0 и выше)Чтобы скрыть вкладку Сеть (Сервис-Параметры), нужно установить значение типа DWORD параметра ·HideNetworkTab· равным 1 в разделе HKCUSoftwarePoliciesMicrosoftWindowsMediaPlayer.Автоматическое обновление (Проигрыватель Windows Media 7.0 и выше)Проигрыватель Windows
Параметры
Параметры После установки Проигрыватель Windows Media 10 готов к работе, и изменять значения основных параметров нет необходимости. Однако некоторые параметры все же, возможно, придется настроить.Откройте Проигрыватель Windows Media и выполните команду Сервис ? Параметры. Откроется
Свитки настроек Shader Basic Parameters (Основные параметры затенения) и Basic Parameters (Основные параметры)
Свитки настроек Shader Basic Parameters (Основные параметры затенения) и Basic Parameters (Основные параметры) Свитки Shader Basic Parameters (Основные параметры затенения) и Basic Parameters (Основные параметры) (рис. 3.5) позволяют настраивать параметры тонированной раскраски, трех главных компонентов цвета
3.3. Команды отмены и возврата действия
3.3. Команды отмены и возврата действия Конечно же, в процессе редактирования (как и выполнения любой другой работы в Word) никто не застрахован от ошибок. Можно ошибиться и при перемещении текста, и при выборе размера шрифта, и во многом другом. Для исправления ошибок в
Параметры
Параметры Список параметров, передаваемых в процедуру или в функцию, имеет следующий синтаксис:параметр1: тип; …; параметрN: типЕсли процедура или функция не принимает никаких параметров, то ее заголовок выглядит следующим образом: procedure имя_процедуры;function имя_процедуры:
Оператор возврата return
Оператор возврата return Синтаксис:return [<выражение>];Действие:Оператор возврата return заканчивает выполнение функции, в которой он содержится, и возвращает управление в вызывающую функцию. Управление передается в точку вызывающей функции, непосредственно следующую за
7.3.2. Параметры-ссылки и параметры-указатели
7.3.2. Параметры-ссылки и параметры-указатели Когда же лучше использовать параметры-ссылки, а когда – параметры-указатели? В конце концов, и те и другие позволяют функции модифицировать объекты, эффективно передавать в функцию большие объекты типа класса. Что выбрать:
Пример 6-2. Использование символа ! для логической инверсии кода возврата
Пример 6-2. Использование символа ! для логической инверсии кода возврата true # встроенная команда "true".echo "код возврата команды "true" = $?" # 0! trueecho "код возврата команды "! true" = $?" # 1# Обратите внимание: символ "!" от команды необходимо отделять пробелом.# !true вызовет сообщение
Параметры
Параметры Параметры в XSLT практически полностью идентичны переменным. Они точно так же связывают с объектом имя, посредством которого в дальнейшем можно к этому объекту обращаться. Главным различием является то, что значение, данное параметру при инициализации, является