Но делать класс ради использования один раз одного метода из него за весь код проекта - не хорошая идея.
Ну да. Если Вы программируете в последний раз, и больше вы собираетесь бросить это паршивое дело, то да .Городить класс в последний раз в жизни ни к чему. Но если вы все же продолжите это дело, то позже вам надо в этот скеч что добавлять еще. Или еще вам вдруг понадобится писать новый проект и вы банально будете брать готовые решения из старого. А если не решения, то подходы. Опыт для программиста это не гордость за сделаные решения в прошлом, а куча работающего кода из которого можно кое что позаимствовать. И программист не только пишет код который решит проект сейчас, но и будет решать подобные задачи в будущем. Ну да если жизнь это даст.
Ну да. Если Вы программируете в последний раз, и больше вы собираетесь бросить это паршивое дело, то да .Городить класс в последний раз в жизни ни к чему. Но если вы все же продолжите это дело, то позже вам надо в этот скеч что добавлять еще. Или еще вам вдруг понадобится писать новый проект и вы банально будете брать готовые решения из старого. А если не решения, то подходы. Опыт для программиста это не гордость за сделаные решения в прошлом, а куча работающего кода из которого можно кое что позаимствовать. И программист не только пишет код который решит проект сейчас, но и будет решать подобные задачи в будущем. Ну да если жизнь это даст.
Вопрос не скромный можно? вы на яве случаем не пишете\писали?
Делать класс ради одного метода - нет смысла.
Делать класс с методами A_Plus_B(int a,b) и B_Plus_C(int b,c) - нет смысла.
Зато есть смысл делать класс где protected int b; A_Plus_B(int a) и B_Plus_C(int c);
Если у вас класс выступает агрегатором функций - незачем их обьединять в класс, вызов метода стоид дороже вызова функции.
Если вы умеете в ООП - вы должны знать что класс это данные + код, а не голый код, и не голые данные.
Поэтому я и советовал: если вы не знаете зачем вам класс - используйте функцию.
Все вышесказаное - отрыв от реальности и упрощение, ибо классы не только данные + код =)
Все 3 примера делают почти одно и тоже, так? но работать правильно будет только первый
Ну третья строка это "||" ИЛИ, а нам нужно и то и другое, соответственно "&&".
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно) нет новой карты и считывание не производилось, то return; - то есть ждем когда появится новая карта и с нее будет считан код, тогда программа пойдет выполняться дальше. Знак "!" применен ко всем параметрам (2 шука), находящимся в скобках.
А вот почему не верна вторая строка?
Ведь у каждого из двух стоит "!", то есть и первый не должен исполняться и второй не должен исполняться.
Разумеется это просто вариант и только под ардуину. Ну а это как вариант #251
Я это видел, и если это использовать с пониманием как что и зачем - смысл есть.
Но таки вопросов моих это не отменяет, а даже увеличивает значимость того о чем я говорил.
1) Если подобные примеру классы пихать в "свою" библиотеку - они очень полезны.
2) Если подобные примеру классы использовать в лоб - они вредны.
Классы это не агрегаторы функций в первую очередь(есть обьекты, есть функции, есть модули), класс это законченная структура которая может наследоватся, расширятся, изменятся.
Классы можно использовать как агрегатор если у вас объектная модель и обьектов неизвестное число(0~бесконечности), Классы нужно использовать для описания сложной древовидной структуры обьектов(есть класс пульт, который в себе несет обьекты кнопок, которая в себе несет обьект состояние)
Классы нужно использовать для описания некой часто встречающейся законченой структуры, кто то сможет взять вашу структуру и модифицировать ее под себя(переопределение\наследование)
Опять таки замечаю что многие не отличают КЛАСС и ОБЪЕКТ, хз с чем это связано но факт есть факт.
В вашем примере по ссылке - объекты, нет там классов... нет там наследования, нет переопределения....
Давайте так, чтоб вы меня поняли, если вам в коде нигде не нужно явно вызывать(т.е. не потому что использование классов обязывает это делать, а потому что вам реально нужен еще один обьект данного класса и он не первый\последний) MyClass = new tMyClass(), вам классы не нужны. вам нужны обьекты.
Не напрягайся, ты уже четвёртый, кто пытается это объяснить Квону. Ему уже не раз и не два говорили, что использовать классы, не используя при этом концепции ООП - просто синтаксическое излишество. Ни фига! Об уровне понимания человеком что такое класс вообще, можешь судить по тому, что он как-то пространства имён разновидностью классов обозвал на том основании, что синтаксически там тоже :: используется. Ну, нравится человеку ключевое слово class. И не важно, что не очень понятно, что это такое. Нравится и всё тут. Ну, а нравится - пусть использует. Расслабься :)
Ну третья строка это "||" ИЛИ, а нам нужно и то и другое, соответственно "&&".
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно) нет новой карты и считывание не производилось, то return; - то есть ждем когда появится новая карта и с нее будет считан код, тогда программа пойдет выполняться дальше. Знак "!" применен ко всем параметрам (2 шука), находящимся в скобках.
А вот почему не верна вторая строка?
Давайте я в кратце расскажу как работает if, просто очень долго расписывать почему не сработает третья строка(а она намного более близка к нужному коду нежели вторая и если функции вызываемые в ней верно написаны то может сработать даже).
1) Условие всегда выполняются с права на лево до первой возможности выйти:
a) if(1=1 || println('abc')){}; - println - не выполнится никогда. хотя он часть условия
б) if(1=2 and println('abc')){}; - println - не выполнится никогда. хотя он часть условия
в) if(1=2 || println('abc')){}; - println - будет выполнятсяж
Можно попробовать и проверить консоль на предмет вывода =)
2) Условия выполняются как в математике, скобки имеют значение.
а) if(!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) return; вот тут вообще не верное условие, т.к. return будет только если оба false, а нам нужно return если любой из них false;
б) if(!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) return; вот тут уже ближе к истине, но мы в любом случае будем вызывать mfrc522.PICC_ReadCardSerial(), даже если мы знаем что данных для считывания нет(первое условие)... что есть ошибка....
Теперь на основе знаний пункта 1 и 2 вы можете провести анализ всех трех условий, и увидеть что сработает как надо только первое из них =)
зы. пока чепятал ответ забыл про эту строку...
Katapuf пишет:
Ведь у каждого из двух стоит "!", то есть и первый не должен исполняться и второй не должен исполняться.
Мне сложно обьяснить это не в формате ЯП, но восклицательный знак это отрицание(инверсия), было true стало false и наоборот было false стало true, никакого дополнительного смысла этот знак не несет. != : было равно, стало не равно(инверсия\отрицание)....
Не напрягайся, ты уже четвёртый, кто пытается это объяснить Квону. Ему уже не раз и не два говорили, что использовать классы, не используя при этом концепции ООП - просто синтаксическое излишество. Ни фига! Об уровне понимания человеком что такое класс вообще, можешь судить по тому, что он как-то пространства имён разновидностью классов обозвал на том основании, что синтаксически там тоже :: используется. Ну, нравится человеку ключевое слово class. И не важно, что не очень понятно, что это такое. Нравится и всё тут. Ну, а нравится - пусть использует. Расслабься :)
=) не особо напрягался, но спасибо за сбережение моих нервных клеток =))))
ua6em пишет:
многопоточность, это надо какую-нибудь RTOS прикручивать, только видимо это невозможно, препроцессор IDE не даст
Очень даже даст, и вполне реализуемо, только лишено смысла.
а) if(!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) return; вот тут вообще не верное условие, т.к. return будет только если оба false, а нам нужно return если любой из них false;
Мне сложно обьяснить это не в формате ЯП, но восклицательный знак это отрицание(инверсия), было true стало false и наоборот было false стало true, никакого дополнительного смысла этот знак не несет. != : было равно, стало не равно(инверсия\отрицание)....
Про а): Не успел жочитать до конца как понял. Ведь и правда, "!" неверным значение может быть как оба, так одно из...
А про последний абзац я же сам и писал, что "!" что он означает.
Katapuf пишет:
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно)
Класс - эфективный метод избежать конфликтов в пространстве имен.
Вы с квоном? Обьект, структура - да, эфективный.
Класс - это про другое.
Дополню, тут на форуме(хз где, но читал) - был "титановый велосипед" для кнопки - вот это отличный пример для чего нужен класс.
1) для переиспользования кода внутри одно проекта.
2) для переноса между проектами.(и то не всегда нужно городить класс)
3) Для создания древовидной структуры обьектов, и доступа к разным дочерним обьектам(наследуемым классам) как к родителю(унификация, читайте интерфейся).
Дело не в том "про что", а в том - с какой целью можно использовать.
Притом, цели могут быть самые разные. И вряд ли какую либо из них можно считать некправильной.
И еще: что-то у меня сильное сомнение насчет неэффективности использования статического члена класса вместо функции. Что там еще неэффективного кроме передачи одного дополнительного параметра?
Ничего опасного быть с qwone , а так же не быть с qwone. Да и объекты можно описывать как через классы, так и через структуры, а можно и просто через типы. Но не все что описывается через классы может стать объектом. Но я просто предложил подход писать объекты через классы да в среде Ардуино. И да я не открыл Америку. Просто до меня в явном виде никто не писал объекты в класс и в основном скетче.
ПС: И в результате получился RTOS но на более высоком уровне и без сильной потери памяти и накручивании кода ;)
Да и объекты можно описывать как через классы, так и через структуры, а можно и просто через типы.
Притормозите, обратной силы это не имеет =) Если из А следует Б, это еще не означает что перед Б всегда есть А. тут тоже самое
qwone пишет:
Но не все что описывается через классы может стать объектом.
Вы не поверите, все что описано классом и не стало обьектом(хотябы в потомке) - создано для энтропии, и не несет ровно никакой пользы. ибо класс это описание СТРУКТУРЫ(скелета, строения) ОБЪЕКТА.
qwone пишет:
Но я просто предложил подход писать объекты через классы да в среде Ардуино. И да я не открыл Америку.
Да вы открыли Java на Си и в среде с и так дико ограниченными ресурсами кидаетесь ими на лево и на право.
qwone пишет:
Просто до меня в явном виде никто не писал объекты в класс и в основном скетче.
А вы не думали что есть причина тому что есть класс, есть структура и есть объект, и не просто так все не пишут классами?
з.ы. я понимаю что си достаточно умный компилятор и вырежет кучу ненужных вещей которые вы делаете, но поверьте это не лучший подход... не нужно отдавать компилятору микроскоп чтоб он из него сделал молоток, которым вы забиваете гвозди =)
2) з.ы. я понимаю что си достаточно умный компилятор и вырежет кучу ненужных вещей которые вы делаете, но поверьте это не лучший подход... не нужно отдавать компилятору микроскоп чтоб он из него сделал молоток, которым вы забиваете гвозди =)
Вот именно . Вам дали умный компилятор и умный язык. Так пользуйтесь им. Не бойтесь. Он и код подчистит и память подожмет. Меньше всяких трюков, которые при обновлениисреды обрушат код.
Мало передачи одного параметра? причем ненужного и никак не используемого, и кто вам про один то сказал?
или вы считаете что происходит только передача ссылки на данные лишней?
Для статического метода - да, только передача лишней ссылки, дальнейшие рассуждения в 8бит мне сложно вести, в 32 бита чуть проще, там я в курсе про накладные расходы при передаче параметров и вызовов методов, но даже в 32 бита передача одной ссылки может сказыватся на производительности(передаем 4 параметра, пятым летит ссылка на данные, как итог лишний переход потому что все параметры улетят ссылками, а могли бы улететь данными).
Вот именно . Вам дали умный компилятор и умный язык.
А еще мне дали голову на плечах которая тоже умеет думать, и умеет параною, а особенно не доверять чему то столь умному что за меня решает как оптимизировать мой код.
qwone пишет:
Так пользуйтесь им. Не бойтесь. Он и код подчистит и память подожмет. Меньше всяких трюков, которые при обновлениисреды обрушат код.
Вы заметили как этот чел всталяет код на форум. Это один из маркеров для старожилов забить на тему. Теперь про переполнение millis() и все .Тема в спам.
ToRcH2565 пишет:
Точно RTOS ? или пародия? как с многозадачностью? кто следит за памятью?
Вы заметили как этот чел всталяет код на форум. Это один из маркеров для старожилов забить на тему. Теперь про переполнение millis() и все .Тема в спам.
Загляните по ссылке, почитайте код, посмотрите решение проблемы, я тоже сначало хотел забить когда увидел паузу в 10 тиков, потом оказалось что человек понимает чего хочет, и что компилятор реально обрезал то что хотел человек =)
Загляните по ссылке, почитайте код, посмотрите решение проблемы, я тоже сначало хотел забить когда увидел паузу в 10 тиков, потом оказалось что человек понимает чего хочет, и что компилятор реально обрезал то что хотел человек =)
1- кривой код 2 криво вставлен 3 не правлю чужие скетчи, так как паршивая структура программы.
...дальнейшие рассуждения в 8бит мне сложно вести, в 32 бита чуть проще, там я в курсе про накладные расходы при передаче параметров и вызовов методов, но даже в 32 бита передача одной ссылки может сказыватся на производительности(передаем 4 параметра, пятым летит ссылка на данные, как итог лишний переход потому что все параметры улетят ссылками, а могли бы улететь данными).
Мне еще сложнее Вас понять.
Если под "все параметры улетят ссылками, а могли бы улететь данными" Вы подразумеваете, что параметры будут переданы по ссылке вместо того, чтобы быт переданными по значению, боюсь, Вы ошибаетесь.
При вызове метода первым параметром улетает ссылка на данные метода.
andriano пишет:
Если под "все параметры улетят ссылками, а могли бы улететь данными" Вы подразумеваете, что параметры будут переданы по ссылке вместо того, чтобы быт переданными по значению, боюсь, Вы ошибаетесь.
Очень лень гуглить, но примерно так как вы написали, и зря вы боитесь, я крайне редко неверно помню информацию которую читал давно.
Класс - эфективный метод избежать конфликтов в пространстве имен.
Просторанство имён - гораздо более эффективный способ избежать конфликта в пространстве имён.
А вот тут я не понял
andriano пишет:
статического члена класса вместо функции. Что там еще неэффективного кроме передачи одного дополнительного параметра?
ToRcH2565 пишет:
Для статического метода - да, только передача лишней ссылки,
мужики, я понимаю, что глубокая ночь была, но не могу не присоединиться к вопросу DetSimen.
DetSimen пишет:
Про какую лишнюю ссылку речь?
Вы вообще о чём? О какой такой ссылке, передаваемой статическому методу? Ни хрена ему не передаётся, функция как функция.
И, наконец,
qwone пишет:
как через классы, так и через структуры,
объясните, пожалуйста, что Вы имели в виду? Так просто на всякий случай напоминаю, что классы в С++ создаются при помощи трёх ключевых слов: struct, class и union.
статические методы работают со статическими данными, едиными для всех экземпляров. Нахрена методу указатель на данные, если он и так знает где они находятся? Компилятор их заботливо туда положил и адрес запомнил.
Статический метод аналогичен обычной функции вообще во всем, кроме областей видимости. У него даже адрес брать можно и передавать туда, где требуется обычная функция.
Нет. Прошу прощенья, но у меня есть одно выстраданное жизнью золотое правило: когда я пью - никому не звоню и к компу в форумы не лезу. Пребываю в самодостаточной сингулярности.
Нет. Прошу прощенья, но у меня есть одно выстраданное жизнью золотое правило: когда я пью - никому не звоню и к компу в форумы не лезу. Пребываю в самодостаточной сингулярности.
И этта, я не пророк его.
Отличное правило, а то мой приятель руководителю позвонил, теперь ЛЭП 500кв обслуживают без его чуткого руководства
статические методы работают со статическими данными, едиными для всех экземпляров. Нахрена методу указатель на данные, если он и так знает где они находятся? Компилятор их заботливо туда положил и адрес запомнил.
Если это ко мне, то когда я спал на лекциях, С++ еще в природе не было.
И - да - каюсь, С/С++ для меня не родные языки. Напутал. Даже лишнего параметра не будет.
Очень лень гуглить, но примерно так как вы написали, и зря вы боитесь, я крайне редко неверно помню информацию которую читал давно.
Ну, и на старуху бывает проруха. Боюсь, сейчас - как раз тот крайне редкий случай.
Потому как я не представляю, в какой ситуации компилятор вместо значения может положить адрес или наоборот.
Но вот конкретно упоминание числа 4 наводит на мысль, что имелось в виду: до 4 параметров - в регистрах, а более 4 - в стек. Естественно, на работу со стеком - дополнительные операции. Причем в обе стороны (и когда класть, и когда извлекать). Только помнится, было это не на AVR, а на i386+, а число 4 объясняется списком регистров: EAX, EBX, ECX и EDX.
А причем тут ваши ошибки? Использовать for попробывал я и ваши ошибки я не рассматривал.
Так при том. Сам написал - сам и анализируй что получилось. Именно этот процесс анализа и есть учёба на ошибках. А Вы анализ на нас перекладываете.
Сам написал - сам и анализируй что получилось. Именно этот процесс анализа и есть учёба на ошибках. А Вы анализ на нас перекладываете.
Блин. Товарищи. Не мучайте мозги друг другу.
Если Вы Великий учитель, магистр джедаев, то идите и учите студентов! Зачем тут учить??? Тут не нужна ваша "учительская мудрость" в духе "Ты, ученик мой ответ внутри себя найдешь, незачем тебе на формах лазить".
Тут люди начинающие ищут ответ на вопрос: А как бы сделал профессионал. И ВСЕ!
По сути форум - обмен знаниями между тупыми и умными. Что бы тупые стали умными. Но! Внимание!
Если ты типа умный, то не надо делать мозги! типа "Сам анализируй, зачем тебе голова". Мозгодел.
Изза таких мозгоделов, типа умных форумы перелиты водой, читать много приходится ругачки в сообщениях и оправдываний самого мозгодела.
Ответ типа "Сам анализируй" - ответ плохого человека. Можно вообще не отвечать, и без умничаний ваших тут тема продолжится.
Учебу он тут организовал. Лектор. Профессор кислых щей. Экзаменатор тут нашелся.
Нет бы сказать по делу, по мужски, а он "А Вы анализ на нас перекладываете". Ну ваще, взвалили на него одного, несет пупок трещит. Как не обосрался только... Анализ на него переложили. Да зачем ты тогда нужен тут на форуме? Анализ видите ли ему претит.
Накипело.
Послесловие.
Нечего мне тут оправдываться или возражать или вообще отписыватсья. Вообще мне пишите никто.
Еще дальше было сказано что есть штука Switch case, почему не ее использовали?
Я про это "Switch case" только сегодня узнал.
Поэтому, как то так.
А по способ "прически" кода, предложенный вами, понял.
А по способ "прически" кода, предложенный вами, понял.
Только при прическе кода, аккуратней, вот такая конструкция будет правильно работать только если понимать как работает if
1) if
(!(mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()))
return
;
2) if
(!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial())
return
;
3) if
(!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial())
return
;
Все 3 примера делают почти одно и тоже, так? но работать правильно будет только первый
Ну да. Если Вы программируете в последний раз, и больше вы собираетесь бросить это паршивое дело, то да .Городить класс в последний раз в жизни ни к чему. Но если вы все же продолжите это дело, то позже вам надо в этот скеч что добавлять еще. Или еще вам вдруг понадобится писать новый проект и вы банально будете брать готовые решения из старого. А если не решения, то подходы. Опыт для программиста это не гордость за сделаные решения в прошлом, а куча работающего кода из которого можно кое что позаимствовать. И программист не только пишет код который решит проект сейчас, но и будет решать подобные задачи в будущем. Ну да если жизнь это даст.
Вопрос не скромный можно? вы на яве случаем не пишете\писали?
Делать класс ради одного метода - нет смысла.
Делать класс с методами A_Plus_B(int a,b) и B_Plus_C(int b,c) - нет смысла.
Зато есть смысл делать класс где protected int b; A_Plus_B(int a) и B_Plus_C(int c);
Если у вас класс выступает агрегатором функций - незачем их обьединять в класс, вызов метода стоид дороже вызова функции.
Если вы умеете в ООП - вы должны знать что класс это данные + код, а не голый код, и не голые данные.
Поэтому я и советовал: если вы не знаете зачем вам класс - используйте функцию.
Все вышесказаное - отрыв от реальности и упрощение, ибо классы не только данные + код =)
Я не хочу жевать одно и тоже http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
Разумеется это просто вариант и только под ардуину. Ну а это как вариант #251
Есть конечно предположение, что будет, но... я только учусь....
Просто пришла как говорится мысля... решил посмотреть, что будет.
Ведь учиться можно, только на своих ошибках, чужие ошибки, не запоминаются и не откладываются, в личном опыте.
Как я понимаю, многопоточности в Ардуино нет...
многопоточность, это надо какую-нибудь RTOS прикручивать, только видимо это невозможно, препроцессор IDE не даст
А по способ "прически" кода, предложенный вами, понял.
Только при прическе кода, аккуратней, вот такая конструкция будет правильно работать только если понимать как работает if
1) if
(!(mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()))
return
;
2) if
(!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial())
return
;
3) if
(!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial())
return
;
Все 3 примера делают почти одно и тоже, так? но работать правильно будет только первый
Ну третья строка это "||" ИЛИ, а нам нужно и то и другое, соответственно "&&".
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно) нет новой карты и считывание не производилось, то
return
; - то есть ждем когда появится новая карта и с нее будет считан код, тогда программа пойдет выполняться дальше. Знак "!" применен ко всем параметрам (2 шука), находящимся в скобках.
А вот почему не верна вторая строка?
Ведь у каждого из двух стоит "!", то есть и первый не должен исполняться и второй не должен исполняться.
Я не хочу жевать одно и тоже http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
Разумеется это просто вариант и только под ардуину. Ну а это как вариант #251
Я это видел, и если это использовать с пониманием как что и зачем - смысл есть.
Но таки вопросов моих это не отменяет, а даже увеличивает значимость того о чем я говорил.
1) Если подобные примеру классы пихать в "свою" библиотеку - они очень полезны.
2) Если подобные примеру классы использовать в лоб - они вредны.
Классы это не агрегаторы функций в первую очередь(есть обьекты, есть функции, есть модули), класс это законченная структура которая может наследоватся, расширятся, изменятся.
Классы можно использовать как агрегатор если у вас объектная модель и обьектов неизвестное число(0~бесконечности), Классы нужно использовать для описания сложной древовидной структуры обьектов(есть класс пульт, который в себе несет обьекты кнопок, которая в себе несет обьект состояние)
Классы нужно использовать для описания некой часто встречающейся законченой структуры, кто то сможет взять вашу структуру и модифицировать ее под себя(переопределение\наследование)
Опять таки замечаю что многие не отличают КЛАСС и ОБЪЕКТ, хз с чем это связано но факт есть факт.
В вашем примере по ссылке - объекты, нет там классов... нет там наследования, нет переопределения....
Давайте так, чтоб вы меня поняли, если вам в коде нигде не нужно явно вызывать(т.е. не потому что использование классов обязывает это делать, а потому что вам реально нужен еще один обьект данного класса и он не первый\последний) MyClass = new tMyClass(), вам классы не нужны. вам нужны обьекты.
Не напрягайся, ты уже четвёртый, кто пытается это объяснить Квону. Ему уже не раз и не два говорили, что использовать классы, не используя при этом концепции ООП - просто синтаксическое излишество. Ни фига! Об уровне понимания человеком что такое класс вообще, можешь судить по тому, что он как-то пространства имён разновидностью классов обозвал на том основании, что синтаксически там тоже :: используется. Ну, нравится человеку ключевое слово class. И не важно, что не очень понятно, что это такое. Нравится и всё тут. Ну, а нравится - пусть использует. Расслабься :)
Ну третья строка это "||" ИЛИ, а нам нужно и то и другое, соответственно "&&".
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно) нет новой карты и считывание не производилось, то
return
; - то есть ждем когда появится новая карта и с нее будет считан код, тогда программа пойдет выполняться дальше. Знак "!" применен ко всем параметрам (2 шука), находящимся в скобках.
А вот почему не верна вторая строка?
Давайте я в кратце расскажу как работает if, просто очень долго расписывать почему не сработает третья строка(а она намного более близка к нужному коду нежели вторая и если функции вызываемые в ней верно написаны то может сработать даже).
1) Условие всегда выполняются с права на лево до первой возможности выйти:
a) if(1=1 || println('abc')){}; - println - не выполнится никогда. хотя он часть условия
б) if(1=2 and println('abc')){}; - println - не выполнится никогда. хотя он часть условия
в) if(1=2 || println('abc')){}; - println - будет выполнятсяж
Можно попробовать и проверить консоль на предмет вывода =)
2) Условия выполняются как в математике, скобки имеют значение.
а) if((1=1 || println('abc')) && println('cba'))){}; - на экран выведет 'cba'
3) следует из 2х выше приведенных
а)
if
(!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial())
return
; вот тут вообще не верное условие, т.к. return будет только если оба false, а нам нужно return если любой из них false;
б)
if
(!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial())
return
; вот тут уже ближе к истине, но мы в любом случае будем вызывать
mfrc522.PICC_ReadCardSerial(), даже если мы знаем что данных для считывания нет(первое условие)... что есть ошибка....Теперь на основе знаний пункта 1 и 2 вы можете провести анализ всех трех условий, и увидеть что сработает как надо только первое из них =)
зы. пока чепятал ответ забыл про эту строку...
Мне сложно обьяснить это не в формате ЯП, но восклицательный знак это отрицание(инверсия), было true стало false и наоборот было false стало true, никакого дополнительного смысла этот знак не несет. != : было равно, стало не равно(инверсия\отрицание)....
Не напрягайся, ты уже четвёртый, кто пытается это объяснить Квону. Ему уже не раз и не два говорили, что использовать классы, не используя при этом концепции ООП - просто синтаксическое излишество. Ни фига! Об уровне понимания человеком что такое класс вообще, можешь судить по тому, что он как-то пространства имён разновидностью классов обозвал на том основании, что синтаксически там тоже :: используется. Ну, нравится человеку ключевое слово class. И не важно, что не очень понятно, что это такое. Нравится и всё тут. Ну, а нравится - пусть использует. Расслабься :)
=) не особо напрягался, но спасибо за сбережение моих нервных клеток =))))
многопоточность, это надо какую-нибудь RTOS прикручивать, только видимо это невозможно, препроцессор IDE не даст
Очень даже даст, и вполне реализуемо, только лишено смысла.
а)
if
(!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial())
return
; вот тут вообще не верное условие, т.к. return будет только если оба false, а нам нужно return если любой из них false;
Мне сложно обьяснить это не в формате ЯП, но восклицательный знак это отрицание(инверсия), было true стало false и наоборот было false стало true, никакого дополнительного смысла этот знак не несет. != : было равно, стало не равно(инверсия\отрицание)....
Про а): Не успел жочитать до конца как понял. Ведь и правда, "!" неверным значение может быть как оба, так одно из...
А про последний абзац я же сам и писал, что "!" что он означает.
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно)
Это как использование функции prinf??? Сразу на 8 килобайт код увеличит...а выхлоп стремится к минимальному?
Первая строка : Если "!" (знак инверсии, то есть дальнейшее не верно)
Действие неверно и инвертировать значение действия..... Ладно главное вы суть этого знака поняли для себя =)
Просто чтобы не путатся с остальными программистами, действие неверно это false грубо говоря, а ! это тоже самое что *(-1)
Это как использование функции prinf??? Сразу на 8 килобайт код увеличит...а выхлоп стремится к минимальному?
Это вы вообще о чем и к чему? к примерам? так это просто для наглядности использовал именно ее, чтоб можно было загнать в мк и увидеть =)
Золотое правило Адуинской программистской механики: текст loop() должен полностью влазить в 1 экран.
Два замечания:
1. Фрагмент "Адуинской программистской механики" - лишний.
2. А фрагмент "loop()" нужно заменить на "любой функции".
Но делать класс ради использования один раз одного метода из него за весь код проэкта - не хорошая идея.
Отнюдь.
Класс - эфективный метод избежать конфликтов в пространстве имен.
Отнюдь.
Класс - эфективный метод избежать конфликтов в пространстве имен.
Вы с квоном? Обьект, структура - да, эфективный.
Класс - это про другое.
Дополню, тут на форуме(хз где, но читал) - был "титановый велосипед" для кнопки - вот это отличный пример для чего нужен класс.
1) для переиспользования кода внутри одно проекта.
2) для переноса между проектами.(и то не всегда нужно городить класс)
3) Для создания древовидной структуры обьектов, и доступа к разным дочерним обьектам(наследуемым классам) как к родителю(унификация, читайте интерфейся).
4) ......
Но точно не для разграничения пространства имен.
Дело не в том "про что", а в том - с какой целью можно использовать.
Притом, цели могут быть самые разные. И вряд ли какую либо из них можно считать некправильной.
И еще: что-то у меня сильное сомнение насчет неэффективности использования статического члена класса вместо функции. Что там еще неэффективного кроме передачи одного дополнительного параметра?
Ничего опасного быть с qwone , а так же не быть с qwone. Да и объекты можно описывать как через классы, так и через структуры, а можно и просто через типы. Но не все что описывается через классы может стать объектом. Но я просто предложил подход писать объекты через классы да в среде Ардуино. И да я не открыл Америку. Просто до меня в явном виде никто не писал объекты в класс и в основном скетче.
ПС: И в результате получился RTOS но на более высоком уровне и без сильной потери памяти и накручивании кода ;)
Притормозите, обратной силы это не имеет =) Если из А следует Б, это еще не означает что перед Б всегда есть А. тут тоже самое
Вы не поверите, все что описано классом и не стало обьектом(хотябы в потомке) - создано для энтропии, и не несет ровно никакой пользы. ибо класс это описание СТРУКТУРЫ(скелета, строения) ОБЪЕКТА.
Да вы открыли Java на Си и в среде с и так дико ограниченными ресурсами кидаетесь ими на лево и на право.
А вы не думали что есть причина тому что есть класс, есть структура и есть объект, и не просто так все не пишут классами?
з.ы. я понимаю что си достаточно умный компилятор и вырежет кучу ненужных вещей которые вы делаете, но поверьте это не лучший подход... не нужно отдавать компилятору микроскоп чтоб он из него сделал молоток, которым вы забиваете гвозди =)
И еще: что-то у меня сильное сомнение насчет неэффективности использования статического члена класса вместо функции.
Точно статического?
https://yadi.sk/i/VpZka5Ec3WKMQy
Я что то нигде не заметил статического =)
Мало передачи одного параметра? причем ненужного и никак не используемого, и кто вам про один то сказал?
или вы считаете что происходит только передача ссылки на данные лишней?
Для статического метода - да, только передача лишней ссылки, дальнейшие рассуждения в 8бит мне сложно вести, в 32 бита чуть проще, там я в курсе про накладные расходы при передаче параметров и вызовов методов, но даже в 32 бита передача одной ссылки может сказыватся на производительности(передаем 4 параметра, пятым летит ссылка на данные, как итог лишний переход потому что все параметры улетят ссылками, а могли бы улететь данными).
Чем? или вы считаете что, ну ка секунду, "функция это законченная подпрограмма" - не верно?
А еще мне дали голову на плечах которая тоже умеет думать, и умеет параною, а особенно не доверять чему то столь умному что за меня решает как оптимизировать мой код.
Да, меньше....
http://arduino.ru/forum/programmirovanie/ne-vyzvvaetsya-funktsiya-iz-tsikla-while
Вот он и подчищает людям код.
Точно RTOS ? или пародия? как с многозадачностью? кто следит за памятью?
Компилятор. Если Вы ему дибильный код не всунете.
Вы заметили как этот чел всталяет код на форум. Это один из маркеров для старожилов забить на тему. Теперь про переполнение millis() и все .Тема в спам.
Загляните по ссылке, почитайте код, посмотрите решение проблемы, я тоже сначало хотел забить когда увидел паузу в 10 тиков, потом оказалось что человек понимает чего хочет, и что компилятор реально обрезал то что хотел человек =)
Простите вы точно не путаете RTOS ни с чем?
1- кривой код 2 криво вставлен 3 не правлю чужие скетчи, так как паршивая структура программы.
Для статического метода - да, только передача лишней ссылки, дальнейшие рассуждения в 8бит мне сложно вести
Про какую лишнюю ссылку речь?
...дальнейшие рассуждения в 8бит мне сложно вести, в 32 бита чуть проще, там я в курсе про накладные расходы при передаче параметров и вызовов методов, но даже в 32 бита передача одной ссылки может сказыватся на производительности(передаем 4 параметра, пятым летит ссылка на данные, как итог лишний переход потому что все параметры улетят ссылками, а могли бы улететь данными).
Мне еще сложнее Вас понять.
Если под "все параметры улетят ссылками, а могли бы улететь данными" Вы подразумеваете, что параметры будут переданы по ссылке вместо того, чтобы быт переданными по значению, боюсь, Вы ошибаетесь.
Тык про RTOS не я завел разговор...
При вызове метода первым параметром улетает ссылка на данные метода.
Если под "все параметры улетят ссылками, а могли бы улететь данными" Вы подразумеваете, что параметры будут переданы по ссылке вместо того, чтобы быт переданными по значению, боюсь, Вы ошибаетесь.
Очень лень гуглить, но примерно так как вы написали, и зря вы боитесь, я крайне редко неверно помню информацию которую читал давно.
Класс - эфективный метод избежать конфликтов в пространстве имен.
Просторанство имён - гораздо более эффективный способ избежать конфликта в пространстве имён.
А вот тут я не понял
статического члена класса вместо функции. Что там еще неэффективного кроме передачи одного дополнительного параметра?
Для статического метода - да, только передача лишней ссылки,
мужики, я понимаю, что глубокая ночь была, но не могу не присоединиться к вопросу DetSimen.
Про какую лишнюю ссылку речь?
Вы вообще о чём? О какой такой ссылке, передаваемой статическому методу? Ни хрена ему не передаётся, функция как функция.
И, наконец,
как через классы, так и через структуры,
объясните, пожалуйста, что Вы имели в виду? Так просто на всякий случай напоминаю, что классы в С++ создаются при помощи трёх ключевых слов: struct, class и union.
Вы вообще о чём? О какой такой ссылке, передаваемой статическому методу? Ни хрена ему не передаётся, функция как функция.
SomeClass::StaticFunct() - обычная функция
SomeClass->StaticFunct() - Обычный метод.
SomeClass::StaticFunct() - обычная функция
SomeClass->StaticFunct() - Обычный метод.
И что? Статическому методу (описанному как static) будет передан this? И что он с ним будет делать? Ничего ему не передаётся.
Мосье на лекциях по С++ спал штоли?
статические методы работают со статическими данными, едиными для всех экземпляров. Нахрена методу указатель на данные, если он и так знает где они находятся? Компилятор их заботливо туда положил и адрес запомнил.
Статический метод аналогичен обычной функции вообще во всем, кроме областей видимости. У него даже адрес брать можно и передавать туда, где требуется обычная функция.
А чего там может быть подробнее? Все три ключевых слова создают классы, см. раздел 9.1 стандарта ISO/IEC 14882-2014: "class-key: class, struct, union"
еще бывает enum class :)
но он ненастаящий. :)
еще бывает enum class :)
но он ненастаящий. :)
Ну, это да :))) Тут некоторым коллегам и
кобыла - невестапространство имён - класс :)))Мосье на лекциях по С++ спал штоли?
Мосье вообще не пишет на плюсах, и мало мальски на си =)
статические методы работают со статическими данными, едиными для всех экземпляров.
Могу быть не прав =) бо в моем ЯП нет такого понятия =) точнее небыло во времена учебы =)
Думал, потом еще раз думал, и наверное вы таки правы =) над будет посмотреть чего там и куда.. но выглядит очень логично.
Я когда из запоя выхожу, всегда читаю Коран от Страуструпа. Очень способствует.
Я когда из запоя выхожу, всегда читаю Коран от Страуструпа.
А когда в процессе запоя? Цитируете прочитанное здесь? Неплохо, ктстати, получается.
Нет. Прошу прощенья, но у меня есть одно выстраданное жизнью золотое правило: когда я пью - никому не звоню и к компу в форумы не лезу. Пребываю в самодостаточной сингулярности.
И этта, я не пророк его.
Нет. Прошу прощенья, но у меня есть одно выстраданное жизнью золотое правило: когда я пью - никому не звоню и к компу в форумы не лезу. Пребываю в самодостаточной сингулярности.
И этта, я не пророк его.
Отличное правило, а то мой приятель руководителю позвонил, теперь ЛЭП 500кв обслуживают без его чуткого руководства
Дак опыт - сын ошибок трудных. Неспроста же это правило появилось. :)
Мосье на лекциях по С++ спал штоли?
статические методы работают со статическими данными, едиными для всех экземпляров. Нахрена методу указатель на данные, если он и так знает где они находятся? Компилятор их заботливо туда положил и адрес запомнил.
Если это ко мне, то когда я спал на лекциях, С++ еще в природе не было.
И - да - каюсь, С/С++ для меня не родные языки. Напутал. Даже лишнего параметра не будет.
Очень лень гуглить, но примерно так как вы написали, и зря вы боитесь, я крайне редко неверно помню информацию которую читал давно.
Ну, и на старуху бывает проруха. Боюсь, сейчас - как раз тот крайне редкий случай.
Потому как я не представляю, в какой ситуации компилятор вместо значения может положить адрес или наоборот.
Но вот конкретно упоминание числа 4 наводит на мысль, что имелось в виду: до 4 параметров - в регистрах, а более 4 - в стек. Естественно, на работу со стеком - дополнительные операции. Причем в обе стороны (и когда класть, и когда извлекать). Только помнится, было это не на AVR, а на i386+, а число 4 объясняется списком регистров: EAX, EBX, ECX и EDX.
Если это ко мне, то когда я спал на лекциях, С++ еще в природе не было.
И - да - каюсь, С/С++ для меня не родные языки. Напутал. Даже лишнего параметра не будет.
не не не, это ни в коем случае не Вам, это торчку.
А причем тут ваши ошибки? Использовать for попробывал я и ваши ошибки я не рассматривал.
Так при том. Сам написал - сам и анализируй что получилось. Именно этот процесс анализа и есть учёба на ошибках. А Вы анализ на нас перекладываете.
Сам написал - сам и анализируй что получилось. Именно этот процесс анализа и есть учёба на ошибках. А Вы анализ на нас перекладываете.
Блин. Товарищи. Не мучайте мозги друг другу.
Если Вы Великий учитель, магистр джедаев, то идите и учите студентов! Зачем тут учить??? Тут не нужна ваша "учительская мудрость" в духе "Ты, ученик мой ответ внутри себя найдешь, незачем тебе на формах лазить".
Тут люди начинающие ищут ответ на вопрос: А как бы сделал профессионал. И ВСЕ!
По сути форум - обмен знаниями между тупыми и умными. Что бы тупые стали умными. Но! Внимание!
Если ты типа умный, то не надо делать мозги! типа "Сам анализируй, зачем тебе голова". Мозгодел.
Изза таких мозгоделов, типа умных форумы перелиты водой, читать много приходится ругачки в сообщениях и оправдываний самого мозгодела.
Ответ типа "Сам анализируй" - ответ плохого человека. Можно вообще не отвечать, и без умничаний ваших тут тема продолжится.
Учебу он тут организовал. Лектор. Профессор кислых щей. Экзаменатор тут нашелся.
Нет бы сказать по делу, по мужски, а он "А Вы анализ на нас перекладываете". Ну ваще, взвалили на него одного, несет пупок трещит. Как не обосрался только... Анализ на него переложили. Да зачем ты тогда нужен тут на форуме? Анализ видите ли ему претит.
Накипело.
Послесловие.
Нечего мне тут оправдываться или возражать или вообще отписыватсья. Вообще мне пишите никто.