-
- brainfuck? - BlackPrapor(12.01.2022 09:14)
- Ещё пару лет назад делал все тоже самое + писал парсер на питоне для xml из cubeMX, чтобы автоматом генерить портянки со списком портов и gpio на них. Потом пришлось забить на это из-за дефицита - семейств контроллеров стало слишком много, под всё библиотек не напишешь. Сейчас дроблю программу на bsp и логику, библиотеки беру от вендора. Кривые, да, ну и хрен с ним. - evgeniy1294(12.01.2022 09:07)
- Вот смотрю я на это и возник такой вопрос - мне одному синтаксис
современного C++ кажется малопонятным и трудночитаемым? Кто
использует его альтернативы (Rust, Zig, D и т.п.) - их исходники
читать проще или это проблема всех современных языков из-за их
большого количества поддерживаемых фич? - arhiv6(12.01.2022 08:02)
- Синтаксис раста ещё более всрат. Остальное - что-то совсем маргинальное. - evgeniy1294(12.01.2022 09:08)
- Наоборот, современный cpp позволяет сильно проще писать и
соответственно читать сложные программы. Во времена Александреску
код, делающий меньшее, вообще нечитаем был. А непонимание вызвано
всего лишь незнанием языка. Это только кажется, что зная С можно
С++ понимать. Это другой язык, его надо изучить, чтобы понимать
написанное. - VladislavS.(12.01.2022 08:17)
- Знать надо C++ или его стандартную библиотеку? Или Вы не делаете
различий между ними? VVB(529 знак., 12.01.2022 08:46 - 12:11)
- В основном сам язык. Стандартную библиотеку тоже, желательно. Вот в
данном примере применено два шаблона из std. На них построена
работа функции. Но вся синтаксическая сложность как раз не в них. А
в вариативном шаблоне и вариатвной шаблонной лямбде, а это
синтаксис языка, а не стандартной библиотеки. Давайте я поясню что
там написано, а вы скажете насколько просто это на С будет
написать. VladislavS.(2277 знак., 12.01.2022 09:23 - 09:29)
- Спасибо.
Я в ужасе.Ждем появления отладчиков, позволяющих выполнять компиляцию в пошаговом режиме. Cкpипaч(447 знак., 14.01.2022 11:35 - 11:47)- С++ позволяет больше информации об объекте использовать на этапе
компиляции. Он позволяет, но не обязывает писать программы для
компилятора. Хочу показать простой пример, который можно запросто
реализовать на препроцессоре. VladislavS.(810 знак., 14.01.2022 22:27, ссылка)
- Ну и ржака-то в том, что шаблонное метапрограммирование C++ это как раз, не "знание об объекте в одном месте", а порой разбросано по файлу и даже ряду файлов. - RxTx(15.01.2022 00:38)
- Касаемо последней фразы - можно поспопорить. Напоминаю собравшимся
что термин "метапрограммирование" можно понимать как препроцессирование программ. Или что то же самое, программной манипуляцией фрагментами других
программ. (Если этим способен заниматься сам язык над собой же, то
это называется рефлексией). Представим, что препроцессированием,
оно же метапрограммированием занимается какой-то специально
созданный язык и соответственно, существует отдельная программа, RxTx(743 знак., 15.01.2022 00:22)
- Чтобы какая-то внешняя программа могла обработать код, тот в свою очередь должен быть соответствующим образом оформлен. Получается, что вы пишете код по правилам той самой внешней программы. Сейчас такая программа одна - компилятор С++ и правила для всех едины. Если таких программ и соответственно правил будет много, то о понимании написанного можно забыть. Сейчас, программа на С++ читается однозначно, именно так как написана. Крайние случаи, когда операторы VladislavS.(281 знак., 15.01.2022 09:01)
- Слово "инкаплулировано" означает "спрятано"? :) - Cкpипaч(14.01.2022 22:45)
- Да. Это первый из трёх принципов ООП. Инкапсуляция - добро,
наследование - так сяк, полиморфизм - зло. - VladislavS.(14.01.2022 22:54)
- То что вы утверждаете выше называется "principle of locality" в инженерии вообще, к ООП инкапсуляции это не имеет отношения. - RxTx(15.01.2022 00:40)
- Современное программирование - паттерны. Cкpипaч(130 знак., 14.01.2022 23:00)
- Одно из значений слова pattern - шаблон :)))) - VladislavS.(14.01.2022 23:08)
- ...и среди них нет слова "метафора". Английский язык он такой :) - Cкpипaч(14.01.2022 23:27)
- Одно из значений слова pattern - шаблон :)))) - VladislavS.(14.01.2022 23:08)
- Да. Это первый из трёх принципов ООП. Инкапсуляция - добро,
наследование - так сяк, полиморфизм - зло. - VladislavS.(14.01.2022 22:54)
- На меня давит опыт разработки на Модула-2. Без метапрограммирования. Cкpипaч(237 знак., 14.01.2022 22:42)
- Не подсказывайте им ответы. Так они и make тоже запихнут внутрь
плюсов. Это чорная дыра, которая может только разрастаться и
поглощать всё вокруг себя. - SciFi(14.01.2022 11:37)
- Повторюсь о фейковом(?) интервью
СтолманаСтраструпа. Все было уже давно сказано, не услышавшие тогда, не услышат и сейчас :) - Cкpипaч(14.01.2022 11:41 - 11:59)- Мы все поняли, кого именно вы имели в виду. Но вообще да, этот перформанс затянулся :-) - SciFi(14.01.2022 11:44)
- Повторюсь о фейковом(?) интервью
- С++ позволяет больше информации об объекте использовать на этапе
компиляции. Он позволяет, но не обязывает писать программы для
компилятора. Хочу показать простой пример, который можно запросто
реализовать на препроцессоре. VladislavS.(810 знак., 14.01.2022 22:27, ссылка)
- Спасибо за терпение к столь разношерстному сообществу, как наше. Почерпнул много нового из Ваших ответов! - VVB(14.01.2022 11:13)
- Сторонний человек может подумать о шизофрении. Извините. Как минимум оверинжиниринг. Если я правильно понял задачу, то для её решения напрашивается std::map. А на С можно сделать всё, как и на асме, это чисто в теории. А на практике - через массив пинов. - Costic(12.01.2022 11:43)
- У меня напрашивается только один комментарий-вопль: "ДЕРЖИТЕ
НАРКОМАНА!" symbions(304 знак., 12.01.2022 10:48)
- Как уже сказали, размер шаблона никак не связан с размером
результирующего кода. Он может вычисляться в несколько констант и
наоборот сокращать выхлоп. Это будет работать даже на тиньке. - VladislavS.(12.01.2022 10:58)
- Это я понял, но у меня программа как ваши 2 шаблона - зачем мне
писать шаблон + его применение + остальную программу, если я могу
сразу написать как надо? Соотношение писанины как минимум 3 к 2 - symbions(12.01.2022 13:54)
- Один NOP проще без шаблонов написать, а десяток проще уже с
шаблоном. - VladislavS.(12.01.2022 14:16)
- Вот так VladislavS.(130 знак., 12.01.2022 14:49)
- А мне этот код понравился... До того момента, как я подумал
вставить задержку для мигания светодиодом, например,
Nops<1000000>(); это ж у меня прошивка сразу +1МБ. :-) - Costic(13.01.2022 11:58)
- 1 Мб это вы ещё легко отделались, NOP то он и больше 1 байта бывает. С дуру то и хрен сломать можно. - VladislavS.(13.01.2022 12:35)
- интересный случай... развернуть рекурсию в "длинну". др. словами если не ведаешь как реализована та или иная "вещь в библиотеке" можно попасть на такую хрень... Ну это "допустимо" на винче в 20ТБ и озу в 1 ТБ и 53 ядерном проце. - Zoro(13.01.2022 12:20)
- а так читабельнее: Mahagam(157 знак., 12.01.2022 23:46)
- Куда я попал.... :( Сами посмотрите как этот макрос будет работать
в таком месте? VladislavS.(1340 знак., 13.01.2022 00:07)
- Давайте посмотрим на это с другой стороны. Например, исходное
состояние, вы пишете какую-то программу и вам там понадобилось
поставить 100 ноп-ов. Ни каких макросов или шаблонов у вас еще нет.
Какие варианты? AlexBi(1582 знак., 13.01.2022 09:11)
- Специализацию для NonsensePost<"шаблон", "AlexBi">() вы только что сделали. Но ведь можно легко подставить туда же "макрос", "функция" и т.д. VladislavS.(65 знак., 13.01.2022 09:30)
- в 99% случаев все подобные примеры - выдуманы. на практике вместо
написания шаблона я в удобном текстовом редакторе вызов функции раз
10 размножу. ибо мне этот шаблон хрен где в другом месте
пригодится. - Mahagam(13.01.2022 00:23)
- А что такое? Не выходит
каменный цветокмакрос? А как люто плюсовал то. - VladislavS.(13.01.2022 00:32)- суть не в том, что на макросах сложно сделать 73 повторения, или
повторять любую функцию с любыми параметрами. а в том, что для
множества частных случаев простые макросы Си - вполне себе простое
и удобное решение. неуниверсальное, да. местами приводящее к
ошибкам. но чаще всего - рабочее. оно выглядит читабельнее чем
плюсы. почему-то - Mahagam(13.01.2022 01:34)
- Неуневирсально, не раборает, зато понятно почему. Зашибись! А что
лично вы сделали чтобы понимать написанное на С++? Может книжку
какую прочитали? - VladislavS.(13.01.2022 07:29)
- а с чего понимабельность плюсов падает с каждым стандартом? - Mahagam(13.01.2022 12:35)
- На самом деле с точностью до наоборот. В современных стандартах код пишется проще и более читаем. VladislavS.(631 знак., 13.01.2022 13:02)
- Как я всё больше убеждаюсь - универсальность зло. - symbions(13.01.2022 08:46)
- а с чего понимабельность плюсов падает с каждым стандартом? - Mahagam(13.01.2022 12:35)
- Неуневирсально, не раборает, зато понятно почему. Зашибись! А что
лично вы сделали чтобы понимать написанное на С++? Может книжку
какую прочитали? - VladislavS.(13.01.2022 07:29)
- Подмена цели detected. - Cкpипaч(13.01.2022 00:41)
- суть не в том, что на макросах сложно сделать 73 повторения, или
повторять любую функцию с любыми параметрами. а в том, что для
множества частных случаев простые макросы Си - вполне себе простое
и удобное решение. неуниверсальное, да. местами приводящее к
ошибкам. но чаще всего - рабочее. оно выглядит читабельнее чем
плюсы. почему-то - Mahagam(13.01.2022 01:34)
- А что такое? Не выходит
- Давайте посмотрим на это с другой стороны. Например, исходное
состояние, вы пишете какую-то программу и вам там понадобилось
поставить 100 ноп-ов. Ни каких макросов или шаблонов у вас еще нет.
Какие варианты? AlexBi(1582 знак., 13.01.2022 09:11)
- ; самым правым символом в ряду а не хватает - Evgeny_CD(12.01.2022 23:56)
- о. уже скомпилировал ) - Mahagam(13.01.2022 00:05)
- Куда я попал.... :( Сами посмотрите как этот макрос будет работать
в таком месте? VladislavS.(1340 знак., 13.01.2022 00:07)
- Такое да, понятно зачем symbions(135 знак., 12.01.2022 16:15)
- А мне этот код понравился... До того момента, как я подумал
вставить задержку для мигания светодиодом, например,
Nops<1000000>(); это ж у меня прошивка сразу +1МБ. :-) - Costic(13.01.2022 11:58)
- Вот так VladislavS.(130 знак., 12.01.2022 14:49)
- Один NOP проще без шаблонов написать, а десяток проще уже с
шаблоном. - VladislavS.(12.01.2022 14:16)
- Это я понял, но у меня программа как ваши 2 шаблона - зачем мне
писать шаблон + его применение + остальную программу, если я могу
сразу написать как надо? Соотношение писанины как минимум 3 к 2 - symbions(12.01.2022 13:54)
- аттини надо программить в хексе, как полагается настоящим мущщинам! - SciFi(12.01.2022 10:52)
- Размер шаблона никак не связан с размером кода. Шаблоны мощная
штука, понять их сильно не просто. Я вот не шибко силен в
понимании. - Evgeny_CD(12.01.2022 10:51)
- Я объясню. RxTx(4409 знак., 14.01.2022 22:16 - 22:45)
- Верно лишь отчасти. Когда земля была ещё чуть тёплой, программисты
заметили, что автоматическим выведением типов с помощью шаблонов
можно управлять. Так же, можно управлять ходом компиляции с помощью
технологии SFINAE. Вместе они (template + SFINAE) начали порождать
монстров типа Loki. Но сапиенс на то и хомо, что решил с этим
бороться. В языке появились средства вычислений на этапе компиляции
без шаблонов. Заодно они фактически заменили препроцессор на более
качественном VladislavS.(813 знак., 14.01.2022 22:57, ссылка, ссылка)
- Все что было написано выше - совершенно намеренный опуск/упрощение
деталей. Не стоит заниматься уточнением того что изначально должно
быть простым. © "Если учёный не может объяснить восьмилетнему
мальчику чем он занимается - он шарлатан" (Колыбель для кошки). - RxTx(14.01.2022 23:10)
- Почитают они это наши мальчики, подумают "всё это только чтобы
#ifdef не писать?" и пойдут питон осваивать. - VladislavS.(14.01.2022 23:22)
- Разумеется, кое-что нужно добавить, но уже потом. После того как
возникнет отчётливое представление что это такое в точности. Основной задачей было передать — "C++ templates" есть метод препроцессирования программы, очень развитый препроцессор. Добавить потом можно многое,
например что при разворачивании кода есть (косвенные) способы
инспектировать подставляемые типы на предмет наличия свойств, а это
ни что иное как вид рефлексии, т.е. само-исследования RxTx(116 знак., 14.01.2022 23:53)
- Да легко! Что вы все на шаблонах зациклены? Это лишь один из инструментов. Плюсы начинаются с классов. И у меня шокирующая новость для С-программистов. Они всё это время используют в коде классы! В С++ class и struct это по сути одно и то же, за исключением мелкого нюанса. Добавляете в struct-уру функции и можете смело называть их методами, а себя кулхацкерами :) - VladislavS.(15.01.2022 09:10)
- Разумеется, кое-что нужно добавить, но уже потом. После того как
возникнет отчётливое представление что это такое в точности. Основной задачей было передать — "C++ templates" есть метод препроцессирования программы, очень развитый препроцессор. Добавить потом можно многое,
например что при разворачивании кода есть (косвенные) способы
инспектировать подставляемые типы на предмет наличия свойств, а это
ни что иное как вид рефлексии, т.е. само-исследования RxTx(116 знак., 14.01.2022 23:53)
- "Не сыпь мне соль на рану" Я три дня убил на функцию описание
которой занимало пол страницы печатного текста! Когда разобрался
сформулировал в одно предложение "Отсчет долен стартовать только
при положении селектора АКПП в паркинге и не нажатой педали
тормоза" Убил бы песателей !!! - Aleksey_75(14.01.2022 23:18)
- Знакомо :) - RxTx(14.01.2022 23:22)
- Почитают они это наши мальчики, подумают "всё это только чтобы
#ifdef не писать?" и пойдут питон осваивать. - VladislavS.(14.01.2022 23:22)
- Все что было написано выше - совершенно намеренный опуск/упрощение
деталей. Не стоит заниматься уточнением того что изначально должно
быть простым. © "Если учёный не может объяснить восьмилетнему
мальчику чем он занимается - он шарлатан" (Колыбель для кошки). - RxTx(14.01.2022 23:10)
- Страуструп Дизайн и Эволюция C++.djvu Довольно малоизвестная книга, проливающая свет на происходяшее. RxTx(1 знак., 14.01.2022 22:21, ссылка)
- Верно лишь отчасти. Когда земля была ещё чуть тёплой, программисты
заметили, что автоматическим выведением типов с помощью шаблонов
можно управлять. Так же, можно управлять ходом компиляции с помощью
технологии SFINAE. Вместе они (template + SFINAE) начали порождать
монстров типа Loki. Но сапиенс на то и хомо, что решил с этим
бороться. В языке появились средства вычислений на этапе компиляции
без шаблонов. Заодно они фактически заменили препроцессор на более
качественном VladislavS.(813 знак., 14.01.2022 22:57, ссылка, ссылка)
- Я объясню. RxTx(4409 знак., 14.01.2022 22:16 - 22:45)
- Как уже сказали, размер шаблона никак не связан с размером
результирующего кода. Он может вычисляться в несколько констант и
наоборот сокращать выхлоп. Это будет работать даже на тиньке. - VladislavS.(12.01.2022 10:58)
- Вопрос, который уменя в голове не укладывается - как подобное
тестировать? - Evgeny_CD(12.01.2022 10:08)
- Во-первых, static_assert. VladislavS.(456 знак., 12.01.2022 10:21)
- Какие инструменты модульного тестирования (на ПК) можно
использовать для вариативного шаблона, вариативной шаблонной лямбде
и прочих прелестей С++20? VVB(98 знак., 14.01.2022 11:27)
- Любую систему тестирования. Разницы никакой, поскольку тестируется
конечный выполняемый бинарный код полученный из шаблона. Сами по
себе шаблоны смысла тестировать нет. RxTx(443 знак., 15.01.2022 00:54)
- Э не... В шаблоне могут быть алгоритмы работы с типами, влияющими на результат инстанцирования. Эти алгоритмы тоже надо как-то проверять. Сейчас это делается руками. Проверка инстанцированного кода это уже прикладная задача. Но ведь библиотечный код, состоящий из шаблонных классов, тоже надо проверять. VladislavS.(492 знак., 15.01.2022 08:26)
- Попробую показать как можно тестировать работу метапрограмм. VladislavS.(2421 знак., 14.01.2022 20:29)
- Я для ПК почти не пишу, так что и без шаблонных лямбд затрудняюсь ответить на этот вопрос. Из общих соображений. Любая программа в конце концов принимает на вход реальные данные и на выходе что-то производит. Вот и нужно найти такое сечение где ещё/уже нет шаблонов. В эмбедде я пользуюсь выводом отладочной информации, осциллографом и логическим анализатором, заглядываю отладчиком в регистры. Просто листинги смотрю. Это всё не зависит от того есть там лямбды или нет. - VladislavS.(14.01.2022 18:33)
- Любую систему тестирования. Разницы никакой, поскольку тестируется
конечный выполняемый бинарный код полученный из шаблона. Сами по
себе шаблоны смысла тестировать нет. RxTx(443 знак., 15.01.2022 00:54)
- Тестировать глазками асмовый код - это спираль развития зашла на новый виток. Так было где-то на заре развития компиляторов. - Evgeny_CD(12.01.2022 10:49)
- Это уже было. "Оно скомпилировалось? Да, босс. Оно запустилось? Да, босс. Оно показало заставку? Да, босс! Так почему мы еще не продаем его?!" Из анекдотов про Билла нашего Гейтса. - Evgeny_CD(12.01.2022 10:46)
- 1) Смысл тестирования в том, чтобы загнать на вход всё возможные
значения и во всех случаях получить корректный результат.
Тестирование должно быть автоматизированным, тест пишется один раз.
В случае шаблонного кода это сложно или невозможно реализовать. evgeniy1294(334 знак., 12.01.2022 10:31)
- Код сам себя постоянно тестирует. Сейчас в ход концепты пошли. Вы
параметры шаблонов так можете обложить, что ни одна муха не
проскочит. Отсутствие повторений при каждой компиляции проверяется
автоматом. VladislavS.(682 знак., 12.01.2022 10:51)
- Всё это в своё время я уже делал. Допустить ошибку в какой-нибудь
проверочной лямбде довольно легко, так что код безопасней не
становится. Вы можете сказать, что ошибки будут выловлены,
когда-нибудь, но производитель уже сделал это за вас. evgeniy1294(1 знак., 12.01.2022 11:03, ссылка)
- В таком виде это не сильно отличается от того что можно сделать
макросами в С. Ну, разве что, более строгая проверка типов.
Например, метод Toggle. VladislavS.(1508 знак., 12.01.2022 11:35)
- * В таком виде это не сильно отличается от того что можно сделать
макросами в С. evgeniy1294(783 знак., 12.01.2022 12:19)
- Зачем вы делаете выводы о моём коде по паре функций из библиотеки? То что пишется эвридэй сильно проще. :) VladislavS.(1057 знак., 12.01.2022 13:15)
- У вас глагол is отсутствует в static_assert. This gpio IS not... А
по коду ппц неаккуратно с указателями. И constexpr любимый вами
загромождает код. Думаю, и без этого компилятор умеет
оптимизировать. 0xFFFF надо заменить на какой-нибудь const или
#define (шучу). - Costic(12.01.2022 11:59)
- IS отсутствует в моём коде. Ну да и хрен с ним, я эту либину забросил. - evgeniy1294(12.01.2022 12:22)
- * В таком виде это не сильно отличается от того что можно сделать
макросами в С. evgeniy1294(783 знак., 12.01.2022 12:19)
- В таком виде это не сильно отличается от того что можно сделать
макросами в С. Ну, разве что, более строгая проверка типов.
Например, метод Toggle. VladislavS.(1508 знак., 12.01.2022 11:35)
- Всё это в своё время я уже делал. Допустить ошибку в какой-нибудь
проверочной лямбде довольно легко, так что код безопасней не
становится. Вы можете сказать, что ошибки будут выловлены,
когда-нибудь, но производитель уже сделал это за вас. evgeniy1294(1 знак., 12.01.2022 11:03, ссылка)
- Код сам себя постоянно тестирует. Сейчас в ход концепты пошли. Вы
параметры шаблонов так можете обложить, что ни одна муха не
проскочит. Отсутствие повторений при каждой компиляции проверяется
автоматом. VladislavS.(682 знак., 12.01.2022 10:51)
- Какие инструменты модульного тестирования (на ПК) можно
использовать для вариативного шаблона, вариативной шаблонной лямбде
и прочих прелестей С++20? VVB(98 знак., 14.01.2022 11:27)
- Никак. Дополнительно возникает проблема с множественной
вложенностью шаблонов и наследовании типов - мне удалось получить
невалидную прошивку несмотря на отсутствие ошибок и предупреждений
от компилятора (gcc). Проблема была именно по вложенности шаблонов,
так как меняя её я получал разный результат. - evgeniy1294(12.01.2022 10:15)
- Сейчас всё больше и больше можно делать просто в constexpr
контексте. Конечно, вообще без шаблонов никуда. Но если вспомнить
Loki, где вложенность шаблонов и рекурсивность были беспредельны,
то сейчас это просто вариадики и constexpr, а вложенность шаблонов
невысока. - VladislavS.(12.01.2022 10:29)
- Однако Loki в итоге забросили. Каменты там интересные. Evgeny_CD(1 знак., 12.01.2022 12:56, ссылка)
- Loki забросили, так как с приходом новых стандартов она стала неактуальна. Сейчас это пишется сильно проще и с большим функционалом. - VladislavS.(12.01.2022 13:21)
- Получал невалидное поведение при вложенности 5-7, чего легко достичь при наличии сложных статических проверок и наследовании шаблонных параметров. - evgeniy1294(12.01.2022 10:36)
- Однако Loki в итоге забросили. Каменты там интересные. Evgeny_CD(1 знак., 12.01.2022 12:56, ссылка)
- Сейчас всё больше и больше можно делать просто в constexpr
контексте. Конечно, вообще без шаблонов никуда. Но если вспомнить
Loki, где вложенность шаблонов и рекурсивность были беспредельны,
то сейчас это просто вариадики и constexpr, а вложенность шаблонов
невысока. - VladislavS.(12.01.2022 10:29)
- Во-первых, static_assert. VladislavS.(456 знак., 12.01.2022 10:21)
- В embedded у меня с метапрограммированием не сложилось. VVB(663 знак., 12.01.2022 09:36)
- Сложные вещи пишутся один раз и прячутся в библиотеки. Интерфейс у
них простой, использовать который даже проще, чем на обычном С
писать. - VladislavS.(12.01.2022 09:42)
- Если окажется что и используются они один раз, то возникает вопрос:
почему бы не написать сразу то, во что разворачивается этот шаблон,
вместо написания шаблона? AlexBi(124 знак., 12.01.2022 11:39)
- Во-первых, вы убиваете основное предназначение шаблона - писать код
один раз для разных типов. VladislavS.(374 знак., 12.01.2022 13:00)
- Серьёзно хочу спросить - для каких "разных типов" у вас код с
пинами написан? У евгения1294 и @ламерка тоже шаблоны для пинов
используются. Ну, не могу я осознать шаблон для пинов. Контейнеры -
это понятно, max/min, но пины?... Обычно они в SDK на чип
прописаны. Проверку пинов через assert делают, причём в том же SDK. - Costic(12.01.2022 14:49)
- У меня написаны классы для GPIO-портов старых STM32 типа F1, новых
STM32, Миландра MDR1986, Cамописного порта для Microblaze,
Dummy-порта (виртуального). VladislavS.(3532 знак., 12.01.2022 16:04)
- Извините, но ответ меня не удовлетворяет. Я интересовался про
"разные типы". Имелись ввиду типы данных, а вы мне про разные
контроллеры. Т.е. у вас шаблон имеет единственное применение - к
Пину. Опровергните? Costic(276 знак., 12.01.2022 16:25)
- Я не понимаю вопрос. Класс принимает на вход GPIO-порты разных
типов (разных контроллеров, реальные, виртуальные). Почему он
должен принимать что-то другое? Он для этого предназначен. Сам же
он агрегируя другие порты ведёт себя как порт. Его можно передавать
в другие классы дальше точно так же как порты и пины. VladislavS.(111 знак., 12.01.2022 17:05)
- Например, шаблоны min и max принимают любые объекты, для которых определён оператор сравнения. Любые, а не
только int, uint16_t. У вас только 1 (единственный) тип - порт/пин. - Costic(13.01.2022 12:04)
- Вы глубоко заблуждаетесь. Каждый пин это ДРУГОЙ ТИП, каждый порт
это ДРУГОЙ ТИП, каждый список пинов это ДРУГОЙ тип. Даже один и тот
же пин с разным режимом работы это ДРУГОЙ ТИП, не говоря уже об их
комбинациях. VladislavS.(319 знак., 13.01.2022 13:26 - 15:26, картинка)
- А нужно это, что-бы не хранить в полях служебную информацию -
адрес, номер бита и пр., а извлекать всё непосредственно из типа, я
правильно понимаю? - =AlexD=(13.01.2022 14:07)
- Совершенно верно. Все свойства объекта (порт, пин, режим)
"хранятся" в его типе. Сам объект не будет занимать память, даже
если я создам его. И он умеет выполнять действия, присущие этому
типу (или объекту). VladislavS.(464 знак., 13.01.2022 15:19)
- Т.е. вы используете шаблоны как (супер-)препроцессор, для генерации
и проверки кода статического во время компиляции. Тут кто-то свой
пример кольцевого буфера на препроцессоре с "##"-директивами кидал.
Суть, примерно та же, но за много лет такая генерация кода не очень
распространена. Впрочем, я благодарен вам за ответы и дискуссию. - Costic(13.01.2022 16:53)
- Я бы не называл это генерацией кода. Это скорее сочетание двух вещей: VladislavS.(1564 знак., 14.01.2022 08:16)
- Не, создание объекта по любому резервирует минимум 1 байт памяти,
потому что у объекта должен быть уникальный адрес. - =AlexD=(13.01.2022 16:46)
- Объект пустой, адрес его я не использую. Оптимизатор его чики-чики. VladislavS.(235 знак., 13.01.2022 17:07)
- если я правильно понял: экземпляр объекта "размазывается по
исполняемому коду" столько раз сколько упоминается (типо inline). В
обычных Си экземпляр объекта занимает память "один раз", а его
функции вызываются столько раз сколько надо. - Zoro(13.01.2022 17:17)
- У этих объектов нечем занимать память, переменных членов класса в них нет. Статические методы вырождаются в обычные функции, которые обладают свойством хорошо инлайниться, так как определены в описании класса. Точно так же как и в С они могут быть один один раз в коде и вызываться из разных мест. Это уже на усмотрение оптимизатора. На самом деле, нет никакой необходимости вообще создавать эти объекты. Это я пример просто для понимания сути происходящего привёл. Намного VladislavS.(288 знак., 13.01.2022 17:57)
- если я правильно понял: экземпляр объекта "размазывается по
исполняемому коду" столько раз сколько упоминается (типо inline). В
обычных Си экземпляр объекта занимает память "один раз", а его
функции вызываются столько раз сколько надо. - Zoro(13.01.2022 17:17)
- Объект пустой, адрес его я не использую. Оптимизатор его чики-чики. VladislavS.(235 знак., 13.01.2022 17:07)
- Вот это я понимаю, вот с этого и надо было начинать агитировать :) symbions(83 знак., 13.01.2022 15:38)
- С литературой сложно. Применительно к эмбедду вообще всё по нулям.
Я начинал с Г.Шилдта, но он уж очень устарел. Если только совсем
никаких знаний по С++ нет, то можно по нему основы изучить. Но
потом С++17 и С++20 придётся самостоятельно подтягивать. Сейчас
много докладов с разных тематических конференций на тытрубе
выкладывают, особенно после выхода новых стандартов. Попадаются
очень интересные. Но это надо увлекаться этим, иначе тяжело. - VladislavS.(13.01.2022 16:14)
- Вот Евгений список выложил symbions(35 знак., 13.01.2022 20:16, ссылка)
- Нет литературы - тогда не взлетит - 3m(13.01.2022 16:53)
- С литературой сложно. Применительно к эмбедду вообще всё по нулям.
Я начинал с Г.Шилдта, но он уж очень устарел. Если только совсем
никаких знаний по С++ нет, то можно по нему основы изучить. Но
потом С++17 и С++20 придётся самостоятельно подтягивать. Сейчас
много докладов с разных тематических конференций на тытрубе
выкладывают, особенно после выхода новых стандартов. Попадаются
очень интересные. Но это надо увлекаться этим, иначе тяжело. - VladislavS.(13.01.2022 16:14)
- Т.е. вы используете шаблоны как (супер-)препроцессор, для генерации
и проверки кода статического во время компиляции. Тут кто-то свой
пример кольцевого буфера на препроцессоре с "##"-директивами кидал.
Суть, примерно та же, но за много лет такая генерация кода не очень
распространена. Впрочем, я благодарен вам за ответы и дискуссию. - Costic(13.01.2022 16:53)
- Совершенно верно. Все свойства объекта (порт, пин, режим)
"хранятся" в его типе. Сам объект не будет занимать память, даже
если я создам его. И он умеет выполнять действия, присущие этому
типу (или объекту). VladislavS.(464 знак., 13.01.2022 15:19)
- А нужно это, что-бы не хранить в полях служебную информацию -
адрес, номер бита и пр., а извлекать всё непосредственно из типа, я
правильно понимаю? - =AlexD=(13.01.2022 14:07)
- Вы глубоко заблуждаетесь. Каждый пин это ДРУГОЙ ТИП, каждый порт
это ДРУГОЙ ТИП, каждый список пинов это ДРУГОЙ тип. Даже один и тот
же пин с разным режимом работы это ДРУГОЙ ТИП, не говоря уже об их
комбинациях. VladislavS.(319 знак., 13.01.2022 13:26 - 15:26, картинка)
- Например, шаблоны min и max принимают любые объекты, для которых определён оператор сравнения. Любые, а не
только int, uint16_t. У вас только 1 (единственный) тип - порт/пин. - Costic(13.01.2022 12:04)
- Я не понимаю вопрос. Класс принимает на вход GPIO-порты разных
типов (разных контроллеров, реальные, виртуальные). Почему он
должен принимать что-то другое? Он для этого предназначен. Сам же
он агрегируя другие порты ведёт себя как порт. Его можно передавать
в другие классы дальше точно так же как порты и пины. VladislavS.(111 знак., 12.01.2022 17:05)
- Извините, но ответ меня не удовлетворяет. Я интересовался про
"разные типы". Имелись ввиду типы данных, а вы мне про разные
контроллеры. Т.е. у вас шаблон имеет единственное применение - к
Пину. Опровергните? Costic(276 знак., 12.01.2022 16:25)
- У меня написаны классы для GPIO-портов старых STM32 типа F1, новых
STM32, Миландра MDR1986, Cамописного порта для Microblaze,
Dummy-порта (виртуального). VladislavS.(3532 знак., 12.01.2022 16:04)
- Серьёзно хочу спросить - для каких "разных типов" у вас код с
пинами написан? У евгения1294 и @ламерка тоже шаблоны для пинов
используются. Ну, не могу я осознать шаблон для пинов. Контейнеры -
это понятно, max/min, но пины?... Обычно они в SDK на чип
прописаны. Проверку пинов через assert делают, причём в том же SDK. - Costic(12.01.2022 14:49)
- Иначе все забудут благородное искусство фехтования! :-) SciFi(1 знак., 12.01.2022 11:42, картинка)
- Во-первых, вы убиваете основное предназначение шаблона - писать код
один раз для разных типов. VladislavS.(374 знак., 12.01.2022 13:00)
- Может и один раз, но для каждого IP-ядра. - evgeniy1294(12.01.2022 10:02)
- Если окажется что и используются они один раз, то возникает вопрос:
почему бы не написать сразу то, во что разворачивается этот шаблон,
вместо написания шаблона? AlexBi(124 знак., 12.01.2022 11:39)
- Сложные вещи пишутся один раз и прячутся в библиотеки. Интерфейс у
них простой, использовать который даже проще, чем на обычном С
писать. - VladislavS.(12.01.2022 09:42)
- Это всё замечательно, но я так и не понял, как и для чего этот
шаблон использовать. - =AlexD=(12.01.2022 09:29)
- А я и не объяснял для чего его использовать. :) Это часть большого
класса. Показал чтобы те кто в теме увидели С++20 фишки в действии.
Считайте это набросом на вентилятор :) - VladislavS.(12.01.2022 09:35)
- В общем всё как обычно сводится к получению некоего синтаксического
сахара используя мета возможности самого языка, что приводит к
нечитаемым монструозным либам, которые всего лишь убирают немножко
рутины из кода, на порядки увеличивая время компиляции. =AlexD=(172 знак., 12.01.2022 09:46)
- Кстати, про рутину. Кто-нибудь предлагал внедрить в язык Си
интерпретатор того же Си на этапе компиляции? Чтобы уйти от
зубодробительных макросов и использовать вычисленные значения в
качестве констант и т.д.? - SciFi(12.01.2022 10:22)
- ну типа constexpr С++ для что-то типа того, можно поэкспериментировать, всяко лучше шаблонной магии - =AlexD=(12.01.2022 10:40)
- Вот это одна из причин, почему поглядываю, как Zig развивается. Там есть выполнение кода во время компиляции. Не думаю, что в Си такое когда-нибудь появится. - arhiv6(12.01.2022 10:36)
- Он изобрёл С++ :))) VladislavS.(2184 знак., 12.01.2022 10:35)
- Вот, как раз зрите в корень. Убирание рутины из кода сильно
сокращает время работы программиста, но увеличивает время полной
компиляции для embedded с 10 до 30 секунд. Что дороже? И часто ли
вы полную пересборку делаете? VladislavS.(91 знак., 12.01.2022 10:10)
- Ну не знаю, сокращает ли. =AlexD=(459 знак., 12.01.2022 10:36)
- Не надо читать нечитаемую либу. Читайте её открытый интерфейс, он
обычно простой, иначе не стоит даже затеваться. - VladislavS.(12.01.2022 10:54)
- Смотреть нужно. Кто-то кроме вас должен понимать код библиотеки, потому как вы можете в любой момент поменять место работы. - evgeniy1294(12.01.2022 11:15)
- Читать приходится начинать, когда компилятор показывает ошибку
кудато унутрь. Врятли ты сможешь предсказать все методы
использования либы. А использовать тривиально - чем это лучше Си
макроса? - =AlexD=(12.01.2022 11:05)
- Тем что С-макрос работает с текстом, а шаблон с типами. - evgeniy1294(12.01.2022 11:16)
- Если шаблон используется тривиально (примерно как вызов функции), то это не существенное отличие. - =AlexD=(12.01.2022 11:29)
- Тем что С-макрос работает с текстом, а шаблон с типами. - evgeniy1294(12.01.2022 11:16)
- Не надо читать нечитаемую либу. Читайте её открытый интерфейс, он
обычно простой, иначе не стоит даже затеваться. - VladislavS.(12.01.2022 10:54)
- Ну не знаю, сокращает ли. =AlexD=(459 знак., 12.01.2022 10:36)
- Кстати, про рутину. Кто-нибудь предлагал внедрить в язык Си
интерпретатор того же Си на этапе компиляции? Чтобы уйти от
зубодробительных макросов и использовать вычисленные значения в
качестве констант и т.д.? - SciFi(12.01.2022 10:22)
- Есть подозрение, что это кусок шаблона для настройки порта. - evgeniy1294(12.01.2022 09:42)
- В общем всё как обычно сводится к получению некоего синтаксического
сахара используя мета возможности самого языка, что приводит к
нечитаемым монструозным либам, которые всего лишь убирают немножко
рутины из кода, на порядки увеличивая время компиляции. =AlexD=(172 знак., 12.01.2022 09:46)
- А я и не объяснял для чего его использовать. :) Это часть большого
класса. Показал чтобы те кто в теме увидели С++20 фишки в действии.
Считайте это набросом на вентилятор :) - VladislavS.(12.01.2022 09:35)
- Спасибо.
- В основном сам язык. Стандартную библиотеку тоже, желательно. Вот в
данном примере применено два шаблона из std. На них построена
работа функции. Но вся синтаксическая сложность как раз не в них. А
в вариативном шаблоне и вариатвной шаблонной лямбде, а это
синтаксис языка, а не стандартной библиотеки. Давайте я поясню что
там написано, а вы скажете насколько просто это на С будет
написать. VladislavS.(2277 знак., 12.01.2022 09:23 - 09:29)
- Знать надо C++ или его стандартную библиотеку? Или Вы не делаете
различий между ними? VVB(529 знак., 12.01.2022 08:46 - 12:11)
- Я смотрю на это и понимаю, что Цэ — идеальный ЯП для МК. Возражения
не принимаются, есличо. - SciFi(12.01.2022 08:10)
- ЯП - я плакал? - Kpoк(12.01.2022 08:58)
- Это только в контексте "ЯП С++". - SciFi(12.01.2022 09:02)
- ЯП - я плакал? - Kpoк(12.01.2022 08:58)