2015-05-05 4 views
1

У меня есть функция, которая принимает следующий аргумент:Ошибка компиляции. Определение несоответствия. недействительный (*) (недействительный *)

int setvalue(void (*)(void *)); 

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

static void *freeFunction(void *freeAbc) 
    { 
     AllocAbc *abc = (AllocAbc*) freeAbc; 
     if (abc) 
     { 
      delete abc; 
     } 
     return NULL; 
    } 

и я пытаюсь использовать оба вместе:

AllocAbc *allocAbc = new AllocAbc(); 
    ... 
    void *freeAbc = (void *) allocAbc; 
    if (setvalue (freeFunction(freeAbc)) < 0) 
    {   
     ... 
    } 

Я получаю сообщение об ошибке говорящее error: invalid conversion from ‘void*’ to ‘void (*)(void*)’ [-fpermissive]

Что нужно изменить здесь (либо в определении freeFunction, либо в том, как я использую оба), чтобы заставить его работать.

Спасибо.

+1

Какая строка является ошибкой? –

+0

Возможный дубликат [Как работают указатели функций в C?] (Http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work) – Barracuda

ответ

3

Ваша функция должна быть возвращена void не void *.

static void freeFunction(void *freeAbc) 
{ 
    ... 
} 

(*) указывает на то, что параметр setvalue «s является указателем на функцию. Это не часть возвращаемого типа этой функции.

(void (*)(void *) 
^^^^^^^^^^^ 
    || | || 
    || | ++ parameter types 
    || | 
    || + function pointer 
    || 
    ++ return type 

Кроме того, чтобы позвонить setvalue вам нужно передать имя функции, не вызывая его.

if (setvalue(freeFunction) < 0) 

Чтобы сделать его более ясным, вы можете добавить &, чтобы указать, что вы не вызов функции. & является необязательным при передаче указателей функций, поэтому это просто читаемость.

if (setvalue(&freeFunction) < 0) 
+0

Благодарим Иоанна за подробное объяснение. Код теперь компилируется. Но еще один вопрос. Я фактически использую freeFunction для освобождения памяти, переданной * freeAbc. Как функция получит адрес памяти, когда мы просто укажем, если (setvalue (& freeFunction) <0)? – Singo

+0

'setvalue' должен будет передать это значение, когда он вызывает функцию.Возможно, вы можете добавить второй параметр в 'setvalue', чтобы он принял как указатель на функцию, так и аргумент' 'void *' data, а затем вызывает функцию с этим указателем данных. –

+0

Спасибо, Джон. Это помогло. – Singo

1

freeFunction возвращается void*, но setvalue хочет функцию, которая возвращает void. Они явно не одного типа.

Также вы передаете возвращаемое значение freeFunction на номер setvalue, но setvalue ожидает указатель на функцию.

3

У вас есть две проблемы:

  1. Ваш freeFunction возвращает void вместо void *.
  2. Вы передаете возвращаемое значение freeFunction(freeAbc) в setValue вместо указателя на функцию.
Смежные вопросы