С++/C, которые возвращают void *

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

Пример:

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

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

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

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

Ответ 1

Вы делаете одну вещь неправильно - вы пытаетесь вызвать свою функцию "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);

Ответ 2

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

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

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

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

 int function (int, int, signature_t*);

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

Ответ 3

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

function(20,20, &ptr);

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

Ответ 4

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

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

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

function(20, 20, &ptr); 

or

function(20, 20, ptr); 

Несмотря на то, что я бы посоветовал оставить "&" для удобочитаемости

Ответ 5

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

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

И запишите функцию

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

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

Ответ 6

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