2012-02-21 2 views
0

У меня есть функция заголовок в библиотеке, которая выглядит следующим образом:C - передать функции указатель на указатель на функцию

void deepCopy(CList ** clone, CList * cl, void * (* data_clone) (void * d)); 

Я, имеющий огромное затруднение при прохождении его функции deep_clone правильно.

Это то, что я пытаюсь в настоящее время

CList *ys2 = &ys; 
void (*dc) (void *) = &data_clone; 
void (**dc2) (void *) = &dc; 
deepCopy(&ys2, &xs, dc2); 

ССАГПЗ выход:
testclist.c: В функции 'test_deep_copy':
testclist.c: 504: предупреждение: проходя аргумент 3 из ' deepCopy 'от несовместимого указателя типа

Я пробовал cdecl.org в своем объявлении dc2, и он говорит, что это то, что я предполагаю, будет правильным.

Любая помощь очень ценится; Спасибо.

+0

Если вы уже знаете Cdecl, использовать его на data_clone :) –

+0

Он говорит, что есть синтаксические ошибки. Кажется, это не похоже на заголовки функций. – ratbum

+0

Вам нужно оставить имя аргумента, как в 'explain void * (* data_clone) (void *)'. Вы также должны сделать это в своем коде. –

ответ

3

Функция не ожидает «указателя на указатель на функцию», она ожидает просто указателя на функцию.

deepCopy(..., &data_clone); 

должно быть достаточно.

+0

Спасибо. Это заставляет его работать, но он все еще настаивает на том, чтобы предупредить меня об этом. Могу ли я это остановить? – ratbum

+0

@ratbum: Что такое * точное сообщение об ошибке? –

+0

Это: testclist.c: В функции 'test_deep_copy': testclist.c: 505: warning: передать аргумент 3 из 'deepCopy' из несовместимого типа указателя – ratbum

0

Оба dc и dc2 возвращение void. deepCopy ожидает функцию, возвращающую void *.

Если data_clone определено как void * data_clone(void * d), то просто пройдите &data_clone напрямую.

Не позволяйте второй звездой в void * (* data_clone) (void * d)); запутать вас, это просто синтаксический сахар, чтобы сообщить компилятору о котором вы говорите указатель на функции. Это «простой» указатель на функцию, возвращающую void * и принимающий void *.

0

Просто передать функцию как это:

deepCopy(..., data_clone); 

Функция должна принять пустоту * в качестве аргумента и возвращает пустоту *. Это смысл первой пустоты, которую вы видите там.

Вам не нужен амперсанд, , который на самом деле означал бы указатель на указатель, поскольку он уже является указателем, достаточно одного только данных.

Пример:

void *test_callback(void *p) { 
    char *c = p; 
    *c = 'z'; 
    return c; 
} 

void test_func(char *a, void* (*callback)(void *p)) { 
    char *p = callback(a); 
    printf("%c\n", *p); 
} 

А потом ..

char c = 'a'; 
test_func(&c, test_callback); 
Смежные вопросы