【发布时间】:2015-07-25 03:55:11
【问题描述】:
所以, 我有大量函数可以从表单的某些来源读取输入:
ErrCode_t in_func1(t1_t * const data1);
ErrCode_t in_func2(t2_t * const data2);
...
一些触发函数,告诉我是否可以调用上面的函数:
TrCode_t tr_func1();
TrCode_t tr_func2();
...
以及对应的写出数据的函数:
void out_func1(t1_t const * const data1, const uint32_t handled_error);
void out_func2(t2_t const * const data2, const uint32_t handled_error);
...
还有一个相当复杂的算法取决于触发函数,它决定我是否可以调用输入函数。 (这是一张简化图;每个 I/O 都包含多个触发功能和计时器)。
这个算法但基本上说: 如果触发器说是,则使用指向数据变量的指针调用输入函数,检查错误,进行一些验证,然后将更新变量的指针传递给输出。
void execute_f1(t1_t * const pData1)
{
if(evalTr(tr_func1()))
{
const ErrCode_t myErr = in_func1(pData1);
const uint32_t myOutErr = evalError(myErr);
out_func1(pData1,myOutErr);
}
}
(而evalTr和evalError应该是一些正确使用的评估函数)
我想将此算法封装在一个自己的函数中,
void execute_io(???)
使用一些函数指针调用来执行此操作。但是如果没有大量的包装函数,我想不出一种符合标准的模式。 我包装了输入函数和输出函数以执行正确的强制转换,并调整签名,例如:
ErrCode_t my_in_func1(void * const pData1)
{
t1_t * const data1 = (t1_t*) pData1;
return in_func1(data1);
}
和输出功能类似:
void my out_func2(void const * const data2, const uint32_t handled_error) {...}
这样我就有了同质签名,这样就可以轻松获得函数指针。 但我真的不想包装所有这些功能。有谁知道可以“在”execute_io 和周围代码“内部”工作的模式,所以我不必包装所有这些函数?
更新:根据 barak manos 的要求,这里是一个组合:
system_interface.h
ErrCode_t in_func1(t1_t * const data1);
/* some 500 more of them */
TrCode_t tr_func1();
/* some 500 more of them */
void out_func1(t1_t const * const data1, const uint32_t handled_error);
/* some 500 more of them */
my_code.c
static ErrCode_t my_in_func1(void * const data1)
{
t1_t * const data1 = (t1_t*) pData1;
return in_func1(data1);
}
/* and some 500 more wrappers */
static void my_out_func1(void const * const pData1, const uint32_t handled_error)
{
t1_t const * const data1 = (t1_t) pData1;
out_func1(pData1, handled_error);
return;
}
/* and some 500 more wrappers */
typedef ErrCode_t (*inFuncPtr)(void * const);
typedef void (*outFuncPtr)(void const * const, const uint32_t);
typedef TrCode_t (*trFuncPtr)();
execute_io(inFuncPtr inFunc, outFuncPtr outFunc, trFuncPtr trFunc, void * pData)
{
if(evalTr((*trFunc)()))
{
const ErrCode_t myErr = (*inFunc)(pData);
const uint32_t myOutErr = evalError(myErr);
(*outFunc)(pData,myOutErr);
}
return;
}
void do_all_my_work()
{
{
t1_t data1;
execute_io(&my_in_func1, &my_out_func1, &tr_func1, &data1);
}
{
t2_t data2;
execute_io(&my_in_func2, &my_out_func2, &tr_func2, &data2);
}
/* and some 499 other calls */
}
我想找到另一种模式,它不会强迫我包装所有 I/O 函数。 (不,上面的代码肯定不是一个可执行的例子,而只是一个概念)
【问题讨论】:
-
能否请您展示一下您目前拥有的完整代码,并指出您不满意的地方?这比猜测所有这些代码 sn-ps 是如何组合在一起的要容易得多。
-
@barakmanos 希望更新有所帮助。
标签: c function-pointers