Работа со строкой(String)
- Войдите на сайт для отправки комментариев
Втр, 12/12/2017 - 13:34
Всем доброго времени суток. Решил по практиковаться на Ардунке и придумал сделать RGB лампочку которая управляется по слову (Green,Blue,Red и т.д). Но программа работает не так-как бы мне хотелось!
String Color; //Цвет void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0){ Color = Serial.readString();// считываем инфу с порта Serial.println(Color); if(Color == "green" || "Green"){ Serial.println("Green"); } if(Color == "red" || "Red"){ Serial.println("Red"); } if(Color == "blue" || "Blue"){ Serial.println("Blue"); } } }
Если в порт попадает любая информация она воспринемается как "Истинное", тоесть все условия логических операторов if исполняются по порядку. А это не то что я хотел, поэтому я открыт к вашим замечяниям и предолжениям.
if
(Color ==
"green"
||
Color ==
"Green"
)
Мне аж стыдно стало... Спасибо !!!
А ежели сдуру всё прописными буквами введёте? Типа капс нажат? Не проще ли в строке №8 написать
и после этого уже не париться, и всегда сравнивать только со словами, записанными только строчными буквами.
А ежели сдуру всё прописными буквами введёте? Типа капс нажат? Не проще ли в строке №8 написать .toLowerCase() и после этого уже не париться, и всегда сравнивать только со словами, записанными только строчными буквами.
А можно вообще не париться регистром - ни входных строк, ни парметров сравнения - а просто использовать функцию strcasecmp()
Класс String - наше фсё!!! Ничто другое так скетч не угробит! :)))
Евгений, ну зачем же так на String? Она проста и понятна, а когда памяти не будет хватать человек освоит char* char[] и иже с ним :-)
Ну так то да, я сейчас пытаюсь от String отказаться это как серпом по бубенцам :-)
Ну так то да, я сейчас пытаюсь от String отказаться это как серпом по бубенцам :-)
Если сразу не пользоваться String - и отказываться не придется.
И зачем вообще начинать? Чем String так хорош? - в моих скетчах его нет
Если сразу не пользоваться String - и отказываться не придется.
И зачем вообще начинать? Чем String так хорош? - в моих скетчах его нет
Согласен, Но это как с ручки на автомат пересаживаться, просто привычка. Я вот поезжу на ручке дня 4, потом на автомате постоянно но переключалку хватаюсь и сцепление ищу :-)
Тут так же, новичку со Stirng проще так как все собранно в одном классе, и сравнение и поиск и копирование и преобразование, не надо искать массу функций типа strlen() strcpy() strcat() и тд.
Извеняюсь но ваш вариант не очень хорошо работает
Вот такая ошибка всплывает "exit status 1 no match for 'operator=' (operand types are 'String' and 'void')"
Извеняюсь но ваш вариант не очень хорошо работает
Вот такая ошибка всплывает "exit status 1 no match for 'operator=' (operand types are 'String' and 'void')"
Во, блин, а он и впрямь void возвращает! Обкурились, когда писали :))) Ну, запишите с void, какая разница
Зачем? Я вот не отказываюсь, когда это адекватно ситуации, то пользуюсь за милую душу.
Другое дело, это сложный объект и надо уметь им польхзоваться и понимать что реально стоит за теми или иными операциями, а новички часто думают, что в сказку попали :)
Я вообще не считаю нужным от чего-либо отказываться (настоящие мужчины не стесняются использовать goto!!!). Есть ящик с инструментами и, если из него что-то выкинуть, возможности по работе от этого, ну никак не увеличатся.
А вот char* - совсем простой обект, помнить всякой хни не надо достаточно стандартных функций, он адекватный в любой ситуации. И возможности при его использовании увеличиваются, ЕвгенийП фигню пишет. Например те две строки в #10 у стринга потребуют несколько циклов прохода по строке символов, а при работе с char* и прием с сириала и преобразование легко делается в одном цикле.
ПС. Идея ТС хранить цвета строками в стринге - бред бухой сивой кобылы упавшей с луны на кактус. Запомните, никогда так не делайте, даже если сильно угрожать или пытать будут.
Logic, фигню пишете Вы. Всякий инструмент полезен, когда его применяют по назначению и правильно. Если Вы с этим не согласны, и считаете, что какие-то инструменты нужно просто выбросить .... ну, это не первая глупость, которую я от Вас читаю.
Хватит флудить, по сути пишите. Вечный срач разводите. Не строки кода, ни проект, хотя пардонте, есть тут одна строка ваша, только компилится с ошибкой. Вам и каменный топор видать полезен, а мы уж както без него.
Вот так-то лучше. Пожалуйста и впредь придерживайтесь той же линии.
гы! Логик, на 8-ми ядерном компе с 16гигами ОЗУ вы тоже не станете, как я понимаю - из принципа, пользоваться чем-то 4ого поколения (на выбор: perl, ruby, python, c#), а станете писать на "честном С"? Даже какой-нить интерфейс к ком порту, клаве и MySQL, так? ;) ;) ;)
===============
Ничего личного, просто троллю.
Честно говоря, что матмодель какого-нить DDS генератора я , конечно, напишу на Питоне и нарисую даже не в PyQT, а в простом TKinter. Вот ни за каким хером тут не нужен С++. Оно и так по отжатию работает.
если не стоит задача экономии ресурсов, то String - это хорошо, Python или Perl - это тоже хорошо.
Но ведь у вас на все есть особое "нот со хамбл опиньон"?
Вот так-то лучше. Пожалуйста и впредь придерживайтесь той же линии.
Я рад что вам лучше, это ремисия, так бывает при маразме.
Но ведь у вас на все есть
неистребимое желание устроить срач.
гы! Логик, на 8-ми ядерном компе с 16гигами ОЗУ вы тоже не станете, как я понимаю - из принципа, пользоваться чем-то 4ого поколения (на выбор: perl, ruby, python, c#), а станете писать на "честном С"?
Пришел с работы где и писал на С/С++. Сегодня под OpenWRT, ядер - много ;) Платят хороше. Скорость всем нужна, даже там, где вы и не подозреваете о проблеме. Думаю вы пользовались по жизни написаным мной (ну так 50/50 если есть авто и в крупном городе живете то наверняка). Глюки и тормозню от применения классов аналогичных стрингу чистил лично. Еще вопросы есть? Спрашывайте. Я Всегда по умолчанию пишу о чем знаю, кроме случаев когда явно это указываю.
//Честно говоря, что матмодель какого-нить DDS генератора я , конечно, напишу на Питоне
А я в екселе напишу, так и чего с того.
Задача экономии ресурсов никогда не стоит в начале проекта, она ближе к концу возникает, когда позно менять уже. Потому умные люди соломку стелят, стринг не юзают, пишут бережливо к памяти и производительности. Оно потом выручает.
ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?
ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?
извиняюсь но немогли бы вы разъяснить это высказывание.
извиняюсь но немогли бы вы разъяснить это высказывание.
Не бери в голову, это он "в порядке общего срача" умность свою показывает. Пинает он не тебя, а Влада и Евгения (у него комплекс такой - он им (себе?) всё время свою крутизну доказать пытается), ты просто случайно рядом оказался.
ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?
извиняюсь но немогли бы вы разъяснить это высказывание.
А чего тут не ясно. В вашем коде плохо все, начиная от способа передачи информации о цвете в канале связи. Почему строки? Закодируйте его удобным для МК способом, байтом например, а чтоб Вам было проще, так байт 'R' пусть красный и т.д. Это снимет кучу проблем, о большинстве которых Вы пока не подозреваете, потерю синхронизации приема и передачи например. Ну допустим это от Вас не зависит, надо именно строки,хотя в домашних проектах это редкость. Тогда зачем их хранить? Задайте требуемые строки массивом констант. Ну приняли первый байт, проверили первый символ в строках из массива, по нему уже ясно какой из 3-х вариантов сообщения может быть. Сохраните индекс строки в которой совпадает первый символ в переменной byte C и дальше просто проверяйте соответствие каждого последующего принятого символа с требуемым. Если вдруг какой не совпал, например приняли "Blяe", значить у Вас проблема, фиксируете этот факт в флаге или просто С=-1. И соответствено уже ничего не выводите. Если же прошли до конца строки успешно (кстати подумайте чем завершатся строки) то пишите if(C==0)
Serial
.println("Red");
if(C==1)Serial
.println("Green");...
Это и даст основной существенный выиграш, сравнение С==1 для МК в 100-1000 раз проще и быстрей чем Color=="Red". Кстати в канале может прийти и "Blяяяe" и "Gr", а немного позже "een" (или концевка не прийдет вобще) прочая непредвиденая чепуха, и это тоже надо обрабатыва както, чтоб оно не сбивало последующий прием. Потому передача одним байтом в вашем случае оберегает от кучи проблем, как я уже писал. Потому надо в корне менять, тогда и String не понадобится вобще. А к нему лучше не привікать, выше люди писали о этом.ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?
извиняюсь но немогли бы вы разъяснить это высказывание.
тогда и String не понадобится вобще. А к нему лучше не привікать
Ну нравятся ему стринги (вместо семейных трусов) :)
По делу: разумеется проще (и правильнее) кодировать цвет одной буквой (R G B), а ещё лучше цифрой - не надо будет при проверке регистр букв учитывать.
Я уже кодировал цвет и через parceInt и через char, и вот решил дойти до string. В самом начале я написал что решил пропактиковаться так-как с портом ардуино и со стрингом я имею мало опыта работы и как уже говорил решил пропрактиковаться.
Насчет передачи байта, я знаю про такой способ и собираюсь опрбывать его на выходных с ИК приёмником.
И спасибо что расказали что у String есть такие проблемы, а то бы и дальше им пользовался.
И спасибо что расказали что у String есть такие проблемы
Это только начало, мы Вам можем и про проблемы других типов рассказать. Вообще ничем пользоваться не будете :))))
Про проблеммы String поясню:
Проблема в том, что стринг занимает и освобождает память безсистемно.Чтов итоге приведет к нехватке памяти или порче стека.
Притаких незначительных ресурсах,как в arduino uno, nano и т.п. не следует учиться и привыкать использовать стринг.
Тут глупая ситуация - безопасно использовать стринг может лишь тот программист, которому этот самый стринг, по большому счету, не нужен.
Новичку можно поиграться в стринг и бросить. Даже простая сигналка с приемом и отправкой СМС уже упирается в нехватку памяти, если не научиться работатьс С-строками, как полагается.
Но стоит вам взять контроллер помощнее, где памяти побольше, и тот же Стринг сократит время разработки.А хороший компилятор нормально все оптимизирует. Прогресс не стоит на месте!
======================
Вот например я - "умею" ;) рисовать прямые и дуги - вообще без операций с плавающей точкой и даже без умножений. В 90-е годы мне была нужна быстрая графика на EGA и VGA машинах без сопроцессора. На кой хер теперь нужны эти знания? Железо на котором это актуально - ну разве что дисплей к ардуинке! :) На котором не бывает задач, критичных к времени вывода на экран.
Вот например я - "умею" ;) рисовать прямые и дуги - вообще без операций с плавающей точкой и даже без умножений. В 90-е годы мне была нужна быстрая графика на EGA и VGA машинах без сопроцессора. На кой хер теперь нужны эти знания? Железо на котором это актуально - ну разве что дисплей к ардуинке! :) На котором не бывает задач, критичных к времени вывода на экран.
Ну как не бывает, осциллографы на Ардуинке же делают.
В виде этюда можно выложить код: чего ему зря пылиться, может кому и пригодится (почти стихи).
Тут глупая ситуация - безопасно использовать стринг может лишь тот программист, которому этот самый стринг, по большому счету, не нужен.
Вот например я - "умею" ;) рисовать прямые и дуги - вообще без операций с плавающей точкой и даже без умножений. В 90-е годы мне была нужна быстрая графика на EGA и VGA машинах без сопроцессора. На кой хер теперь нужны эти знания? Железо на котором это актуально - ну разве что дисплей к ардуинке! :)
дисплей к ардуинке! :) На котором не бывает задач, критичных к времени вывода на экран.
Вы представляете декодирование jpg реализованое на чистом perl или пыхе без использования реализаций соответствующего алгоритма на других (догадываетесь каких;) языках? В том и дело что высокоуровневые плотно сидят на реализованом на с/с++ и их успех целиком зависит от наличия нужной реализации. Если нет тех самых знаний упакованых в компилированый код - приплыли. Си без перла обойдется (много лет обходится), а вот перл без си - нет.
Логик, я писал декодирование и потоковую обработку векторной графики (бинарных файлов) на чистом Перле. С нуля, так как в то время (97 - 2000) нужных мне библиотек для работы с графикой в перле еще не было. Организовывал структуры, собирал их в ветвящиеся связанные списки, сортировал - нормально это все делается в перле, кстати. Очень похоже на Си. Проект был вполне рабочим, с его помощью было обработано несколько десятков тысяч векторных диаграмм.
Потом, лет через пять - без проблем портировал на Си, когда понадобилось. Но изначально все на Перле было. Так что не надо наезжать на Перл, он и без Си многое может :)
Так векторная и на бейсике пишется, там обем данных на один примитив мизерный, координаты точек, да индекс примитива. А отрисовку наверняка использовали готовую, и не на перле писаную. Векторная далеко не jpg. В компанию к jpg можна mp3 и mpeg4 добавить. Их тоже можна на перле с пыхой играть. Но в реале там будет крутится код написаный на с/с++. Так что все это 4-е поколение сводится к оболочке над написаным ранее производительным кодом на с/с++. Для упрощения пользования малоквалифицироваными разработчиками и снижения времени разработки.