какова цель использования этого параметра, int (* cmp) (void *, void *) - PullRequest
1 голос
/ 29 мая 2020

в моем домашнем задании я не мог понять этот параметр;

set_maker(LINKEDSTACK stack, int (*cmp) (void*, void*))

может кто-нибудь объяснить это с помощью?

спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

Это указатель на функцию, принимающую два аргумента-указателя и возвращающую int. Судя по названию, семантика функции заключается в том, что она сравнивает два указанных объекта и возвращает значение <0, 0 или> 0, указывающее относительный порядок двух объектов в соответствии с некоторыми критериями упорядочения.

Назначение такого параметра - разрешить функции (set_maker() в данном случае) работать с объектами произвольного типа и правил упорядочивания. Например, если вы работали с объектами int, у вас могла бы быть функция:

int icompare(const void * a, const void * b) 
{
   return ( *(int*)a - *(int*)b );
} 

Затем вы могли бы вызвать set_maker() таким образом:

set_maker( istack, icompare ) ;

, чтобы set_maker() может работать на LINKEDSTACK из int с. (Я делаю здесь несколько аргументированное предположение, поскольку вы не предоставили подробностей о set_maker() или LINKEDSTACK).

Точно так же функция сравнения может работать с struct объектами с более сложными правилами сравнения, включающими несколько члены. Таким образом, его цель - сделать set_maker() достаточно гибким для обработки любого типа данных без дублирования большого количества кода, предоставив правила для обработки каждого типа данных в предоставленной функции.

Пример стандартной библиотеки такого типа функция qsort () , хотя вы заметите, что параметры имеют тип const void*, что является наилучшей практикой для функций, которые не предназначены для изменения объектов, на которые есть ссылки.

0 голосов
/ 29 мая 2020

В C такие функции, как bsearch и qsort, которые работают с упорядоченными последовательностями, нуждаются в функции, которая будет сравнивать элементы массивов.

Указатель на такую ​​функцию объявляется как

int ( *cmp )( const void *, const void * )

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

Функция должна возвращать целое число, меньшее, равное или большее нуля, если рассматривается первый указанный объект, соответственно, чтобы быть меньше, совпадать или быть больше, чем второй заостренный объект.

Кажется, что функция set_maker использует в своем теле такую ​​функцию сравнения, например, для сравнения двух объектов для их заказа.

.

0 голосов
/ 29 мая 2020

int (*cmp) (void*, void*)

Это указатель на функцию, принимающую два параметра типа void * и возвращающую int

Вероятно, это должна быть функция, которая сравнивает два указателя или объекта на которые ссылаются указатели - кто знает

...