Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Сообщение Эйлер Леонард »

Доброго времени суток господа Коты.
Есть такой вот код.
Передача аргумента по адресу и "как обычно".
Оба фрагмента рабочие.
Какой из двух вариантов предпочтительней и в каких случаях?
Спойлер/* ATmega328 AtmelStudio -std=c++14 */
using rs1 = GPIO<BOARD_Pins::D1>;
using rs2 = GPIO<BOARD_Pins::D2>;
//==== Вариант 1 =======
class Test1 {
public: Test1( rs1* qq );
private: rs1* Dev1;
};
//-----------
Test1::Test1( rs1* qq ) : Dev1(qq) {
Dev1->output();
Dev1->high();
};
//==== Вариант 2 =======
class Test2 {
public: Test2( rs2 qq );
private: rs2 Dev2;
};
Test2::Test2( rs2 qq ) : Dev2(qq) {
Dev2.output();
Dev2.high();
};
//===========

//==== Вариант 1 =======
rs1 led1;
Test1 test1(&led1); // & - получения адреса (взятие адреса).
//==== Вариант 2 =======
rs2 led2;
Test2 test2(led2);
using = это чтобы не писать крокодилообразное GPIO<BOARD_Pins::D1>;

Добавлено after 43 minutes 40 seconds:
А пока курю это...
https://habr.com/ru/post/251091/
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Эйлер Леонард писал(а):"как обычно"
Это называется "по значению" :)
Разница огромная. Когда идёт передача по значению, то весь объект, при передаче в аргумент, копируется полностью. При этом, создаётся новый объект, с которым мы внутри функции и работаем. А по указателю (или ссылке) - передаётся только адрес объекта. И работаем мы уже с переданным объектом.
К слову, при передаче по значению, в классе должен быть реализован конструктор копирования. Без него передача - плохая идея, особенно если в классе используются указатели.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4341259#p4341259"]Какой из двух вариантов предпочтительней и в каких случаях?[/uquote]Ни тот, ни другой. Не надо без необходимости создавать и передавать объекты. Продолжайте передавать типы в шаблоны и делать статические методы. Посмотрите очень упрощённый пример на godbolt. Там не создано и не передано ни одного объекта. Понятно, что объекты с состояниями придётся создавать. Но лучше их никуда не передавать, ибо AVR и С++ надо очень аккуратно.
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Сообщение Эйлер Леонард »

OK. Как раз таки ещё один вариант с шаблонами я и проверял. Лампочка загорелась. Да вот удалил этот кусочек зачем-то. Хочу эти пины GPIO(ссылка) передать в конструктор класса, ну там чтобы ими шурудить что-нибудь.
Вложения
Test-0.png
Test-0
(23.66 КБ) 78 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Эйлер Леонард, хотите пожёстче? Пины делаются из портов, объединяются в шины и передаются в классы. Ну и режимы задаются группой. Кое-где надо прикрутить атомарный доступ по вкусу. Ссылка
СпойлерИзображение
изображение_2022-12-23_071552084.png
(22.26 КБ) 128 скачиваний
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Сообщение Эйлер Леонард »

Нашел в своих архивах один очень полезный архив SPI_Master(ссылка 1).GPIO_Master(ссылка 2) Где, как раз и есть многие ответы на вопросы, касательно применяемости шаблонов в С++ для AVR. Ну теперь остается разобрать все это дело по запчастям и собрать заново, ну и что бы все компилировалось в AtmelStudio и фурыкало. :)) Найдено было когда-то на https://github.com/ и скопировано на Google Диск.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4341426#p4341426"]Эйлер Леонард, хотите пожёстче? Пины делаются из портов, объединяются в шины и передаются в классы. Ну и режимы задаются группой. Кое-где надо прикрутить атомарный доступ по вкусу. ][/spoiler][/uquote]
С++, шаблоны, классы, объекты... Считаю, всё что можно сделать проще - нужно делать проще.
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Нет, ну это же понятно, что логику от физики нужно отделять. Один раз написал физику, дальше работаешь с логикой. Ну и выкрутасы с С++ заради чего? Если есть заради чего, то да, а если нет? На кой хрен плести ++ куда надо и куда нет! Или я чего то не понимаю?
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

во-первых, на С/С++ пишут все ардуинщики. это хороший повод :) Во-вторых, представьте, что у вас нет ни лог.анализатора, ни осцилла, ни даже отладочной платы, ну и вообще нет особой цели. А желания песать очень даже есть. Это обычное занятие хеллоуворлдщиков. Вот и начинаются выкрутасы, где надо и где не надо. Ну просто чтоб хоть в чем то себя мог реализовать. Не в материальном, так хоть в писательском плане. Это уже не первый год длится, а всё по тому же кругу.
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

У меня ребёнок заплёл косички в универе... Ну так и хочется сказать словами из анекдота: "Ну, во первых, это красиво..."
Потренироваться - это одно. С другой стороны тренироваться можно и в Brainfuck-е. Почему нет?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="OKF",url="/forum/viewtopic.php?p=4342220#p4342220"]Ну и выкрутасы с С++ заради чего?[/uquote]Потому что это тупо более мощный инструмент, позволяющий проще решать сложные задачи. Пример из жизни. Код из обработчика прерываний интерфейса OTG_USB всем известных контроллеров. Во-первых, USB-модулей в контроллере может быть два и не хотелось бы два раза одинаковый код писать. Во-вторых, USB-классы могут быть разные и хотелось бы убрать зависимость кода обработчика от количества и типов обработчиков конечных точек. В-третьих, это прерывание и не хотелось бы лишнего в рантайме делать. С плюсами это примерно так можно сделать. В USB-классе в специальном типе перечисляем все обработчики конечных точек. Заметьте, ни создано ни бита реальных данных, которые пролезли бы в прошивку, мы находимся в области типов.
СпойлерИзображение
eps.png
(32.91 КБ) 101 скачивание
Теперь переходим к обработчику прерываний. Покажу фрагмент, отвечающий за обработку Data OUT. Задача: инстанцироваться для нужного USB-модуля, выбрать из списка обработчиков только OUT точки и вызвать обработчики.
СпойлерИзображение
irq.png
(199.16 КБ) 109 скачиваний
Не скажу что это простой код, но он решает поставленные задачи. Каждая строчка с constexpr выполняется на этапе компиляции. Из рантайм кода там только (70, 79, 82, 84 и 90) строки для FS-интерфейса и (70, 79, 83, 84 и 95) для HS-интерфейса. Ни каким препроцессором такого не сделать. И потом, это просто красиво!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну да, лучше 20 лет изучать плюсы, чтобы потом за 5 минут код для одного модуля usb переделать на два.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Думаете для других задачь плюсы применить нельзя? И да, 20 лет, не меньше!
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4342227#p4342227"]во-первых, на С/С++ пишут все ардуинщики. это хороший повод :)[/uquote]
Как я понимаю, разработчики Ардуино выбрали С++ как раз для упрощения... Что бы начинающие могли использовать Си с классами. Ну а коль используется С++ компилятор, то почему бы не использовать и его другие фишки. Этим многие и пользуются. Но от этого проще не становится.

Добавлено after 5 minutes 4 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=4342461#p4342461"]Думаете для других задачь плюсы применить нельзя?[/uquote]
Не думаем. Знаем, что можно. Можно практически везде, где можно обычный Си. Только преимущества его использования совсем не видно. А тот мизер явно не стоит тех усилий по его освоению, ИМХО.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="OKF",url="/forum/viewtopic.php?p=4342554#p4342554"]Только преимущества его использования совсем не видно.[/uquote]Допускаю, что в сложном коде не видно, просто потому что непонятно. Хотя именно в сложном коде максимальный эффект. Но есть же и простые свойства, не требующие особого изучения. Вчера показывал картинку
Изображение
Тут иллюстрация засранного пространства имён в С. Казалось бы, почему не использовать в перечислении ADC3 как это указано в мануале? Только вот в заголовочном файле контроллера ADC3 уже задефайнено препроцессором. В С++ Adc3 не вылезет за пределы перечисления и нигде больше мешать не будет. Вроде бы мелочь, но такие мелочи на каждом шагу. Только за более строгий контроль типов уже надо плюс в преимущества ставить.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Это мы уже видели. А в прикладном, законченном варианте осмысленного проекта покажете? Ну мы очень просим, покажите конечный результат ваших многолетних хеллоуворлдов?
Про запуск кварца на C++ мы уже поняли. Мигание светодиодов, окаймленное 10-километровыми портянками, поняли. Что дальше? Покажите дальше, конечный результат, о великий гуру портянок хеллоуворлда!
То есть, поймите меня правильно (и не удаляйте мои мессаги!). Вот реально очень хочется увидеть конечный продукт всей этой многолетней портянкоработы. Не обижайтесь, плиз, вот реально вот по-человечески хочется увидеть, что именно дала вам эта многолетняя титаническая писянина для реализации законченного ОСМЫСЛЕННОГО проекта. Не заготовки, не хеллоуворлды, а продукт осмысленный и законченный. Хоть что-нибудь?
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Ну почему же. С полиморфизмом удобно. Одно и тоже имя функции, а в зависимости от параметров уже сам компилер разберётся кого вызывать. Ну и классы. Для одной кнопки написал, и применяй для других сколько хош. Тоже наследование. Да много чего удобного. Только на результат особо не влияет. В Си делается то же самое, ну может чуть длиннее иногда. По крайней мере для МК. Почему я и стараюсь писать безо всех этих ++ фишек. Ещё потому что приходится для разных семейств писать, а у некоторых ++ просто нет.( Ведь в чём плюс высокоуровневого языка? В переносимости, что бы там не говорили.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Таксь, загибаем пальцы что нельзя на С++ : кварц нельзя, GPIO со светодиодами нельзя, USB нельзя. DMA, как я понял, тоже нельзя? Может сразу перечислите что можно и не будем мучаться?

Заменил пример на классическую макросовскую залипуху.
Изображение
изображение_2022-12-25_112312443.png
(60.87 КБ) 633 скачивания
СпойлерА почему у вас такой интерес к скромной персоне неудачника у которого ничего нет, что вы за мной 6 лет по всем форумам носитесь? Я за это время не припомню, чтобы где-то вам задолжал и стал обязан свои проекты выкладывать. Выкладывайте свои, бедем смотреть а кто же судьи. А чтобы сообщения не удаляли надо всего лишь правила форума соблюдать.
Последний раз редактировалось VladislavS Вс дек 25, 2022 11:24:51, всего редактировалось 3 раза.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Ну это у всех так бывает :) У меня тоже есть навалом незавершенных и заброшенных проектов, которые потеряли актуальность или были ошибочными. Это нормально. Но есть немало и конечных продуктов, причем независимо от языка их написания. 18 лет назад у меня были конечные продукты даже на ассемблере, и ничо, норм. Как бы цель то в том, что бы делать конечный продукт, а не работу ради работы. По-моему, так.

VladislavS, ну это опять-двацатьпять, хеллоуворлд. VladislavS - типичный представитель хеллоуворлдщиков. Есть такая каста пейсателей. Ни одного законченного осмысленного проекта, но тысячи хеллоуворлдов на протяжении многих лет. Уж сколько раз его просили - результата ноль, просто потому что нету ничего.

Никакие правила форума не нарушаются в том, что люди желают увидеть практическую реализацию всех этих портянок, чтобы понять, насколько оное работает в конечном продукте! не надо быть ябедой-дюдюкой, надо просто быть человеком. Разве это так сложно?
Свои общедоступные проекты я выкладывал, их даже повторяли другие люди и говорили спасибо еще!
Никаких правил форума тут не нарушается! Я интересуюсь конечным результатом, это нормально! Просто спрашиваю! А за спрос то зачем удалять "неудобные" мессаги то?

VladislavS, никакого хамства здесь нет! Никто вас не задевает и ваше ЧСВ не ущемляет. Наоборот, хотели посмотреть, чего вы достигли. Но оказалось, что законченного осмысленного просто и нету. Разве так сложно было сразу прямо ответить? Ничего страшного в этом нету, это нормально. Сложно было отвеить чтоль? Неудобный для вас вопрос?. Ну что поделать. есть такая каста - хеллоуворлдщик. Не плохая и не хорошая. Просто писанина ради писанины, без конечного результата.
На этом присвоении звания хэллоуворлдщик торжественно и закончим. Поздравляю вас, это почетно! :) Серьезно, межу прочим, без шуток.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="OKF",url="/forum/viewtopic.php?p=4342642#p4342642"]Ещё потому что приходится для разных семейств писать, а у некоторых ++ просто нет.( Ведь в чём плюс высокоуровневого языка? В переносимости, что бы там не говорили.[/uquote]
Сейчас STM32G0 по 60 центов можно взять, а С++ компилятора нет разве что для не особо популярных 8-ми битных пиков, ну для STM8 еще компилятор есть, но старенький. Так может этими морально устаревшими восьмибитками лучше не пользоваться, тогда на них и ничего переносить не придется? Или с ARM та же проблема, их изучать нужно лет так 20? :)
Ответить

Вернуться в «Разные вопросы по МК»