Много одинаковых строк в скетче
- Войдите на сайт для отправки комментариев
Втр, 26/06/2018 - 09:29
Здравствуйте, подскажите пожалуйста, кто как борется с одинаковыми блоками кода? допустим есть такие строки :
if (hand_brake_if_plus == 1) { if ((analogRead(HAND_BRAKE_IN) > HAND_BRAKE_ON ) && (ruchnaya_kpp == 0) ) //без ручника не делаем запуск { rucnik_OFF = 0; do_shutdown(); actual_mode = 1; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны if (razriv == 0) { sms_esli_stoit_na_skorosti(); razriv = 1; } return; } else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск { rucnik_OFF = 0; do_shutdown(); actual_mode = 1; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны if (razriv == 0) { sms_esli_stoit_na_skorosti(); razriv = 1; } return; } } else if (hand_brake_if_plus == 0) { if ((analogRead(HAND_BRAKE_IN) <= HAND_BRAKE_ON ) && (ruchnaya_kpp == 0)) //без ручника не делаем запуск { rucnik_OFF = 0; do_shutdown(); actual_mode = 1; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны if (razriv == 0) { sms_esli_stoit_na_skorosti(); razriv = 1; } return; } else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск { rucnik_OFF = 0; do_shutdown(); actual_mode = 1; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны if (razriv == 0) { sms_esli_stoit_na_skorosti(); razriv = 1; } return; } }
я вывел одинаковые строки в отдельную функцию:
void had_brake_proverka() { rucnik_OFF = 0; do_shutdown(); actual_mode = 1; // заканчиваем попытки запустить движок left_start_try = 0; //без ручника другие попытки бесполезны if (razriv == 0) { sms_esli_stoit_na_skorosti(); razriv = 1; } } if (hand_brake_if_plus == 1) { if ((analogRead(HAND_BRAKE_IN) > HAND_BRAKE_ON ) && (ruchnaya_kpp == 0) ) //без ручника не делаем запуск { had_brake_proverka(); return; } else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск { had_brake_proverka(); return; } } else if (hand_brake_if_plus == 0) { if ((analogRead(HAND_BRAKE_IN) <= HAND_BRAKE_ON ) && (ruchnaya_kpp == 0)) //без ручника не делаем запуск { had_brake_proverka(); return; } else if ( (ruchnaya_kpp == 1) && (log_netral_gotov == 0)) //без ручника не делаем запуск { had_brake_proverka(); return; } }
так вот, у меня в скетче очень много таких моментов повторения, как их найти попроще, вручную перебирать весь код долговато, думаю есть проще решение но пока найти не могу.
ЗЫ: пока нашел только решенеие переносить в excel и там делать форматирование, но не очень точно он это делает, спасибо за помощь
просто надо добавить еще функционала, а памяти в 328 не хватает(( нужна оптимизация, пока хочу добиться вот такими сокращениями. строк кода
d13lider, такие вещи еще при этапе создания программы надо оформлять в виде функций. Это должно быть на уровне инстинктов - если какой-то код много раз повторяется - значит надо переписывать. И не только тот, где повторы "один в один" - но и те, в которых, к примеру, меняется одна-две строки из десяика..
Как это можно делать автоматически - не знаю. Смотришь программу и находишь похожие куски... Сколько у вас кода-то, что вам какие-то средства нужны? В Ардуине, вроде, места немного :)
От кода голова закружилась.
Однако, если код повторяется и фрагменты рядом, то что мешает написать условие подлиннее, к примеру, а лишние куски почикать?
да если бы я знал когда начинал))) да кода не много 2700 строк.
"И не только тот, где повторы "один в один" - но и те, в которых, к примеру, меняется одна-две строки из десяика.."
да вы правы... надо полностью перелопатить код... стараюсь, оптимизирую, уже почти все что надо засунул, памяти на 86% думаю прям 10-ти еще не хватит. если не оптимизировать...
да если бы я знал когда начинал))) да когда не много 2700 строк.
Обычный пусть самурая.
Мне стало любопытно.
d13lider, можно скетч полностью?
можно скетч полностью?
не, мне стыдно))) как доделаю так и выложу))
да если бы я знал когда начинал))) да когда не много 2700 строк.
что надо засунул, памяти на 86% думаю прям 10-ти еще не хватит. если не оптимизировать...
2700 строк в Атмегу 328 - ого! Наверно это означает, что код у вас очень "рыхлый" и оптимизатор сам убирает повторы и одинаковые куски...
2700 строк в Атмегу 328 - ого! Наверно это означает, что код у вас очень "рыхлый" и оптимизатор сам убирает повторы и одинаковые куски...
он так умеет? а то я сжимаю ткаим образом код, и память уменьшается. да 2700 строк вместе со скобками)
2700 строк в Атмегу 328 - ого! Наверно это означает, что код у вас очень "рыхлый" и оптимизатор сам убирает повторы и одинаковые куски...
убрал сейчас все скобки и пробелы в экселе, получилось 1942 строки)
убрал сейчас все скобки и пробелы в экселе, получилось 1942 строки)
ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)
ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)
я делаю автосигнализацию полноценную, работа от телефона и брелка, если инетерсно ниже прикрепил инструкцию как это работает, есть там контроль: генератора, ручника, дверей, капота, багажника, датчика удара(2 уровня). задержка перед постановкой на охрану, на выходы: сирена, поворотники, зажигание 1, зажигание 2, стартер, иммобилайзер, открытие дверей, закрытие дверей, доп реле для блокировки двигателя.
https://yadi.sk/i/OTreOL3m3YQaMc
А скобки с пробелами-то за что? Они .hex не увеличивают. Оптимизировать нужно именно код, а не оформление.
b707, думаю, что если прошерстить исходник ТС, то там 250 строк и останется...
А скобки с пробелами-то за что? Они .hex не увеличивают. Оптимизировать нужно именно код, а не оформление.
b707, думаю, что если прошерстить исходник ТС, то там 250 строк и останется...
да скобки убрал что бы узнать сколько именно "полезной" информации в коде, а 250 строк - это врятли, функционала много...
Ну, положим, если весь код как в приведенном фрагменте, то треть-четверть и останется где-то. А если делать квонокод, то и половина!
а 250 строк - это врятли, функционала много...
про 250 строк - это шутка была :) Работа с модемом, как у вас - это реально очень много кода, если писать все правильно, с ожиданием ответов модема и проверкой возвращаемых значений.
Ну, положим, если весь код как в приведенном фрагменте, то треть-четверть и останется где-то. А если делать квонокод, то и половина!
процентов 10 такого кода. остальное не совпадает
про 250 строк - это шутка была :) Работа с модемом, как у вас - это реально очень много кода, если писать все правильно, с ожиданием ответов модема и проверкой возвращаемых значений.
да, жду ответы, проверяю овтеты на ошибки, но все равно не могу до конца оптимизировать, что бы 100% приходила информация правильная от модема... ка буд-то другой код мешает принимать по среиал, но с этой проблемой я разберусь))) не в этом сейчас вопрос
Мужики,
ну, бороться-то надо не со строками. Причём тут строки? У меня вот есть инклудка для делителей и количества тиков таймеров - 370 строк, и чего? Кода она не генерит вообще никакого, всё что от неё остаётся после работы препроцессора - это объявление констант типа
Под любую частоту или период (а заодно и под любую тактовую) у меня в программе автоматически появляются готовые константы для настройки таймера и не надо их вычислять во время выполнения, тратя на это время и память программы.
И кому эти 370 строк мешают?
ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)
Слабак :) 124264 строки по статистике гитхаба, это не считая других частей проекта.
Мужики,
ну, бороться-то надо не со строками. Причём тут строки? У меня вот есть инклудка для делителей и количества тиков таймеров - 370 строк, и чего? Кода она не генерит вообще никакого, всё что от неё остаётся после работы препроцессора - это объявление констант типа
Под любую частоту или период (а заодно и под любую тактовую) у меня в программе автоматически появляются готовые константы для настройки таймера и не надо их вычислять во время выполнения, тратя на это время и память программы.
И кому эти 370 строк мешают?
согласен, когда универсальность заключается в программе, но вот у меня допустим увеличился код в 2 раза за счет того что бы определять полярность входа(автоматический), допустим у машин есть 2 значения открытых дверей, на одних плюс появляется на концевике, на других минус. и вот препроцессором это никак не сделать, или я что то недопонимаю? вот и приходится пилить кучу условий для каждого варианта, что бы не использовать 2 ноги контроллера, а всего лишь одну
Мужики,
ну, бороться-то надо не со строками. Причём тут строки? У меня вот есть инклудка для делителей и количества тиков таймеров - 370 строк, и чего? Кода она не генерит вообще никакого, всё что от неё остаётся после работы препроцессора - это объявление констант типа
Под любую частоту или период (а заодно и под любую тактовую) у меня в программе автоматически появляются готовые константы для настройки таймера и не надо их вычислять во время выполнения, тратя на это время и память программы.
И кому эти 370 строк мешают?
согласен, когда универсальность заключается в программе, но вот у меня допустим увеличился код в 2 раза за счет того что бы определять полярность входа(автоматический), допустим у машин есть 2 значения открытых дверей, на одних плюс появляется на концевике, на других минус. и вот препроцессором это никак не сделать, или я что то недопонимаю? вот и приходится пилить кучу условий для каждого варианта, что бы не использовать 2 ноги контроллера, а всего лишь одну
А может проще сигнал ИВЕРТИРЕВАТЬ
.... допустим у машин есть 2 значения открытых дверей, на одних плюс появляется на концевике, на других минус. и вот препроцессором это никак не сделать, или я что то недопонимаю?
почитайте условная компиляция , подойдет она или нет зависит от того, какую задачу вы ставите перед собой
А может проще сигнал ИВЕРТИРЕВАТЬ
там не жесткая 0 и 1-ца, там подается на аналоговый вход значиение 300-400 попугаев это может быть 0, а может быть и 700 это 0, как допустим чтение генератора, на некоторых машинах при заведеном двигателе не 1023 значение, диод и резистор в схеме выдает только 900 и при включеном зажигании 800, т.е. зажигание включено(двигатель заглушен) значение 800, завели двиг стало 900, но это каждая машина универсальна, на ВАЗ это значение 1023 на фольцвагене у меня 700 при заведенном, на BYD у друга при заведенном звигателе 500 и заглушенном 800. поэтому нельзя просто сигнал ИНВЕРТИРОВАТЬ
почитайте условная компиляция , подойдет она или нет зависит от того, какую задачу вы ставите перед собой
спасибо, почитаю
А может проще сигнал ИВЕРТИРЕВАТЬ
там не жесткая 0 и 1-ца, там подается на аналоговый вход значиение 300-400 попугаев это может быть 0, а может быть и 700 это 0, как допустим чтение генератора, на некоторых машинах при заведеном двигателе не 1023 значение, диод и резистор в схеме выдает только 900 и при включеном зажигании 800, т.е. зажигание включено(двигатель заглушен) значение 800, завели двиг стало 900, но это каждая машина универсальна, на ВАЗ это значение 1023 на фольцвагене у меня 700 при заведенном, на BYD у друга при заведенном звигателе 500 и заглушенном 800. поэтому нельзя просто сигнал ИНВЕРТИРОВАТЬ
Понял но Вы писали (допустим у машин есть 2 значения открытых дверей, на одних плюс появляется на концевике, на других минус.) поэтому я так и решил!
убрал сейчас все скобки и пробелы в экселе, получилось 1942 строки)
ну не знаю :) Мой самый больщой ардуино проект до сегодняшнего дня - 470 строк :) И это реально большая программа :) Типичный мой скетч - 200-250 строк :)
Да уж...
Воистину - не только существо проектов, но даже подход к ним сугубо индивидуален.
Вспомеил Ваш ответ "разве что при создании макета я больше времени трачу на железо, чем на софт" : http://arduino.ru/forum/obshchii/kto-s-kakoi-skorostyu-pretvoryaet-v-zhizn-proekt#comment-369645
Выясняется, что у нас просто разный подход к соотношению "железа" и "софта": для меня обычный проект - это несколько десятков файлов, минимум несколько из которых больше упомянутых 470 строк каждый.
Правда, для реализации проектов, как правило, используется Мега2560 или Дуэ. Иногда в одном проекте используется более одного контроллера.