ANSI C - функции в качестве аргументов для других функций - PullRequest
0 голосов
/ 24 октября 2011

У меня есть эти прототипы:

int *my_func(int x, void (*other_func)(int a, int b));

int func2(int val1, int val2);

Предположим, есть написанная функция, которая соответствует ей.

Если я хочу вызвать my_func, как бы я это сделал?Я безуспешно пробовал следующее:

my_func(1,func2);

Вот ошибка:

warning: passing argument 2 of ‘my_func’ from incompatible pointer type

Ответы [ 3 ]

5 голосов
/ 24 октября 2011

Это потому, что прототипы функций не совпадают:

void (*other_func)(void *a, int *b)

- это не то же самое, что:

int func2(int val1, int val2);

Один принимает void* и int*, в то время какдругой занимает два int с.

РЕДАКТИРОВАТЬ:

Кроме того, тип возврата не совпадает.

РЕДАКТИРОВАТЬ 2:

Поскольку вы исправили обе ошибки, этот ответ находится вне контекста. Я только что проверил его с этими двумя исправлениями, и он компилируется:

int *my_func(int x, void (*other_func)(int a, int b)){
    return 0;
}
void func2(int val1, int val2){
    printf("blah");
}


int main(){
    my_func(1,func2);

    return 0;
}
2 голосов
/ 24 октября 2011

Ваш исходный код имел void* для первого аргумента переданной функции и тип возвращаемого значения int, и это вызывало вашу проблему:

int *my_func(int x, void (*other_func)(void * a, int b)) { return 0;}
int func2(int val1, int val2) {}
int main (void) {
    my_func (42, func2);
    return 0;
}

Со следующими правками, изменив его на int и вернув void, означает без проблем:

int my_func(int x, void (*other_func)(int a, int b)) { return 0;}
void func2(int val1, int val2) {}
int main (void) {
    my_func (42, func2);
    return 0;
}

Компиляция первого дает вам:

warning: passing argument 2 of 'my_func' from incompatible pointer type

Компиляция последнего не дает никаких ошибок или предупреждений, и объектный файл создается нормально.

0 голосов
/ 24 октября 2011

Часто (1) (2) мы используем "typedef", чтобы убедиться, что тип нашей функции соответствует типу функции, ожидаемой в качестве аргумента другой функции..

typedef void (*pt2Func)(void *, int *);

int *my_func(int x, pt2Func other_func);

pt2Func func3;

int main(void){
    my_func(1,func3);
}

, что означает то же самое, что и

int *my_func(int x, void (*other_func)(void *a, int *b));

void func3(void *val1, int *val2);

int main(void){
    my_func(1,func3);
}
...