Отображение ошибки в коде указателя функции
Я написал код, который использует указатели на функции для сравнения строк. Но это показывает мне ошибки, и я не знаю, как их исправить. Вот код:
#include<stdio.h>
#include<string.h>
void sports_no_bieber(char *);
void science_sports(char *);
void theater_no_guys(char *);
int find(int(*match)(char*));
int NUM_ADS=4;
char *ADS[]={
"Sarah:girls, sports, science",
"William: sports, TV, dining",
"Matt: art, movies, theater",
"Luis: books, theater, guys",
"Josh: sports, movies, theater"
};
int main()
{
printf("Bachelorette Amanda needs your help! He wants someone who likes sports but not bieber.\n");
find(sports_no_bieber);
printf("Bachelorette Susan needs your help! She wants someone who likes science and sports. (And girls).\n");
find(science_sports);
printf("Bachelorette Emily needs your help! She wants someone who likes theater but not guys.\n");
find(theater_no_guys);
return 0;
}
int find(int(*match)(char* ))
{
int i;
puts("Search results\n");
puts("--------------------");
for(i=0;i<NUM_ADS;i++)
{
if(match(ADS[i]))
printf("%s\n",ADS[i];
}
puts("--------------------");
return i;
}
int sports_no_bieber(char * s)
{
return (strstr(s, "sports")) && (!strstr (s,"bieber") );
}
int science_sports(char * s)
{
return (strstr(s, "science")) && (strstr (s,"sports" ));
}
int theater_no_guys(char * s)
{
return (strstr(s, "theater"))&&(!strstr(s,"guys"));
}
и ошибка это показывает
E:\ComputerPrograming\FunctionPointer.c: In function `int main()':
E:\ComputerPrograming\FunctionPointer.c:18: passing `void (*)(char *)' as argument 1 of `find(int (*)(char *))'
E:\ComputerPrograming\FunctionPointer.c:20: passing `void (*)(char *)' as argument 1 of `find(int (*)(char *))'
E:\ComputerPrograming\FunctionPointer.c:22: passing `void (*)(char *)' as argument 1 of `find(int (*)(char *))'
E:\ComputerPrograming\FunctionPointer.c: In function `int find(int (*)(char *))':
E:\ComputerPrograming\FunctionPointer.c:36: parse error before `;'
E:\ComputerPrograming\FunctionPointer.c:40: confused by earlier errors, bailing out
Я даже пытался превратить функцию поиска в функцию int... но это не имело никакого значения. Что именно означает ошибка?
2 ответа
Эти объявления функций:
void sports_no_bieber(char *);
void science_sports(char *);
void theater_no_guys(char *);
не совпадают с сигнатурой указателя функции, требуемой find()
или их определения. Изменить на:
int sports_no_bieber(char *);
int science_sports(char *);
int theater_no_guys(char *);
Обратите внимание, что NUM_ADS
не равно количеству элементов в ADS
массив: это на один меньше. Чтобы избежать необходимости NUM_ADS
а также ADS
правильно прекратить NUM_ADS
массив с NULL
указатель и использовать его как условие завершения цикла (и отбросить NUM_ADS
):
const char *ADS[] =
{
"Sarah:girls, sports, science",
"William: sports, TV, dining",
"Matt: art, movies, theater",
"Luis: books, theater, guys",
"Josh: sports, movies, theater",
NULL
};
for(int i=0; ADS[i]; i++)
{
Предложите сделать все типы аргументов функций const char* const
вместо char*
так как ни одна из функций не изменяет содержимое или повторно назначает указатель.
У вас есть два типа ошибок, во-первых, это несоответствие между прототипами и самими функциями.
void sports_no_bieber(char *);
^ ^ ^
| | |
these much mach the types here must
exactly match
| | |
v v v
int sports_no_bieber(char * s)
Поэтому вам нужно, чтобы имена и типы возвращаемых данных были одинаковыми, так же, как вы делаете это с типами параметров. В вашем случае возвращаемые типы не совпадают для sports_no_bieber()
, science_sports()
, а также theater_no_guys()
,
Один из способов избежать этой проблемы - переместить определение функции выше точки, в которой они используются, что устраняет необходимость в прототипах и исключает возможность их опечатки... конечно, вы также можете просто скопировать и вставить, чтобы избежать таких глупых ошибок, как эта,
Другая ваша ошибка в вашем find()
Функция, которую вы пропустили в скобках:
printf("%s\n",ADS[i]; // <-- missed the close )