2017-01-29 20 views
3

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

typedef size_t (*hash_function)(const int *); 

а затем использовать его в другой функции

HashTable *hash_table_create(const hash_function hash) 

так что для любой функции, которая выполняет определение hash_function как

size_t hash_modulo(const int *parameters) 
size_t hash_universal(const int *parameters) 
... 

я могу использовать их в качестве параметра

hash_table_create(hash_modulo) 

Проблема заключается в: Мой IDE (Clion) жалуется, что параметры в данном случае не совпадают (код работает Тхо). В частности, это не похоже на передачу hash_function в качестве типа параметра, но будет приниматься, если вместо этого я использую size_t (*hash_function)(const int *). Что мне здесь не хватает?

Является ли мой код правильным и моя IDE неправильным или наоборот?

Заранее благодарен!

Edit 1: Точное сообщение об ошибке: Types 'hash_function' and size_t(const int *)' are not compatible

Edit 2: Это, кажется, Clion Bug

+0

Я полагаю, вы могли бы попытаться определить функцию вместо указательного типа в качестве возможного решения проблемы, например,'typedef size_t hash_function_t (const int *);' и 'HashTable * hash_table_create (hash_function_t * hash);' (и, возможно, 'extern hash_function_t hash_modulo, hash_universal;'.) – doynax

+0

Это отлично работает в GCC. И я не вижу никакой причины, которой это не должно быть. – Gerhardh

ответ

2

Я думаю, что проблема в том, что вы typedef функция, как const

HashTable *hash_table_create(const hash_function hash) 

и другие функции, которые вы хотите ввести как parameters не объявлены const

size_t hash_modulo(const int *parameters) 
size_t hash_universal(const int *parameters) 

Edit:

Это прекрасно работает в CodeBlocks

Изменить это:

size_t hash_modulo(const int *parameters) 
size_t hash_universal(const int *parameters) 

в этом:

hash_function hash_modulo; 
hash_function hash_universal; 

, а затем эта работа хорошо:

hash_table_create(hash_modulo); 
hash_table_create(hash_universal); 

Объяснение в комментарии ниже.

+1

Он становится еще более странным ... когда я удаляю const из 'hash_table_create', он даже не сможет разрешить хеш переменной. O.o – AdHominem

+0

Я просто попробовал его в codeeblocks, я могу только скомпилировать его, когда я изменяю объявление с 'size_t hash_modulo (const int * parameters)' на 'hash_function hash_modulo;'. В противном случае получите сообщение об ошибке 'main.cpp | 276 | ошибка: неверное преобразование из 'std :: size_t * (*) (const size_t *) {aka unsigned int * (*) (const unsigned int *)}' to ' hash_function {aka unsigned int (*) (const unsigned int *)} '[-fpermissive] | ' – Alex

+0

Ладно, странно, поэтому я предполагаю, что у меня неверный апологер, или мне нужно разыменовать – AdHominem

3

У CLION, кажется, есть ошибка (возможно). Названия функций имеют тип size_t(const int *). Теперь, поскольку функции неявно конвертируются в указатели на функции, ваш код отлично действует C.

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

hash_table_create(&hash_modulo); // Note the ampersand 

 Смежные вопросы

  • Нет связанных вопросов^_^