Как я могу сделать мой текущий код эффективным, избегая условий 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-сегментном дисплее. Мой текущий алгоритм выглядит следующим образом:

  1. Извлеките отдельные цифры из числа 1435 (это отдельные цифры как 1, 4, 3, 5). ДСН

    • 1 будет отображаться до цифры 17-сегментного.
    • 4 будет отображаться до цифры 2 7-сегментного.
    • 3 будет отображаться до цифры 3 7-сегментного.
    • 5 будет отображаться в цифре 4 7-сегментного.
  2. Чтобы отобразить эти отдельные цифры, я использую десять условий 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()

Вы должны извлечь нужную цифру и использовать ее в качестве индекса в таблице....

Другие вопросы по тегам