Указатели на функции C ++ / C, возвращающие void * - PullRequest
5 голосов
/ 04 февраля 2012

Я пытаюсь вызвать функцию, которая принимает аргумент, void(*)(void*, int, const char*), но я не могу понять, как передать эти аргументы в функцию.

Пример:

void ptr(int);
int function(int, int, void(*)(int));

Я пытаюсь вызвать функцию следующим образом:

function(20, 20, ptr(20));

Возможно ли это?

Ответы [ 6 ]

9 голосов
/ 04 февраля 2012

Вы делаете одну вещь неправильно - вы пытаетесь вызвать вашу функцию 'ptr' перед вызовом 'функции'. То, что вы должны были сделать, это передать только указатель на «ptr» и вызвать «ptr», используя переданный указатель из «функции», например:

void ptr(int x)
{
    printf("from ptr [%d]\n", x);
}

int function(int a, int b , void (*func)(int) )
{
    printf( "from function a=[%d] b=[%d]\n", a, b );
    func(a); // you must invoke function here

    return 123;
}


void main()
{
    function( 10, 2, &ptr );
    // or
    function( 20, 2, ptr );
}

, что дает:

from function a=[10] b=[2]
from ptr [10]
from function a=[20] b=[2]
from ptr [20]

что вы и хотели

для

function(20, 20, ptr(20));

для работы - вам нужно иметь что-то вроде:

// 'ptr' must return sth (int for example)
// if you want its ret val to be passed as arg to 'function'
// this way you do not have to invoke 'ptr' from within 'function'
int ptr(int);
int function(int, int , int);
4 голосов
/ 04 февраля 2012

Обычный трюк - использовать typedef для подписи:

 typedef void signature_t (void*, int, const char*);

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

Тогда вы можете объявить свою функцию «высокого порядка» как

 int function (int, int, signature_t*);

См. Также этот ответ .

1 голос
/ 04 февраля 2012

Если я не полностью неверно истолковал ваш код, вы пытаетесь передать указатель функции с аргументом, выполнив

function(20, 20, ptr(20));

Это неверно и незаконно. Чтобы передать функцию в качестве параметра в другую функцию, вы должны следовать следующему синтаксису

function(20, 20, &ptr); 

or

function(20, 20, ptr); 

Даже если бы я рекомендовал оставить символ '&' для удобства чтения

1 голос
/ 04 февраля 2012

Правильный синтаксис для вызова функции:

function(20,20, &ptr);

Если вы чувствуете себя потерянным, попробуйте несколько учебных пособий или this

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

ptr(20) - это возвращаемое значение ptr, когда вы передаете ему 20. Если вы хотите передать функцию (а не ее возвращаемое значение), вы должны написать просто function(20,20,ptr);

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

Вы не можете передать ptr (20) этой функции, потому что вы можете только передать указатель на функцию, но не указатель с аргументом.Вы можете прочитать о функторах, и они помогут вам с такой проблемой.Или другое решение - изменить подпись на

int function(int, int, void(*)(void) );

и написать функцию

void ptr_wrap(void) {ptr(20);}

, чтобы вы могли вызвать function(20, 20, ptr_wrap);.Но функторы могут решить эту проблему более элегантным способом.

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