объявление функции описывается интерфейсом, но я не могу присваивать имена

#c

Вопрос:

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

 typedef enum order (*cmp_fun)(const void *x, const void *y); bool tree_member(cmp_fun, const void *, const struct tree *); const struct tree *tree_insert(cmp_fun, const void *, const struct tree *);  

Когда я пытаюсь дать указателю функции имя и реализовать функцию, я получаю ошибку компилятора, и я не уверен, что делаю неправильно:

 bool tree_member(order (*funcptr), const void* test_value, const struct tree* my_tree){... ///?  const struct tree* tree_insert(int (*funcptr), const void* insert_value, const struct tree* my_tree){... //???  

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

 In file included from tree-examples.c:21: tree.c:15:18: error: unknown type name ‘order’  15 | bool tree_member(order (*funcptr), const void* test_value, const struct tree* my_tree){  | ^~~~~ tree.c:22:20: error: conflicting types for ‘tree_insert’  22 | const struct tree* tree_insert(int (*funcptr), const void* insert_value, const struct tree* my_tree){  | ^~~~~~~~~~~  

Я перепробовал много-много вариантов:

 bool tree_member(cmp_fun (*funcptr), const void* test_value, const struct tree* my_tree){   const struct tree* tree_insert(cmp_fun (*funcptr), const void* insert_value, const struct tree* my_tree){  

Ответ №1:

Компилятор сообщает вам, что он не распознает order имя типа. Вам нужно писать enum order , а не просто order .

Глядя на эту часть кода, я заметил, что вы использовали неправильный тип для первого аргумента tree_member функции. Интерфейс сообщает вам , что первый аргумент tree_member должен иметь тип cmp_fun , но вы случайно сделали его типом order * .

Компилятор также сообщает вам, что tree_insert написанная вами реализация имеет неправильный тип. Внимательно посмотрите на первый аргумент tree_insert . Предполагается, что это должно быть a cmp_fun в соответствии с интерфейсом, но вы случайно сделали свой первый аргумент int * вместо этого.

Подсказка: Вместо того, чтобы вводить свои реализации функций с нуля, вы можете просто скопировать данное вам объявление , ; заменить { } его и добавить имя для любых аргументов, в которых отсутствует имя. Следуя этой подсказке, вы получите этот код в качестве отправной точки:

 bool tree_member(cmp_fun cmp, const void * ptr,  const struct tree * my_tree) { }  const struct tree * tree_insert(cmp_fun cmp, const void * ptr,  const struct tree * my_tree) { }  

Комментарии:

1. Я пробовал варианты, которые вы предложили, но мне не ясно, каков правильный ответ. Как бы вы представили декларацию об осуществлении?

2. Смотрите мою подсказку и код, которые я только что добавил выше.

3. Боже, я чувствую себя глупо… честно говоря, я думал, что пробовал это, но я думаю, что задержка подсветки синтаксической ошибки сбила меня с пути… спасибо!