Новый вскусняшки С++ в IDE 1.8.10
- Войдите на сайт для отправки комментариев
Когда-то, с подачи wdrakula, я писал, что если поставить в IDE 1.8.9 опцию С++17, то можно пользоваться разделителем разрядов чисел (например, писать 16'000'000 вместо трудночитаемого 16000000) и нормальными constexpr функциями, но, к сожалению, не поддерживаются "if constexpr" и, самое интересное - свёртки.
Поставил IDE 1.8.10, заметил, что там более свежий релиз GCC и полез смотреть как оно там.
Выяснил, что теперь и "if constexpr" и свёртки поддерживаются. Сейчас исследую как это реализовано (например, насколько эффективны свёртки), а также смотрю какие ещё вкусности появились.
Надо писать здесь о результатах и о том, как этими вкусностями пользоваться? А то, если это никому нафиг не сдалось, мне жаль пальцы об клавиши бить.
мне интересно, как пользоваться 000'000'000 ?
как, блин, этим можно хоть как-то пользоваться?
мне интересно, как пользоваться 000'000'000 ?
как, блин, этим можно хоть как-то пользоваться?
Ну, лично Вас я, как Вам известно, консультирую только на коммерческой основе. Сегодня, ради того, что Луна в знаке Овна за два дня до полнолуния, я сделаю исключение и отвечу на этот вопрос, но впредь (если захочется узнать как свёрткой пользоваться, например) - размещайте заказ на "Ищу исполнителя".
И что, в порт правда выводит "16'000'000"?
Запустите :)
Нет, конечно, это чисто для читабельности текста программы, чтобы не считать нули в попытках понять там 16МГц или 1,6МГц (в том же экселе есть опция разделения разрядов для тех же целей).
Кстати, попробовал свёртку на тривиальном примере. Один в один с ручным написанием (без свёртки) и по времени, и по памяти. Буду придумывать менее тривиальный пример.
А этот - вот он (задача: выдать на пин 10 операцию OR по пинам 2-4, а на пин 11 - операцию OR по пинам 5-6)
Запустите :)
А зачем запускать то, результат чего известен заранее?
Лично я отношусь с категоричным сторонникам принципа "если работает, ничего не трогай!", поэтому у меня стоит v.1.6.5.
Ну, лично Вас я, как Вам известно, консультирую только на коммерческой основе. Сегодня, ради того, что Луна в знаке Овна за два дня до полнолуния, я сделаю исключение и отвечу на этот вопрос, но впредь (если захочется узнать как свёрткой пользоваться, например) - размещайте заказ на "Ищу исполнителя".
судя по тому, как часто российские космолёты падают в Туву - лично вашим студентам ваша работа и даром не нужна.
это нихера не ответ на мой вопрос.
А эта штука наплодит функций под кажный вариант, как и в ранних gcc?
Хотя, видимо, всё развернётся в такое?
Ну, разумеется. И дело тут не в ранних GCC, а в шаблонах - они по жизни плодят по одной функции под каждый уникальный набор параметров.
это нихера не ответ на мой вопрос.
Значит, Вам не повезло :(
Цикл по массиву (range-based for statement). Симпатично. Работает
А как там насчёт захвата *this лямбдами и инициализации в if'ах и switch'ах? А inline переменные пашут?
За лямбды сами разбирайтесь или Пуха зовите.
inline переменные и локальные объявления в if и switch - легко:
А эта штука наплодит функций под кажный вариант, как и в ранних gcc?
Хотя, видимо, всё развернётся в такое?
вот можешь жеж, это возвращаясь к скетчу для 328PB по поочередной проверке всех таймеров миганием диода на 13-м
Сорри, вчера как-то пропустил.
Хотя, видимо, всё развернётся в такое?
Не совсем так.
Свёртки бывают левосторонние и правосторонние, а также унарные и бинарные. У меня в примере унарная правосторонняя свёртка и она развернётся в
Обратите внимание на порядок выполнения операций - справа налево.
Обратите внимание на порядок выполнения операций - справа налево.
Порядок определяется тем, что вычисляется условие (как "ленивое сравнение" в if()) или же это свойство новомодной свёртки?
Порядок - свойство свёртки. Но ленивость никто не отменял - она сама по себе.
Если бы вместо
return
(digitalRead(args) || ...);
было написано
return
(... ||
digitalRead(args));то это была бы левосторонняя свёртка и скобки стали бы наоборот, чтобы слева направо выполнялось.
Да Вы сами поэкспериментируйте. Надо только в platforms.txt заменить -std=gnu++11 на -std=gnu++1z, чтобы 2017-ый стандарт включить. (почему "z" - не знаю, вроде 7 тоже работала, но в документации сказано "z")
а авто авто можно писать?
мне больше всего нравилось это
auto var = blablafunc();
и это
for each (auto var in obj)
и очень не нравится что написанный код на Си как черный ящик в плане того что я не могу посмотреть какой там ассемблер сгенерировал компилятор для того или иного кода на Си
или есть где то такой файл с ассемблером в папке с проектом?
Если бы вместо
return
(digitalRead(args) || ...);
было написано
return
(... ||
digitalRead(args));то это была бы левосторонняя свёртка и скобки стали бы наоборот, чтобы слева направо выполнялось.
А, ну я понял, - троеточие определяет направление подстановки аргументов из декларации функции.
Штука интересная, но надо подумать, конечно, где она выгодно ляжет в код...
а авто авто можно писать?
Ради Бога. Это и раньше можно было. Прямо "из коробки" безо всяких изменений опций.
for each
Если std поставите
я не могу посмотреть какой там ассемблер сгенерировал компилятор
Ну, кто ж Вам виноват, что Вы не можете. Кому надо - могут.
или есть где то такой файл с ассемблером в папке с проектом?
Поставите нужные опции - будет.
подскажите где какие опции поставить чтоб файлик с ассемблером улицезреть? плиз
А, ну я понял, - троеточие определяет направление подстановки аргументов из декларации функции.
Оно (отточие) ещё и посерёдке бывает в бинарных свёртках. Погуглите и попробуйте в реальном компиляторе.
подскажите где какие опции поставить чтоб файлик с ассемблером улицезреть? плиз
Я так сходу не помню, это рыться надо - искать, а тут рабочий день начинается. Откройте отдельную тему, кто-нить подскажет или уж я после рабочего дня поищу и напишу.
Это "Ваш проблем". Arduuino IDE тут не при делах.
За лямбды сами разбирайтесь
Вот, до чего ж народ ленивый! Всё самому надо делать!
Пух, нет повода не выпить, *this нормально передаётся через замыкание, а заодно и умолчания для параметров шаблонов нормально работают.
Пример - неблокирующий блинк на 4 Гц
Вот, до чего ж народ ленивый! Всё самому надо делать!
Так ото ж!
О, в си подвезли foreach (#11), к 2020 году-то :)
вы чо тут кодом материтесь-то? Мы с котом смотрим в это мракобесие и плачем. :(
О, в си подвезли foreach (#11), к 2020 году-то :)
Фигвам! Это не настоящий foreach. Хотя, он во многих языках не настоящий.
вы чо тут кодом материтесь-то? Мы с котом смотрим в это мракобесие и плачем. :(
Дед, ставь десятку, пиши в platforms.txt -std=gnu++1z (заместо -std=gnu++11) и присоединяйся к веселью!
Дед, ставь десятку, пиши в platforms.txt -std=gnu++1z (заместо -std=gnu++11) и присоединяйся к веселью!
Куды нам, я 80% здесь написанного не понимаю. :(
Осталось сделать на си динамическое создание веб страниц и все будет в шоколаде.
astwo
http://cppcms.com/wikipp/ru/page/main
Но это не в среде ардуино.
вы чо тут кодом материтесь-то? Мы с котом смотрим в это мракобесие и плачем. :(
Согласен... был же нормальный язык, 20 операторов, три вида скобочек...
Куды нам, я 80% здесь написанного не понимаю. :(
Ой, не прибедняйтесь.
подскажите где какие опции поставить чтоб файлик с ассемблером улицезреть? плиз
Я так сходу не помню, это рыться надо - искать, а тут рабочий день начинается. Откройте отдельную тему, кто-нить подскажет или уж я после рабочего дня поищу и напишу.
Женя! Тема твоя, но может прогодится?
ОФФТОП
команда для эльфа из /tmp каталога (сборочный каталог) такая:
показывает на экране. Обычно этого достаточно, но можно украсить жизнь финтифлюшкой.
"Рецепты" из ардуино иде не принимают перенаправление вывода. Поэтому, для полной автоматизации процесса нужно написать скриптик и положить его куда-то. Например туда, где компилятор лежит.
Вот такой скриптик, он для Линукса. У того, кто "дошёл до жизни такой" хватит ума переписать для "винды богомерзкой". ;)))) Путь не нужно повторять в мой домашний каталог! ;)))
и вот так его подключить к копированию хекса в папку проекта:
Тогда, при нажатии на "Экспорт бинарного файла", в папку ляжет и дизассемблер.
-----------
сорри, что не написал - это platform.txt ессно! ;))) а то не все продвинуты.
За лямбды сами разбирайтесь
Вот, до чего ж народ ленивый! Всё самому надо делать!
Пух, нет повода не выпить, *this нормально передаётся через замыкание, а заодно и умолчания для параметров шаблонов нормально работают.
Пример - неблокирующий блинк на 4 Гц
а быстрее можно?
а быстрее можно?
В первой строке задаётся половина периода в миллисекундах.
За лямбды сами разбирайтесь
Вот, до чего ж народ ленивый! Всё самому надо делать!
Пух, нет повода не выпить, *this нормально передаётся через замыкание, а заодно и умолчания для параметров шаблонов нормально работают.
Пример - неблокирующий блинк на 4 Гц
а быстрее можно?
Можно. Но это уже в Ищю исполнителя.
сорри, что не написал - это platform.txt ессно! ;))) а то не все продвинуты.
а где он лежит platform.txt этот? не сочтите за наглость
а где он лежит platform.txt этот? не сочтите за наглость
<где установлена IDE>\hardware\arduino\avr
Спасибо, Влад.
За лямбды сами разбирайтесь
Вот, до чего ж народ ленивый! Всё самому надо делать!
Пух, нет повода не выпить, *this нормально передаётся через замыкание, а заодно и умолчания для параметров шаблонов нормально работают.
Пример - неблокирующий блинк на 4 Гц
а быстрее можно?
Можно. Но это уже в Ищю исполнителя.
мне не лениво проверить, теоретически здесь 1 миллисекунда, щас посмотрю )))
мне не лениво проверить, теоретически здесь 1 миллисекунда, щас посмотрю )))
А чего там смотреть, меньше миллисекунды быть не может, millis дробных частей не выдаёт.
Поставил .10, поправил platform.txt (только -std=...) ну и сразу начались сложности, пишет
cc1.exe*: warning: command line option -std=gnu++1z is valid for C++\ObjC++ but not for C
и для классов, которые унаследованы от класса с виртуальным деструктором пишет, например
AnalogSensor.h:64: undefined reference to operator delete(void*, unsigned int)
в родительском классе деструктор определен так
новый стандарт выявил пахнущий код?))
надо опцию supress warning level 4))
Куды бечь?
Давай по порядку.
cc1.exe*: warning: command line option -std=gnu++1z is valid for C++\ObjC++ but not for C
Это ты не в тудой поставил. Ты поставил в строку "compiler.c.flags=...". А надо было в "compiler.cpp.flag"
AnalogSensor.h:64: undefined reference to operator delete(void*, unsigned int)
Ну, про это я забыл сказать :(
Обычно это не вызывает ошибок, только предупреждение, но вот у тебя такие деструкторы используются, потому ошибка.
Там надо просто в файл ...\hardware\arduino\avr\cores\arduino\new.cpp, прямо в евойный хвост, добавить две новые функции
Сделай, и всё заработает.
спасибо, счас пропробоваем.
Upd. Да, всё заработало как встарь. Благодарю категорически, налью при случае