2015-01-23 3 views
0

При составлении моего C файл, я получаю ошибку ниже:ошибка: неправильное преобразование из 'недействительным *' на 'Int (*) (сопзЬ пустота *, сопзЬ пустота *)'

error: invalid conversion from 'void*' to 'int (*)(const void*, const void*)' 
error: initializing argument 1 of 'void* bsearch(int (*)(const void*, const void*))' 

Ниже приведены некоторые фрагменты кода:

static int 
testfucn(const char *func, const teststruct *array) 
{ 
    return (strcmp(func, array->name)); 
} 

int 
test(char *fcn) 
{ 
    if (bsearch((void*)testfucn)) 
     return(1); 
    else 
     return(0); 
} 

Ошибка приезжающие на линии bsearch((void*)testfucn)

Не могли бы вы предложить то, что не так с этим кодом и как решить эту проблему.

+1

Также вы используете функцию 'bsearch'? По-видимому, это не стандартная функция 'bsearch' (http://en.cppreference.com/w/c/algorithm/bsearch)? –

ответ

0

Ошибка довольно явная - вы передаете void* (полученный вашим явным приложением), в то время как функция ожидает int (*)(const void*, const void*). Нет никакого неявного преобразования из 'pointer to void' в 'указатель на функцию', следовательно, ошибка.

Я считаю, что вы могли бы уйти с заливкой функции требуемого типа:

bsearch((int (*)(const void*, const void*)testfucn); 

Однако, обратите внимание, что в то время как она может (по всей видимости) на практике, было бы вызвать неопределенное поведение.

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

static int 
testfucn_for_bsearch(const void *func, const void *array) 
{ 
    return testfucn(func, array); 
} 

/* ... */ 

bsearch(testfucn_for_bsearch); 
+0

IIRC, вызывающий функцию, отличную от другого типа, не определен. – molbdnilo

+0

@molbdnilo Достаточно честный, переформулированный – Angew

+0

Спасибо @Angrew. Добавление (int (*) (const void *, const void *)) сработало !! – user1138143

0

Удалить бросок. Вы не можете передавать между данными (void *) и указателями функций, а аргумент должен быть указателем функции.

Также исправьте подпись вашей функции, она не соответствует ожидаемой сигнатуре обратного вызова bsearch(). См. the manual page для правильной подписи.

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