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

 
 
> Оптимизация switch?
1eXX
сообщение Oct 7 2008, 18:39
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298



Привет народ!
Посоветуйте, как можно создать таблицу переходов для оптимизации switch (case-ов за сотню)?
"__even_in_range" в данном случае не очень универсален и ограничен 30 переходами.
Заранее благодарен за любую идею.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
1eXX
сообщение Oct 8 2008, 11:58
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298



Цитата(Dog Pawlowa @ Oct 8 2008, 15:22) *
Я сам создаю таблицу при количестве case'ов больше десятка.
Все равно код становится длинным и нечитаемым.
Каким образом вы создаете таблицу, можете поведать?
Если он выполняется быстрее, то пускай он длинный и нечитаемый, для моего случая это не критично.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 8 2008, 13:12
Сообщение #3


Гуру
******

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



Цитата(1eXX @ Oct 8 2008, 14:58) *
Каким образом вы создаете таблицу, можете поведать?
Если он выполняется быстрее, то пускай он длинный и нечитаемый, для моего случая это не критично.

Примитивноsmile.gif

//определения аргументов case, имен функций, и текста для вывода в одном месте
Код
...
#define     stERROR                  7
#define      nm7               "Error"
#define   F7                fError
    
#define     stLOW_POWER            8
#define    nm8e               "Low power"
#define   nm8g               "Unterspannung"
#define   F8                fLowPower
...

// массив функций
const VECTORS function[stQty] =
Код
{  f0,  f1,  f2,  f3,  f4,  f5,  f6,  f7,  f8,  f9...f103   };


//собственно "switch" в теле программы
Код
  function[state]();


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


Местный
***

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- 1eXX   Оптимизация switch?   Oct 7 2008, 18:39
- - plombir   Попробуйте таблицей (массивом во flash) указателей...   Oct 8 2008, 04:09
- - Rst7   Чето вопрос не совсем ясен. IAR при больших свичах...   Oct 8 2008, 05:23
- - MrYuran   Цитата(1eXX @ Oct 7 2008, 22:39) "__...   Oct 8 2008, 05:27
- - 1eXX   Цитата(plombir @ Oct 8 2008, 08:09) А вот...   Oct 8 2008, 07:52
|- - IgorKossak   Цитата(1eXX @ Oct 8 2008, 10:52) ...а у м...   Oct 8 2008, 08:06
|- - Dog Pawlowa   Цитата(1eXX @ Oct 8 2008, 10:52) А какая ...   Oct 8 2008, 11:22
|- - prottoss   Цитата(1eXX @ Oct 8 2008, 15:52) а у меня...   Oct 8 2008, 12:23
- - MrYuran   По-моему, switch-case в любом случае преобразуется...   Oct 8 2008, 08:04
- - 1eXX   Похоже одновременно изящного и эффективного решени...   Oct 8 2008, 09:49
|- - prottoss   Цитата(1eXX @ Oct 8 2008, 17:49) Похоже о...   Oct 8 2008, 10:51
|- - Сергей Борщ   Цитата(Dog Pawlowa @ Oct 8 2008, 16:12) К...   Oct 9 2008, 00:29
||- - Dog Pawlowa   Цитата(Сергей Борщ @ Oct 9 2008, 03:29) Д...   Oct 9 2008, 05:23
||- - Сергей Борщ   Цитата(Dog Pawlowa @ Oct 9 2008, 08:23) Т...   Oct 9 2008, 07:01
||- - Dog Pawlowa   Цитата(Сергей Борщ @ Oct 9 2008, 10:01) П...   Oct 9 2008, 08:24
- - 1eXX   Самое яблочко, Дог :beer:   Oct 8 2008, 17:42
- - Dog Pawlowa   Цитата(1eXX @ Oct 8 2008, 20:42) Самое яб...   Oct 8 2008, 18:02


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

 


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


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