Оптимизация кода
- Войдите на сайт для отправки комментариев
Пт, 20/03/2015 - 19:11
В программировании слабоват.
Есть вот такой кусок рабочего кода.
if(count_LAST == 2) Pos_LAST = Pos2; if(count_LAST == 3) Pos_LAST = Pos3; if(count_LAST == 4) Pos_LAST = Pos4; if(count_LAST == 5) Pos_LAST = Pos5; if(count_LAST == 6) Pos_LAST = Pos6; if(count_LAST == 7) Pos_LAST = Pos7; if(count_LAST == 8) Pos_LAST = Pos8; if(count_LAST == 9) Pos_LAST = Pos9; if(count_LAST == 10) Pos_LAST = Pos10; if(count_LAST == 11) Pos_LAST = Pos11; if(count_LAST == 12) Pos_LAST = Pos12; if(count_LAST == 13) Pos_LAST = Pos13; if(count_LAST == 14) Pos_LAST = Pos14; if(count_LAST == 15) Pos_LAST = Pos15; if(count_LAST == 16) Pos_LAST = Pos16; if(count_LAST == 17) Pos_LAST = Pos17; if(count_LAST == 18) Pos_LAST = Pos18; if(count_LAST == 19) Pos_LAST = Pos19; if(count_LAST == 20) Pos_LAST = Pos20; if(count_LAST == 21) Pos_LAST = Pos21; if(count_LAST == 22) Pos_LAST = Pos22; if(count_LAST == 23) Pos_LAST = Pos23; if(count_LAST == 24) Pos_LAST = Pos24; if(count_LAST == 25) Pos_LAST = Pos25; if(count_LAST == 26) Pos_LAST = Pos26; if(count_LAST == 27) Pos_LAST = Pos27; if(count_LAST == 28) Pos_LAST = Pos28; if(count_LAST == 29) Pos_LAST = Pos29; if(count_LAST == 30) Pos_LAST = Pos30; if(count_LAST == 31) Pos_LAST = Pos31; if(count_LAST == 32) Pos_LAST = Pos32; if(count_LAST == 33) Pos_LAST = Pos33; if(count_LAST == 34) Pos_LAST = Pos34; if(count_LAST == 35) Pos_LAST = Pos35; if(count_LAST == 36) Pos_LAST = Pos36; if(count_LAST == 37) Pos_LAST = Pos37; if(count_LAST == 38) Pos_LAST = Pos38; if(count_LAST == 39) Pos_LAST = Pos39; if(count_LAST == 40) Pos_LAST = Pos40; if(count_LAST == 41) Pos_LAST = Pos41; if(count_LAST == 42) Pos_LAST = Pos42; if(count_LAST == 43) Pos_LAST = Pos43; if(count_LAST == 44) Pos_LAST = Pos44; if(count_LAST == 45) Pos_LAST = Pos45; if(count_LAST == 46) Pos_LAST = Pos46; if(count_LAST == 47) Pos_LAST = Pos47; if(count_LAST == 48) Pos_LAST = Pos48; if(count_LAST == 49) Pos_LAST = Pos49; if(count_LAST == 50) Pos_LAST = Pos50;
Возможно ли сделать запись более короткой?
Можно конечно. Не совсем понятно, что такое эти Pos2, Pos3, и т.д - но в общем всё может выглядеть как-то так:
Зависит от значений Pos*, если есть зависимость, то можно упростить (формализовать) в каком то виде, если нет, то через массив, как уже сказали.
Немного не в кассу. Когда пишите несколько if, лучше писать if... else if... else if... else ; в противном случае у Вас программа будет проходить через все ифы, а оно Вам надо? (риторический). Другой вариант switch. Увы, не помню, что оптимальней, вроде какие то были отличия (switch от if else if else if ; ) или грабли, может кто подскажет.
А зачем в начале массива два нуля?
А зачем в начале массива два нуля?
Ну у вас же вкоде сравнение начинается с двойки
поэтому для первых двух значений - 0 и 1 - оставили "пустые" ячейки.
Как вариант - можно было и без них обойтись. Тогда было бы так:
Другой вариант switch. Увы, не помню, что оптимальней, вроде какие то были отличия (switch от if else if else if ; ) или грабли, может кто подскажет.
Да вряд ли тут кто подскажет. Зависит от конкретных значений в switch, и от конкретного компилятора. И даже от опций заданных при компиляции.
Иногда switch может компилиться в такую же таблицу переходов, а иногда в те же if - else. Не угадаешь. :)
С массивом попробую, а вот такие условия
Навскидку, массив структур, бинарный поиск, функция пересчета. Хотя можно и простым поиском обойтись, значений немного. Если других вариантов не будет, покажу пример.
Это если так, "в лоб", по-простому. В зависимости от реального размера массивов и от требований к скорости - да, можно попробовать что-то как-то оптимизировать.
Удобней объединять в структуру, а не использовать два разных массива, будет меньше ошибок, уж поверьте
Со структурами вообще тёмный лес
Попробую поиграться с массивами
Вот такой вариант со структурой. Не смотри, что много, больше кода для тестирования.
В скетче #8 есть как минимум одна ошибка, выход за пределы массива. Аккуратней.
В скетче #8 есть как минимум одна ошибка, выход за пределы массива. Аккуратней.
Имеете ввиду Servo[ i + 1 ] при достижении максимального значения i
В пример со структурами попробую вникнуть...
В скетче #8 есть как минимум одна ошибка, выход за пределы массива. Аккуратней.
Имеете ввиду Servo[ i + 1 ] при достижении максимального значения i
Ну да, везде, где есть индекс+1
В скетче #8 есть как минимум одна ошибка, выход за пределы массива. Аккуратней.
У меня что ли? А, ну да, есть.
Монитор потому что маленький - десятая серва перенеслась на другую строку, и я её не заметил. :)
Конечно, массивы должны быть одинакового размера, а цикл на единицу короче.
В пример со структурами попробую вникнуть...
Пример рабочий, проверял. Отвечу на вопросы, если понадобится. А нет, так нет :)
Спасибо откликнувшимся.
Решил сначала разобраться с массивами, на будуще однозначно пригодится , да и простыни исписывать не хочется (код уже переделал и костыль с размером массива выскочил, но вроде обошёл его).
Потом полезу в структуры.
Эту простыню записал так
Вроде получилось.
Но есть и такая запись.
Условия работают при разных режимах. Вот их увязать и не получается.
Конечно не катастрофа, но хотелось бы узнать как в данном случае правильно записать.
Пока сложновато, но мне интересно, буду ковыряться...
Сделать одной функцией: sorry, я с мобилы, форматировать сложно, главное - смысл:
addNewPoint()
{
if ( BUTTON_SAVEState == HIGH )
{
Pos[count] = number;
Pos_LAST = Pos[count];
servo[count] = valPot;
BUTTON_SAVEState = LOW;
count++;
}
}
Спасибо за идею.
А вот как эту функцию теперь запускать?
Получается условие в самой функции
Это уж тебе видней, потому что любая задача решается комплексно, а ты даёшь нам кусочки, потому сложно сделать оптимально задачу вцелом.
А вызывать нужно где то в loop, плюс добавить проверку на длину массива, а то count не ограничен. Плюс здесь используются глобальные переменные, что не очень хорошо, плюс это можно не делать функцией, а просто вписать этот код в нужном месте.
На счёт условия внутри функции, вариант от телепата, возвращать условие из функции