Юрий_СВ (09.07.2012 05:13, просмотров: 270) ответил Лeoнид Ивaнoвич на Да не будет короче, даже если применить извраты. Хотя на оверхед в последнее время иду осознанно, это меньшее зло по сравнению с глюкавой программой.
Возможно, на примере будет нагляднее >> Пример из жизни. (использую на Мега64)
Есть 4 канала АЦП.
В разных режимах для каждого канала используются разные функции.
(названия функций изменены)
PROGMEM FN_PTR dsp_fn_tab[MODE_AM][CH_AM] =
{ // CH_A CH_B CH_C CH_D
{ fn_a1, fn_b1, fn_c1, fn_d1 }, // MODE_1
{ fn_a1, fn_b1, fn_c1, fn_d1 }, // MODE_2
{ fn_a1, fn_b1, fn_c1, fn_d1 }, // MODE_3
{ fn_a1, fn_b1, fn_c1, fn_d1 }, // MODE_4
{ fn_a1, fn_b1, fn_c1, fn_d1 }, // MODE_5
{ fn_a1, fn_b1, fn_c1, fn_d1 } // MODE_6
};
do {
fn func;
func=(fn)pgm_read_ptr(&dsp_fn_tab[mode][ch_num]);
if (func) func();
} while(0);
Утверждаю, что этот способ :
- даёт наименьшие затраты процессорного времени (*)
- даёт одинаковые затраты процессорного времени для любого варианта
- имеет самый короткий код
- наилучший в читабельности и отладке (т.е. по "неглюкавости")
- изменяется проще некуда
* - за исключением первых 2-4 пунктов из 24(!)
=====================================================
О меню.
Для себя ограничился 8-мю уровнями по 16 пунктов. Мне хватает.
(уровней на 5 и до пунктов 12 использую точно)
Один раз отладка примитивов. Дальше - одно удовольствие.
(вбросить пункт, н-р, просто для отладки - минута дела)
Пункт всегда имеет одинаковый формат. Добавит/убрать - раз плюнуть.
// Подсказка Название Указатель Параметр Свойства
{volume_h02, volume_c02, recalc_volume, C8_VOL_KEY, MIP_C8_FS0}, //
Даже представить такое со switch - жутковато :
- по размеру кода
- по читабельности
- по трудозатратам на изменения
А теперь представим, что прибор имет несколько модификаций (отличия в меню)...
У меня их несколько.