реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Оптимизация switch?
Сергей Борщ
сообщение Oct 9 2008, 00:29
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Dog Pawlowa @ Oct 8 2008, 16:12) *
Код
...
#define     stERROR                  7
#define     stLOW_POWER            8
Для упрощения вставки/удаления элементов и исключения дублирования лучше использовать enum:
Код
enum state_t
{
    stINIT = 0,
    ....
    stERROR,
    stLOW_POWER,
};


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 9 2008, 05:23
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ Oct 9 2008, 03:29) *
Для упрощения вставки/удаления элементов и исключения дублирования лучше использовать enum.

Хороший вопрос, необходимость корректировок иногда возникает. Делаю дыры или их забиваю. smile.gif
Конечно, я думал об этом, но к номеру состояния у меня привязаны еще массивы - как минимум массив функций обработки состояния.
То есть все равно при исключении элемента из enum, нужно по имени найти и исключить подобный элемент из другого массива, строго соблюдая порядок. А их сотня. То есть рядом в тексте не расположить.
А здесь я на видимом участке текста вижу все.
Может, как-то макросами можно извратиться - не придумал.
Если подскажете удобный способ, с меня beer.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2008, 07:01
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Dog Pawlowa @ Oct 9 2008, 08:23) *
То есть все равно при исключении элемента из enum, нужно по имени найти и исключить подобный элемент из другого массива, строго соблюдая порядок. А их сотня.
При исключении из #define, скажем, 80-го элемента, вам придется перенумеровать оставшиеся до конца 20, чтобы сохранить непрерывность. А при исключени 2-го вообще будет так: ;( Посмотрите это сообщение ReAl, пройдите по ссылке из него - похоже там то, что вам подойдет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 9 2008, 08:24
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ Oct 9 2008, 10:01) *
При исключении из #define, скажем, 80-го элемента, вам придется перенумеровать оставшиеся до конца 20, чтобы сохранить непрерывность. А при исключени 2-го вообще будет так: ;( Посмотрите это сообщение ReAl, пройдите по ссылке из него - похоже там то, что вам подойдет.

За ссылку спасибо, изучу.
На самом деле исключать вовсе не обязательно, поскольку непрерывность нужна только для состояний прибора, выбираемых из меню со скроллингом. Такие меню у меня содержат до 15 строчек, что не очень смертельно. Бывает, заказчик просит перетасовать пункты в меню, вот тогда да, обезьянья работа... Все остальные состояния выбираются явно, типа:
if (MIN_VOLTAGE>voltage) state=stLOW_VOLTAGE.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
shasik
сообщение Oct 10 2008, 18:09
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(Dog Pawlowa @ Oct 8 2008, 16:12) *
Код
  function[state]();

Небольшая модификация предложенного Dog Pawlowa.
Исходная ситуация: код команды - 1 байт, всего используемых команд около - 40.
Решение: массив указателей на функции-обработчики для каждой возможной команды (длина массива 256). Для "нереализованных" команд просто вызывается функция-заглушка. Т.е. то, что предложил Dog Pawlowa

Наш Всевышний и Генеральный решил, что отныне код команды будет 2 байта, при этом, естественно, не все команды будут реализованы.
Прикинул я сколько займет теперь массив указателей, и понял что "это ж весь мой рост", в смысле память. Теперь делаю так:
Код
index = binary_search(state, StateArr);
FunctionArr[index]();

Массив StateArr, естественно, отсортирован (у меня по возрастанию). Когда юзвер добавляет очередную команду, то добаляем в массив StateArr очередной "идентификатор команды", а в FunctionArr адрес обработчика этой команды. После чего сортируем массив StateArr, при этом синхронно тасуется и массив FunctionArr. Процедура добавления новой команды некритична ко времени.
На данный момент максимально возможное количество команд пользователя 2048. Проверяли худший случай, работает шустро.
Замечание: когда команд немного (10-20), то быстрее оказался простой линейный просмотр массива StateArr, чем binary_search.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01634 секунд с 7
ELECTRONIX ©2004-2016