2014-09-21 1 views
-1

Во-первых, я в первую очередь программист на Java, но мне поручено делать некоторые сетевые материалы в C. У меня есть функция со следующей подписью :Передача функции значения void как части сигнатуры функции в C

foo(int, void (*) (int, char *, int)) 

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

bar(int, char *, int) 

Теперь я прав, полагая, что foo хочет указатель bar с любыми переменными, мне нужно в то время? Вызов

foo(1,myfunction(1,&anCharArray,10)); 

не работает с ошибками.

Если у кого есть ссылки на хорошие статьи по указателям, которые также помогут.

+0

Что вы пытаетесь достичь (особенно в отношении вашего комментария к ответу Оуа)? – mafso

ответ

1

void (*)(int, char *, int) является анонимным параметр типа «указатель на функцию, возвращающую void и принимает три аргумента: int, а char * и другой int». Вам необходимо передать имя такой функции (в вашем случае, bar) в качестве второго аргумента функции foo. Лично я бы предпочел видеть объявление foo, написанное с типом возврата и именами параметров, а объявление bar() также должно иметь тип возврата и имена параметров. Имена не должны совпадать между объявлением функции и определением, но обычно это не считается хорошим стилем для изменения имен между ними.

void foo(int num, void (*func)(int num, char *str, int len)); 
static void bar(int num, char *str, int len); 

Вы можете позвонить:

foo(10, bar); 

Внутри foo(), вы будете иметь код, такой как:

void foo(int num, void (*func)(int num, char *str, int len)) 
{ 
    char str[] = "Supercalifragilisticexpialidocious"; 
    (*func)(num, str, strlen(str)); 
} 

Или, если вы новичок в школу (не архаический пережиток, как я), то:

void foo(int num, void (*func)(int num, char *str, int len)) 
{ 
    char str[] = "Supercalifragilisticexpialidocious"; 
    func(num, str, strlen(str)); 
} 

Они эквивалентны. Я по-прежнему предпочитаю, чтобы явная функция «Я вызываю функцию через указатель на функцию», но это необязательно, и современный стиль обычно избегает ее.

+0

Объявление foo: int foo (portNum, void (*) dataHandler (portNum, char [] * data, int dataLength). Спасибо за ввод. Это действительно помогает :) – Darakian

+0

Обозначение 'char [] * data' не является синтаксически законным C; вы можете означать 'char * data []' (что означает одно) или 'char * data' или' char data [] '(что означает что-то другое). И вы не должны передавать функцию, которая возвращает 'int' в качестве указателя, когда указатель ожидает функцию, которая возвращает' void'. Компилятор должен предупредить вас об этом - несоответствие типа. –

2
foo(1,myfunction(1,&anCharArray,10)) 

терпит неудачу с количеством ошибок.

Попробуйте вместо этого:

foo(1, myfunction) 

Второй параметр foo функции является указателем на функцию, но вы проезжали возвращаемое значение вызова функции.

+0

Как бы передать значения, которые мне нужны? – Darakian

+0

@ user832818, добавив параметры в функцию 'foo'? – ouah