2013-05-08 2 views
-2

Я написал код, который использует указатели функций для сравнения строк. Но он показывает мне ошибки, и я не знаю, как их исправить. Вот код:Показаны ошибки в коде указателя функции

#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 ... но это не имеет никакого значения. Что именно означает ошибка?

+5

Ваших прототипы функций не соответствуют вашему определению функций ... – Mat

ответ

4

Эти функции декларации:

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*, поскольку ни одна из функций не изменяет содержимое или не назначает указатель.

+0

Ача. Спасибо что подметил это. Это было довольно глупо со мной. –

1

У вас есть два типа ошибок: во-первых, это несоответствие между прототипами и самими функциями.

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) 
Смежные вопросы