gpt4 book ai didi

c - 使用不同的参数运行不同的函数 - 函数指针

转载 作者:行者123 更新时间:2023-11-30 17:44:31 24 4
gpt4 key购买 nike

这与 Function pointer with undetermined paramater 中的问题类似但当我尝试了一下,出现编译错误:

错误:函数“accessVariant”的参数太多

错误:无效值没有被忽略,因为它应该是

我在 C 文件的顶部定义了它:

typedef void (*callBackHandler)(void*);
callBackHandler accessVariant= NULL;

我有回调注册功能:

void registerCallbackHandler(callBackHandler ptr_reg_callback)
{
if (ptr_reg_callback == NULL)
{
return;
}
else
{
accessVariant = ptr_reg_callback;
}
}

在代码中,我检查一些 bool 值,然后注册特定类型的访问函数:

if (bool)
{
registerCallbackHandler((callBackHandler)aRead16);
}
else
{
registerCallbackHandler((callBackHandler)aRead32);
}

aRead16 和 aRead32 均采用不同类型的参数。

然后我调用电话:(*accessVariant)( (void*)arg1,(void*) arg2, (void*)&value )

最佳答案

不要试图将方钉强行插入圆孔中,而只需使用圆钉即可。声明callBackHandler作为

typedef void (*callbackHandler)(void *, void *, void *);

您的函数没有未确定数量的参数。它们具有三个参数。

请注意,由于明确的 void*,您仍然如履薄冰。类型转换。删除它们并相应地修复您的原型(prototype)。

添加:如果函数并非全部具有完全相同的参数列表(例如您的示例,其中第三个参数有时是 uint16* 有时是 uint32* ),那么您需要多个 typedef 并适当选择一个。

typedef void (*genericCallback)(void);
typedef void (*callbackUint32Uint16Pint16Ptr)(uint32, uint16, uint16 *);
typedef void (*callbackUint32Uint16Uint32Ptr)(uint32, uint16, uint32 *);

void aRead16(uint32, uint16, uint16 *);
void aRead32(uint32, uint16, uint32 *);

void registerCallbackHandler(genericCallback callback)
{
if (callback == NULL)
{
return;
}
else
{
accessVariant = callback;
}
}

void RegisterSomething()
{
if (use_the_uint16_callback)
{
registerCallbackHandler((genericCallback)aRead16);
}
else
{
registerCallbackHandler((genericCallback)aRead32);
}
}

void CallTheCallback()
{
if (use_the_uint16_callback)
{
((callbackVoidPtrVoidPtrUint16)accessVariant)(x, y, z16);
}
else
{
((callbackVoidPtrVoidPtrUint32)accessVariant)(x, y, z32);
}
}

这需要 use_the_uint16_callbackaccessVariant期间保持不变因为在使用函数指针之前必须将其转换回其原始类型。

更新以更改所有参数。先前版本基于评论中提供的不正确信息。 (前两个参数最初声称是指针,但在评论中显示它们不是。第三个参数最初声称是 uint16 ,但在评论中显示它实际上是 uint16 * 。)

关于c - 使用不同的参数运行不同的函数 - 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com