С++/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);