Предположим, что вы встроенный программист. Теперь у вас есть часть аппаратного обеспечения с обменными модулями. С каждым модулем вы должны общаться по-разному, т.е. вы начинаете/читаете/пишите в/из него по-разному.
Теперь у вас есть программное обеспечение, которое должно обрабатывать все эти типы модулей. У вас есть 3 процедуры (упрощенные здесь) для инициализации, чтения, записи каждого типа модуля (HW0 - модуль A, HW1 - модуль B).
void HW0_init() { printf("HW0_init\n"); }
void HW0_read() { printf("HW0_read\n"); }
void HW0_write(){ printf("HW0_write\n"); }
void HW1_init() { printf("HW1_init\n"); }
void HW1_read() { printf("HW1_read\n"); }
void HW1_write(){ printf("HW1_write\n"); }
Теперь представьте, что вы хотите, чтобы инициализировать Ваш модуль и прочитать н от него, так что вы делаете:
int hw_id = 1;
// want to init hardware
switch(hw_id)
{
case 0: HW0_init(); break;
case 1: HW1_init(); break;
// ...
}
// now I want to read
switch(hw_id)
{
case 0: HW0_read(); break;
case 1: HW1_read(); break;
// ...
}
Это может быть сделано по-разному с помощью указателей на массивы. Если объявлять массивы указателей на ваши функции следующим образом:
// as many arrays as you have modules
void (*hw0[3])() = { HW0_init, HW0_read, HW0_write };
void (*hw1[3])() = { HW1_init, HW1_read, HW1_write };
ваш код может быть упрощена следующим образом:
enum HW_ACTION
{
HW_INIT = 0,
HW_READ = 1,
HW_WRITE = 2
};
// pointer to array of pointers to funcs taking nothing
// and returning nothing
void (*(*f)[3])(void);
// detect hardware and set 'f'
f = &hw1;
(*f)[HW_INIT](); // same as HW1_init(); <=> hw1[HW_INIT]();
(*f)[HW_READ](); // same as HW1_read(); <=> hw1[HW_READ]();
Тот же эффект - «легкий код».
Вы можете рассматривать его как poor's man virtual methods
для пользователей C, не имеющих компилятор C++, где обычно создать базовый абстрактный класс с init
, read
, write
методов и их реализации для каждого вида модуля.
Реальная жизнь здесь http://en.wikipedia.org/wiki/Virtual_method_table.
«Нужна» - такое смешное слово. Я не могу придумать, когда я, возможно, использовал его. –