Как сократить код?
- Войдите на сайт для отправки комментариев
Чт, 11/06/2015 - 10:32
Имеется код (мигание светодиода по типу сердца:
int i; int LED = 10; void setup() { pinMode (LED, OUTPUT); } void loop() { for (i = 50; i < 255; i=i+15) { analogWrite(LED,i); delay(50); } for (i=255; i > 80; i=i-30) { analogWrite(LED,i); delay(50); } for (i=80; i < 255; i=i+15) { analogWrite(LED,i); delay(50); } for (i=255; i > 50; i=i-10) { analogWrite(LED,i); delay(50); } delay(300); }
Писал в меру своих знаний, хочу узнать можно ли написать его еще короче?
Поделить на ноль?
других вариантов нет?))
других вариантов нет?))
А зачем?
Ради спортивного интереса. Я только учусь, потому хотелось бы знать)
Ради спортивного интереса. Я только учусь, потому хотелось бы знать)
Ну тогда гребите в сторону ассемблера.
Ради спортивного интереса. Я только учусь, потому хотелось бы знать)
Все короче ясно с вами тут. Другого ответа и не ожидал услышать
Сократить код можно, но памяти он будет поедать больше и будет более неповоротливый и сложный для прочтения.
Почитайте Функции
С нами тут все ясно. :)
Можно еще компактней и без функций. С использованием массива.
Почитайте Функции
Спасибо, буду читать)
Можно еще компактней и без функций. С использованием массива.
Ок, буду смотреть и в этом направлении
Вы в теме не дали ни одного дельного ответа. Я не сомневаюсь, что ваши знания в этой области обширней, но это не повод ерничать.
Вашу задачу можно упростить примерно так:
Не знаю какая у вас ардуинка, мнемоники регистров могут отличаться. Надо смотреть точнее или делать свои макросы с типовыми названиями функций из "wiring"
Вашу задачу можно упростить примерно так:
Во-первых, ваш пример даже не скомпилируется из-за синтаксических ошибок.
Во-вторых, ваш пример будет работать некорректно, потому как вам нужно изучить раздел типы данных,
unsigned
char
не принимает отрицательные значения, а точнее примет но -10 превратится в 246. Так же будет работать некорректно потому, что например, условие i < end[j] при i = 255 и end[j] = 80 то есть 255 < 80 будет истинно до начала выполнения цикла.И в-третих, а захочу вывод поменять на 6, где здесь упрощение?
Конечно некорректно. Иначе его бы снесли минут в 5 как и предыдущие посты. :)
Можете исправить ошибки (это вовсе не трудно), например тупо убрать unsigned (char станет signed), а цикл по i можете изменить на такой:
Как понимаю, задача была показать КАК можно уменьшить... :)
А чтобы легко можно было "поменять" - заменяйте Arduino.h на что-то более вменяемое и пользуйтесь типовым pinMode() и analogWrite() :)
Можно ещё упростить, если убрать условную проверку из второго цикла и вместо трех массивов сделать 2 при "последовательном проходе". Заметьте, что starts[] и ends[] регулярно повторяются... (предыдущий конец становится следующим началом) :)
Сокращать можно вплость до асм-вставки, только вот ТС этим не сможет пользоваться от непонимания что откуда берется.
например тупо убрать unsigned (char станет signed)
И все же перейдите по ссылке выше и посмотрите какие типы какие значения могут принимать.
:) Ну ещё раз... это пример КАК можно упростить. То бишь "идеи":
1. Незачем повторять код, когда его можно обрамить внешним циклом;
2. "разные" данные для повторов можно хранить в памяти (и не обязательно вот так в массивах...);
3. Ну и замена больших функций на команды.
А далее, если автор захочет думать "почто не заработало" - ознакомится. Заодно и поправит. Желание разобраться - у него явно есть ... или было.
:) Ну ещё раз... это пример КАК можно упростить. То бишь "идеи":
1. Незачем повторять код, когда его можно обрамить внешним циклом;
2. "разные" данные для повторов можно хранить в памяти (и не обязательно вот так в массивах...);
3. Ну и замена больших функций на команды.
А далее, если автор захочет думать "почто не заработало" - ознакомится. Заодно и поправит. Желание разобраться - у него явно есть ... или было.
Есть, просто много информации сразу. Надо все это переварить))
Да, её много. И проблема в том, что вам, как и мне, никто её на блюдечке не поднесет, особенно тут. Смотрите исходники, не бойтесь. Не боги горшки обжигают. Я разобрался и сделал свой Arduino.h, wiring.c, wiring_analog.c и кое-что ещё ... примерно за полторы недели по 2-3 часа в день "после работы".
Вы сможете тоже. Для начала найдите библиотеку Cyberlib.h, скачайте, разберитесь. потом посмотрите темы тут по тегу Attiny13 и разного рода примеры " ... без delay()". Ну и ещё надо помнить о том, что сборка скетча в "итого" делается силами компилятора ( а вовсе не Arduino IDE! ) avr-gcc. И про много чего он "сам знает".
Да, её много. И проблема в том, что вам, как и мне, никто её на блюдечке не поднесет, особенно тут. Смотрите исходники, не бойтесь. Не боги горшки обжигают. Я разобрался и сделал свой Arduino.h, wiring.c, wiring_analog.c и кое-что ещё ... примерно за полторы недели по 2-3 часа в день "после работы".
Вы сможете тоже. Для начала найдите библиотеку Cyberlib.h, скачайте, разберитесь. потом посмотрите темы тут по тегу Attiny13 и разного рода примеры " ... без delay()". Ну и ещё надо помнить о том, что сборка скетча в "итого" делается силами компилятора ( а вовсе не Arduino IDE! ) avr-gcc. И про много чего он "сам знает".
Спасибо, будем разбираться)
И все же перейдите по ссылке выше и посмотрите какие типы какие значения могут принимать.
Максим, товарищ сделал второй акаунт, сам спрашивает, сам отвечает. Попутно расказывая как он написал свой компилятор за полторы недели. :)
ТС-у. Вот примерно так сокращается код БЕЗ Wiring:
А это с wiring:
Имеем 868 байт кода против 1974 байта. А так, все вроде очень даже "похоже" на оригинал.
P.S. можно ещё уменьшить на размер мат. библиотеки. Тут используется длинное беззнаковое умножение. Компилять через сдивиги было уже лениво. Судя по линковщику, это больше сотни байт... :)
А это вывод препроцессора "содержательной части" скетча. :)
tagir000, не совсем понятна цель сокращения текста кода. Может интереснее от delay'ев избавиться, чтобы Ваше мигание весь процессор не загружало? Будет выигрыш по ресурсам. а от сокращения текста какой выигрыш? Видимость одна.