Так, У меня есть огромный набор функций для чтения входов от какого-либо источника формы:шаблона для обработки функции указателя функций inhomogene подписи в C
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);
...
Также существует довольно сложный алгоритм в зависимости от функций триггера, который решает, могу ли я назвать функцию ввода, или нет. (это упрощенная картина, более чем одна триггерная функция и таймеры, предусмотренные для каждого ввода-вывода).
Этот алгоритм, но в основном говорит: Если триггер говорит «да», вызовите функцию ввода с указателем на переменную данных, проверьте ошибку, выполните некоторую проверку и затем передайте указатель обновленной переменной на выход.
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 должны быть некоторые функции оценки, которые используются правильно)
Я хотел бы, чтобы инкапсулировать этот Algo в собственной функции,
void execute_io(???)
называться с некоторыми чтобы это сделать. Но я не могу думать о шаблоне, который бы соответствовал стандарту, без огромного количества функций обертки. Я завернуть ввод-функцию и функцию вывода на perfom правильных слепков, и корректировать свои подписи, как:
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 и окружающего кода, поэтому мне не нужно обертывать все эти функции?
Update: А вот в комбинации, как запрошенной от Barak Маноса:
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 */
}
Я хочу найти другой шаблон, который делает не заставляйте меня обертывать все функции ввода-вывода. (и нет, приведенный выше код, конечно, не является исполняемым примером, а просто концепцией)
Не могли бы вы просто показать полный фрагмент кода, который у вас есть сейчас, и указать, что именно вас не устраивает? Нам было бы намного легче, чем пытаться угадать, как все эти фрагменты кода объединяются вместе. –
@barakmanos надеется, обновление помогает. –