Перейти к содержанию
    

razrab83

Участник
  • Постов

    383
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент razrab83


  1. я знаю что такое протектед и для чего он используется. Поэтому я его не использую ни для членов, ни для функций. Это источник проблем. По сути это тот же паблик, только среди ограниченного круга. Это ваш личный холодильник на этаже в общежитии/комуналке. Кроме Вас, к нему имеют доступ все жители общяги, но ни кто "чужой" не сможет туда попасть )). Если писать для всех закрытые библиотеки в виде файлов типа .a, то да. А если писать для всех срр или работать в команде.... хороший пример "для всех" всякие ротос (кернел, фриртос, сцм), Qt, Qwt, LVGL (ой, это же не всё ++), boost, .... и все с исходниками без.
  2. я использую иерархию классов. наследование и прочие плюшки ООП. Не использую protected ни для членов, ни для методов. Для меня, если кроме меня кто-то может использовать мой метод (или мои данные) - это тоже что кто попало. Я не настаиваю на правильности моего подхода. Делайте как вам удобно. Я про себя говорю. Отучили меня от протектед. Очень полезно.
  3. если значки не нравятся, то Communication() : Module("Communication"){} - а в конструкторе Module значки, как и в setName
  4. ну если только для такой вкусовщины, типа такой Communication() { setName("Communication"); } если по нормальному так, как обычно делают как я предложил, то протектед методы не нужны и не оправданы.
  5. а какого рожна class Communication изменяет члены класса Module без гетера на прямую? не вы ли тут с пеной у рта про доступ до членов только через гетеры? Скажете: name - это protected. Меня учили писать без protected. Вернее, как я только его ставил - били по рукам. В контексте наследников от Module, protected - этот тоже самое что public. Т.е. вся родня может менять name. Ну у меня 160 родственников(наследников) и 2 чужака в деревне. 160 жителей могут залезть мне в кошелёк, а 2 нет. Это тоже самое, что все могут. поэтому вместо protected меня приучили определиться, где должен быть name и закрыть его гетерами. Или же, если разрешил соседям жэну кому-то менять снаружи name ... то переноси его паблик. убрать его в конструктор. Но Module.h всё равно - выньдапаложь со всем потрахами )) class Communication : public Module { public: Communication() : Module(const_cast<char*>("Communication")) {}; // код };
  6. Это ваш кеил - просто оболочка )) я не про это. в Eclipse, в визарде создания класса есть эти фичи. От компилятора визрад эклипса не зависит. Можно гуями все эти delete, приваты и final-ы настроить, В визарде QtCreator этого нет. в VSCode я тоже не замечал. в Кейле не знаю.
  7. присоединяюсь к вопросу. сущность класса - наследование, полиморфизм. Если его зафиналить и закупорить, все методы в статик - то можно всё сделать без класса. данные, функции... для нэймспейсинга использовать namespace. не очень хорошая идея. это "неявное". Когда ЯВНО указан private - это явно указан private . а когда его нет - он явно не указан или его забыли?
  8. если среди горсть визуального мусора нету какого нибудь др. конструтора, например MyClass(int index);
  9. class A final { public: A() = delete; // Удаляем конструктор по умолчанию private: int a; }
  10. Не надо мне приписывать того, чего я не говорил. Я ни где не сказал, что "не применяет никто".
  11. я понял о чем вы говорите. теоретически понятно, предоставляют дополнительную гибкость, мощь, и можно бороздить космические просторы. Но практически, что-бы кто-то это применял!? Тем более в контексте МК. Тут с++ и std некоторые считают излишеством. Только пуреСИ. ))
  12. да конечно... вся графика через такой механизм. а можно передать событие, например кликнули мышкой. А там перекрывается несколько виджетов др. над другом.
  13. class MyWidget { public: MyWidget(MyWidget *parent_ = nullptr) { next = nullptr; child = nullptr; prev = nullptr; if(parent_) { parent = parent_; parent->addChild(this); } } virtual void paint() { //код рисования самого себя? т.е. MyWidget-а { } if(child != nullptr) child->paint(); if(next != nullptr) next->paint(); } /*private: много писанины с приватом, пусть будет протект*/ protect: MyWidget *next; MyWidget *child; MyWidget *prev; MyWidget *parent; } //ну и наследуемся class Label : public MyWidget { public: Label(MyWidget *parent_ = nullptr) :MyWidget(nullptr) void paint() override { //код рисования самого себя? т.е. Label-а { } MyWidget::paint(); } } не очень понял что занчит "мемберы" и "обычные указатели". Но мой пример - это не то?
  14. понятно А разве всякие GUI - это не конкретный пример. Например Qt состоит обычно GUI состоит чуть менее, чем полностью из членов-указателей. Указатель на парент, указатель на child. В GUI указатели на всякие next, prev, .... у главного окна может быть массив детей (массив указателей на Widget), и надо всем дать команду отрисовки - по массиву указателей всех перебрал. А может на главном окне 2 кнопоки и 2 лейбы, у главного окна только один указатель на child (пусть будет кнопка1), а у этой кнопки1 указатель next на кнопку2, у кнопки 2 указатель next на лейбу1, у лейбы1 next указывает на лейбу2, у лейбы2 next =0; Главное окно вызывает у child->repaint(), т.е. у кнопки1, кнопка1 в своем методе вызовит repaint у своего child, а потом проверит, если next != 0, то вызовит next->repaint(); И так произойдет repaint всех детей главного окна включая внуков, правнуков и все родовое дерево до последнего младенца. тоже самое при удалении (о чем говорил jcxz). Так же можно открепить чаилда (созданого динамически в какойнить фабрике) и передать другому родителю.... это с указателями это делается.
  15. А зачем тут нужна явной специализация? почему не сделать вместо явной специализации просто функцию не заморачиваясь шаблонами? // Реализация явной специализации для типа `unsigned int` void fUInt(unsigned int value) { printf("Hello unsigned int = %u"); }
  16. так и есть круть. если что не понятно, спрашивайте. Столько интересного.... 😉
  17. не в вашей сети, а вообще - в сети Modbus - от куда угодно. ошибкаСлейва/внешняя помеха/слейвДолгоОтвечает/(другой вариант ______) (нужное подчеркнуть) я про тоже самое. "Хьстон, у нас проблемы!...... Как круглый фильтр засунуть в квадратный корпус?.... Скотчем примотать". Гениальное решение, в сложившейся ситуации, спасшее астронавтов. Но это не значит, что надо скотчем всё делать из картониума. Вы под 3-хногую табуретку подложили книги -костыль, возможно ОТЛИЧНОЕ и единственно правильное решение. Но, вы это решение теперь выдаете за "так надо делать. любой модбас в любой системе стерпит, т.к. это соответствует спецификации". Я просто возразил, что это не соответствует спецификации и если в вашем случае это помогло, то в другом может не помочь и даже усугубить. Если делать с чистого листа - то делать нужно по спецификации, а не "книжки подкладывать". вот тут мне не понятно. вернее понятно, но почему то вы тут не оговариваете, что "забили на спецификацию и сделали, как смогли". Т.е. допустим слейв отправил пакет в 10 байт. 4байта + 2тишины + 6байт. Этот пакет изначально битый, т.к. в нём есть пауза >1.5. Теперь через какие-то там ваши терни в ПК получили два куска обрывка. 4 и 6 байт. как из этих обрывков на ПК вы понимаете сколько времени было между 4 и 5-ым байтом при выходе пакета из слейва? Как вы его этот пакет сможете забраковать по тайменгам на ПК?
  18. придумывать ни чего не нужно. я писал в вашем отдельно взятом случае вместо ножки стула стопка книг, прослужит 100 лет. Но это не значит, что ваша стопка книг соответствует мебельному стандарту будет работать вместо ножки при любом использовании стула по назначению. И на протяжении всего диалога вы слово "костыль" заменяете на "нестандартное решение". Появился на электрониксе новояз. Ну хорошо, видите в постах jcxz слово "кривой костыль"? Читайте - "нестандартное решение". Сути не меняет. В TCP, в отличии от UDP, нет фреймов. В TCP есть сегменты, но в API, как правило, они скрыты за сокетом TCP. Сокет TCP выдаст доступное кол-во байтов, в котором может быть 1 пакет Modbus, может быть 2 пакета, может быть 7.3 пакета или полпакета. Отправляя по Modbus/TCP длинной в 200 байт, этот TCP пакет перемещаясь в инете, может быть фрагментирован и ваш ОРС может получить этот Modbus/TCP-пакет тремя сегментами TCP: сначала 100 байт, потом 18 байт и потом оставшиеся 82 байта.
  19. соответствие спецификации, в первую очередь, означает соответствие спецификации, а не то, что в отдельно взятом случае, вам, за невозможностью переделать, приходится подставить костыль, что бы "Все стандартные запросы обрабатывались аналогично любому другому девайсу в сети" (С). Можно вместо ножки стула поставить стопку книг и будет работать 15 лет и ни кто из пользователей костыль не заметит. В соответствии со спецификацией, если в пакете между символами пауза >1,5, то этот пакет считается битый и не обрабатывается. Вы своим "утром пол пакета, к обеду остальное" этому не сможете соответствовать. если в сети послать 2 пакета, без интервала между пакетами, то все девайсы в сети примут эти пакеты как 1 пакет и забракуют по CRC, а ваш девайс на ПК примет их оба и оба обработает.
  20. это гугл/яндекс дергает портянки из стекоферфлоу. а гпт генерирует ответ на "знаниях", полученных из стекоферфлоу (причем со всех языков), вики, справочников, стандартов, в том числе и с книжек, подобно вашей про шаблоны. Чтоб вам получить эти знания (хотябы 1 раз прочитать, не то что получить и применить) - вам жизни не хватит. Конечно gpt3.5 "знает" всё только до 2022 и у него нет выхода в инет, gpt4o уже знает посвежее, а также может поискать за тебя в инете, если что сам не знает. Скормите в gpt4o весь свой вопрос в полный рост вы будете удивлены ответу. и если он выдаст вам std::forward<Args>, скажите ему И вы опять будете удивлены.
  21. Спойлер: ненавижу яндекс. Не ради рекламы Я, хочу поделится интересной фишкой, которая поможет обучаться (не только в области электроники/программирования). И думаю мало кто об этом знает, т.к. уважающие себя программисты не используют яндекс.браузер (ЯБ). ЯД запилили автоматический онлайн голосовой перевод видосов с помощью YandexGPT. Нашли интересный материал в ютубе, а он на английском. Непонятно. Жмёшь кнопку в ЯБ "перевести" и слушаешь ролик с синхронным переводом. Выучил английский - смотришь в оригинале и понимаешь. Но попался ролик на немецком - вот не задача! Ни чего страшного. Кликнул кнопку - слушай в переводе. Итальянский/китайский/французский/японский.... почти с любого языка переводит. Перевод достаточно годный, и даже лучше, чем сделал бы переводчик-человек. Так же до просмотра ролика, можно кликнуть по кнопке и посмотреть краткий пересказ ролика (выгляит как Оглавления даташита), очень удобно. Из бесплатных и онлайн/синхронных я пока встретил только у ЯБ (т.е. нужно зайти на ютуб из яндекс.браузера). Вот как это выглядит у ЯБ. Остальные платные и их нужно видео предварительно скормить и получишь перевод.
  22. написать дерьмо можно и на си, на %ПОДСТАВЬ_ИМЯ_ЯЗЫКА%. Этот код борланд-стаил. Борланд славится тем, что не придерживается строгому стандарту, а пытается стандарт под себя прогнуть. Даже в народе ходит выражение "Есть язык С++, а есть язык Borland-C++". На с++ такой код classA.size = 100; Очевидно, что у classA есть публичный член size. В Borland-C++ Tlabel label; label.text = "Hello word" с точки зрения c++ text - это публичный указатель. Но в борланде за text через __property cпрятан сеттер типа Tlabel::setText(consr char *str). Школата и неокрепшие умы начинают пробовать свои силы в с++ и пробуют писать форточки на народном Borland-C++. Программисты МК, закоренелые сишники, пишут утилитки для отладки своего железа с ПК (до сих пор многие сидят на Borland-C++ 6). борланд предлагает class.text = "hello". Они видят, что text в паблике и приучаются к этому и потом пишут свой код на с++, без сетеров/гетеров, всё в паблике и не парятся.
  23. ps вообще не понятно, почему в разделе программирование предлагают решить вопрос заменой железа? Это же ПРОГРАМИРОВАНИЕ, а не проектирование. Кто-то разработал железку, кто-то закупил РЭК, кто-то собрал - Прошли годы.... попало это всё на стол программисту. За частую, железо разработано и собрано ещё до того, как программиста приняли на работу. Начал прогер ваять - столкнулся с проблемой по ПРОГРАММИРОВАНИЮ, не по ТЗ, не по выбору элементной базы, а по программированию. "Как создать тип данных для структуры с переменным размером?", приходит "советчик" и советует учит по мощнее процессор поставить или внешнее ОЗУ на SPI. 🥱
×
×
  • Создать...