C - передать функцию указатель на указатель на функцию - PullRequest
0 голосов
/ 21 февраля 2012

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

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);

Вывод gcc:
testclist.c: в функции «test_deep_copy»:
testclist.c: 504: предупреждение: передача аргумента 3 из 'deepCopy' из несовместимого типа указателя

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

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

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

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

deepCopy(..., &data_clone);

должно хватить.

0 голосов
/ 21 февраля 2012

Просто передайте функцию следующим образом:

deepCopy(..., data_clone);

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

Вам не нужен амперсанд, , который на самом деле будет означать указатель на указатель, поскольку это уже указатель, достаточно только 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);
0 голосов
/ 21 февраля 2012

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

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

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

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