C: Передача указателя на функцию в функцию, которой она передана - PullRequest
3 голосов
/ 03 октября 2009

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

Вот идея того, что я пытаюсь сделать.

void map(T thing, void apply(int a, int b, void *cl), void *cl);

void function(T thing, void apply(int a, int b, void *cl), void * cl)
{

   for(int i = 0; i < 10; i++)
   {

      map(thing, apply, cl);

   }

}

жалоба GCC:

предупреждение: передача аргумента 2 'map' из несовместимого типа указателя

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 03 октября 2009

Чтобы помочь с этой проблемой, нам нужно увидеть объявление / подпись функции карты. Почти наверняка есть небольшая разница в сигнатуре функции. Самый простой способ решить эту проблему - определить тип указателя на функцию и использовать его в обеих функциях.

typedef void (*apply)(int,int,void*);
2 голосов
/ 03 октября 2009

Вы не можете передавать функции. Вместо этого вам нужно передать указатели на функции.

void map(T thing, void (*apply)(int a, int b, void *cl), void *cl);
void function(T thing, void (*apply)(int a, int b, void *cl), void * cl)
{
    /* ... */
    map(thing, apply, cl);
    /* .... */
}
0 голосов
/ 03 октября 2009

У меня работает с gcc 4.3.3 и -Wall.

Хотя я думаю, что все версии C, которые когда-либо существовали, переписали параметры «значения» функции в качестве указателей, вы можете использовать более традиционное объявление:

void function(T thing, void (*f)(int a, int b, void *cl), void * cl)

Но, как я уже сказал, ваш пример отлично работает для меня, без изменений, кроме typedef int T и map(1, ...)

0 голосов
/ 03 октября 2009

Просто жалуюсь, что тип указателя на функцию, ожидаемый вторым аргументом map, отличается от apply. Если вы либо измените этот тип, либо (если это безопасно), то все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...