@Tururupark

Как организовать сравнение переменной с элементом массива?

Ардуино аналоговым входом меряет напряжение. Получившееся значение необходимо сравнить с табличным (100 строк) и на основании сравнения присвоить другой переменной соответствующее значение. Пока знаю такой способ сравнения:
float value = (float)analogReag(A1)*5*1000/1024;
int value_int = (int)value_int;
switch(value_int) {
case(4442): 
current = 120;
...

Но что-то мне подсказывает, что такой способ слишком долгий. Можно представить таблицу в виде двумерного массива, но что делать дальше я не знаю. Как сделать так, чтобы измеренное напряжение, сравнивалось с табличным быстро? (без нахождения зависимостей в таблице и написания формул)
int [] [] ={
 {120, 4442}
{121, 4222}
...}
  • Вопрос задан
  • 829 просмотров
Решения вопроса 2
Вы привели фрагмент кода
float value = (float)analogReag(A1)*5*1000/1024;
int value_int = (int)value_int;
switch(value_int) {
case(4442):
current = 120;

Во второй строке ошибка? Должно быть int value_int = (int)value;?
Если да, то зачем интовое значение analogReag переводить во флоат, а потом опять в инт? Разрядность это не увеличит, поэтому можно сделать так:
//Объявли массив table из 1024 значений
//Для каждого значения ввели правильный ответ
int table[] = {12, 34, 64, 33, ..., 954}

//Где-то в коде
int value = analogReag(A1);
current = table[value];

Это уменьшит Вашу таблицу вдвое, выборка будет максимально быстрой. Расплатой послужит некоторая неочевидность заполнения таблицы, т.к. оперировать придется не значением напряжения, а отсчетами АЦП.
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
В общем случае тут нужен бинарный поиск. Задаете вашу таблицу в виде двух массивов. Первый - значения которые вы ищете, второй - ответы для них. Отсортированные по первому массиву.

Бинарным поиском находите в первом массиве индекс значения и выдаете ответ из второго массива по тому же индексу.

Подкручивая бинарный поиск можно округлять искомое значение до табличного вверх или вниз.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AlexSku
не буду отвечать из-за модератора
Двоичное дерево поиска или хэш-таблица.
Хотя 100 пар это ни о чём. Вы время засекали? Вот где-то со 100 тысяч можно уже беспокоиться.
Кстати, и формулу вы зря отбрасываете. Возможно, кубические сплайны вам помогли бы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы