Arlleex 178 17 января Опубликовано 17 января · Жалоба 6 часов назад, AHTOXA сказал: Если нужно, чтобы это всё реализовывалось за одну RMW операцию с регистром, то делаем через вспомогательную переменную, и убираем volatile в параметрах функций apply(): Очень похоже на то, что я хотел, да. Я поразбираюсь, хотя выглядит очень все туманно)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 17 января Опубликовано 17 января · Жалоба 1 час назад, Arlleex сказал: Очень похоже на то, что я хотел, да. Я поразбираюсь, хотя выглядит очень все туманно)) Да там всё просто, кроме магии с распаковкой пакета параметров. Но она тоже постижима 🙂 template <typename ... Operations> // здесь список типов произвольной длины void modifyReg(volatile uint32_t& reg, Operations&& ... ops) // здесь список параметров, каждый параметр имеет тип из списка типов { auto val = reg; (..., (void)ops.apply(val)); // а вот это - распаковка. оператор "запятая" поочерёдно применяется к результату вызова функции apply() для каждого объекта из списка ops reg = val; } Можно ещё через лямбды (wandbox), но этот способ мне меньше нравится. 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 17 января Опубликовано 17 января · Жалоба 1 час назад, AHTOXA сказал: Да там всё просто, кроме магии с распаковкой пакета параметров. Но она тоже постижима 🙂 Благодарю! Иногда возникает чувство, что это не C++ уже вовсе))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 23 18 января Опубликовано 18 января · Жалоба В 17.01.2024 в 21:22, Arlleex сказал: Благодарю! Иногда возникает чувство, что это не C++ уже вовсе))) It's a kind of magic Но в реальной работе лучше обойтись без чудес. Чтобы не было мучительно больно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 18 января Опубликовано 18 января · Жалоба Однако, стоит ли игра свеч, когда уже есть простой способ? Ведь посмотрите, сколько строчек нужно исписать, чтобы заставить работать так же, как уже было написано ранее в трех строчках? Эт называется "оверинжениринг", когда простая задача решается "через Чукотку" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 18 января Опубликовано 18 января · Жалоба Игра стоит свеч, но только тогда, когда эти куски кода можно оформить в небольшой компактный файл. Сейчас у меня этот файл состоит из #define определений (макрос-функций). Поэтому меня интересовал вопрос улучшения имеющегося на C++. Разумеется, такой код с шаблонами и масло масляным просто обязан быть упрятан в какую-то библиотеку, а не торчать в каждом исходном файле кода. Макрос MODIFY_REG (или как он там?) - не совсем стандартный CMSIS, STM их пишет, в файле GD уже их нет. Каждый раз править заголовочный производителя - не мой путь. Мой путь - всегда иметь свой файл с такими определениями. Вот у меня и есть такой файл. Только он состоит не тупо из стыренных решений, а стилистически прилизан и уже выверен до идеала (насколько это возможно). А еще я таскаю этот файл для разных проектов с разными МК (8 и 32 битными). Поэтому удобство точно есть🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 18 января Опубликовано 18 января · Жалоба Ну тут уж на вкус и цвет все буквы разные. Кто как хочет, тот так и дро... ээммм, пишет 🙂 Единых расово-верхных стандартов нету на этот счет. CMSIS - это только лишь способ описания регистрово-битовой части периферии, причем в инструментах языка Си, а не С++. А еще... да, еще есть некоторые "упертые", пытающиеся один и тот же файлик нацепить на любой вид железа, от PIC16 до Broadcom BCMxxx 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 января Опубликовано 18 января · Жалоба 1 час назад, EdgeAligned сказал: Однако, стоит ли игра свеч, когда уже есть простой способ? Ведь посмотрите, сколько строчек нужно исписать, чтобы заставить работать так же, как уже было написано ранее в трех строчках? Эт называется "оверинжениринг", когда простая задача решается "через Чукотку" Речь идёт не о замене трёх строчек, а о В 17.01.2024 в 01:09, Arlleex сказал: Весьма сложная для понимания макросная кухня Си, для упрощения поста, не приводится Причём всё это, как правильно написал @Arlleex, пишется один раз, потом выносится в заголовочный файл, и в дальнейшем просто используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 18 января Опубликовано 18 января · Жалоба Вот я об этом же и говорю! Либо написать три строчки и использовать в дальнейшем, просто подключая этот заголовочный файл. Либо написать овер-дофига строчек и тоже использовать в дальнейшем. "А если нет разницы, зачем платить больше?"(С). 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 18 января Опубликовано 18 января · Жалоба 1 час назад, EdgeAligned сказал: Ну тут уж на вкус и цвет все буквы разные. Кто как хочет, тот так и дро... ээммм, пишет 🙂 Да всегда так было)) И ничего - наука процветает, караван идет. Или как там. 14 минут назад, EdgeAligned сказал: "А если нет разницы, зачем платить больше?"(С). 🙂 Дело в моральном устаревании макросов и сложной адаптации их к другим конструкциям языка, которые уже издавна завязаны на... не на макросы, короче)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля Опубликовано 19 февраля · Жалоба Подскажите, пожалуйста, можно ли как-то определять функции, принадлежащие namespace-у, синтаксически "не всовывая" тело функции в этот namespace? Т.е. вместо namespace nsA { void func() { ... } } писать сразу что-то наподобие void nsA::func() { ... } ? Потому что в пределах файла исходника, бывает, из-за вложенности пространств функции "уезжают" и находятся не на одном уровне табуляции, что несколько портит вид. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 19 февраля Опубликовано 19 февраля · Жалоба namespace nsA { void func(); } void nsA::func() { ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля Опубликовано 19 февраля · Жалоба 9 минут назад, Сергей Борщ сказал: namespace nsA { void func(); } void nsA::func() { ... } Угу. Не красиво, ибо дублирование. Думал, есть какая-то пуля, которую я не видел. Пытался хотя б сократить вложенные спейсы: namespace nsA::nsB::nsC { void f() { } } а это оказывается расширение, и то, начиная с C++17 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 24 19 февраля Опубликовано 19 февраля · Жалоба 5 minutes ago, Arlleex said: а это оказывается расширение, и то, начиная с C++17 значит пришло время слазить с "устаревших" 14 и тем более 11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 20 февраля Опубликовано 20 февраля · Жалоба Кстати, правила форматирования текста - они настраиваются в IDE. Можно же сделать, чтобы блок namespace не сдвигал табуляцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться