Здесь я объясняю проблему.Предположим, у меня есть структура A, загруженная в общую память.Структура A может выглядеть примерно так:
typedef enum{
GPIO_1,
GPIO_2,
GPIO_3,
GPIO_4,
GPIO_5,
N_GPIO
} gpio;
struct B {
bool active;
bool status;
bool direction;
int timestamp;
int t1;
int t2;
};
struct A {
struct B gpio[N_GPIO];
};
Также предположим, что у меня есть две функции, которые будут работать с одной из структур B в A:
bool set_status(gpio g, bool status, int t1, int t2);
bool activate(gpio g, bool active);
Поскольку A загружается вразделяемой памяти, мне нужно вызвать shmget и shmdt в рамках двух функций выше;псевдокод для первой функции должен выглядеть примерно так:
bool set_status(gpio g, bool status, int t1, int t2) {
struct A shm = shmget();
struct B target = shm.gpio[g];
if(target.active) {
bool res = foo1(target, status, t1, t2); //do something on struct B indexed by g
shmdt();
return res;
else
return false;
}
псевдокод для второй функции должен выглядеть примерно так:
bool activate(gpio g, bool active) {
struct A shm = shmget();
struct B target = shm.gpio[g];
if(target.active) {
bool res = foo2(target, active); //do something on struct B indexed by g
shmdt();
return res;
else
return false;
}
Теперь есть способ, которым я могупомешать иметь тот общий код, который управляет shm и проверяет, установлен ли B.active?Для меня это выглядит как декораторы, то есть иметь функцию, которая управляет shm, проверяет B.active и вызывает в ней вторую функцию, но проблема в том, что вторая функция может иметь не уникальную подпись (может иметь другое числопараметров).
Я хотел бы иметь что-то вроде этого:
bool set_status(gpio g, bool status, int t1, int t2) {
return decorator(foo1, g, status, t1, t2); //do something on struct B indexed by g
}
bool activate(gpio g, bool active) {
return decorator(foo2, g, active); //do something on struct B indexed by g
}
таким образом, чтобы декоратор управлял shm и проверял на целевой B.active.
Спасибо!
РЕДАКТИРОВАТЬ: вот минимальный рабочий пример, который вы можете реорганизовать https://github.com/oliviera9/c_decorator