#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. Боже, я чувствую себя глупо… честно говоря, я думал, что пробовал это, но я думаю, что задержка подсветки синтаксической ошибки сбила меня с пути… спасибо!