Как я могу сделать мой текущий код эффективным, избегая условий if-else?
- Язык программирования: C
- Платформа: PIC Микроконтроллер 8-битный
- Количество проблем: 2
Я использую 4-значный 7-сегментный дисплей для отображения чисел. У меня есть несколько функций, которые отображают некоторые буквы / цифры на 7-сегментном, как:
zero() // displays 0 on the 7-segment.
one() // displays 1 on the 7-segment.
two() // displays 2 on the 7-segment.
...
Теперь у меня есть номер (скажем, 1435) для отображения на 7-сегментном дисплее. Мой текущий алгоритм выглядит следующим образом:
Извлеките отдельные цифры из числа 1435 (это отдельные цифры как 1, 4, 3, 5). ДСН
- 1 будет отображаться до цифры 17-сегментного.
- 4 будет отображаться до цифры 2 7-сегментного.
- 3 будет отображаться до цифры 3 7-сегментного.
- 5 будет отображаться в цифре 4 7-сегментного.
Чтобы отобразить эти отдельные цифры, я использую десять условий if-else, как указано ниже:
- Если отображаемая цифра == 0 ->, запустите функцию zero(); еще
- Если отображаемая цифра == 1 ->, запустите функцию one(); еще
- Если отображаемая цифра == 2 ->, запустите функцию two ();
- ...
- ...
- ...
Таким образом, эта реализация (для числа 1435) для печати запускает несколько проверок if-else.
- 2 проверки для отображения цифры 1
- 5 проверок для отображения цифры 4
- 4 проверки для отображения цифры 3
- 6 проверок для отображения цифры 5
- Всего 17 проверок, которые выполняются "периодически и без необходимости" в функции loop(), даже если число не изменилось (это проблема № 1).
Проблема № 2: Эта реализация неэффективна, так как, когда мне нужно увеличить / уменьшить это число (от 1435 до 1436, затем до 1437 и т. Д.), Число проверок if-else также изменяется, поэтому изменение чисел не является плавным. Это означает, что, поскольку '0' является первым в проверках if-else, оно отображается быстро. С другой стороны, "9" является последним в проверках if-else, поэтому он должен пройти десять проверок, прежде чем отобразится. Это делает реализацию намного медленнее, так как отображаемая цифра увеличивается от 0 до 9. Как реализовать для решения двух проблем?
Заранее спасибо.
1 ответ
Вы можете использовать указатели на функции в таблице:
typedef void (*func)(); // type for functions
func functions[] = { zero, one, two, three, ... }
functions[3](); // example, will call three()
Вы должны извлечь нужную цифру и использовать ее в качестве индекса в таблице....