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

razrab83

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

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

  • Посещение

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

    3

Сообщения, опубликованные razrab83


  1. 1 час назад, EdgeAligned сказал:

    Proteted - это область видимости в первом уровне наследования.

    я знаю что такое протектед и для чего он используется. Поэтому я его не использую ни для членов, ни для функций. Это источник проблем. По сути это тот же паблик, только среди ограниченного круга. Это ваш личный холодильник на этаже в общежитии/комуналке. Кроме Вас, к нему имеют доступ все жители общяги, но ни кто "чужой" не сможет туда попасть )).

     

    1 час назад, EdgeAligned сказал:

    Если же писать "для всех", то в идеале должны быть закрытые библиотеки в виде файлов типа .a

    Если писать для всех закрытые библиотеки в виде файлов типа .a, то да. А если писать для всех срр или работать в команде.... хороший пример "для всех" всякие ротос (кернел, фриртос, сцм), Qt, Qwt, LVGL (ой, это же не всё ++), boost, .... и все с исходниками без.

  2. 2 минуты назад, Forger сказал:

    Если вы не используете иерархию классов в проектах (наследование)

    я использую иерархию классов. наследование и прочие плюшки ООП. Не использую protected ни для членов, ни для методов. Для меня, если кроме меня кто-то может использовать мой метод (или мои данные) - это тоже что кто попало. Я не настаиваю на правильности моего подхода. Делайте как вам удобно. Я про себя говорю. Отучили меня от протектед. Очень полезно.  

  3. 29 минут назад, Forger сказал:

    тут setName как раз protected из Module, такая запись мне кажется менее перегруженной "значками" ))  Исключительно, вкусовщина )

    если значки не нравятся, то 

    Communication() : Module("Communication"){} - а в конструкторе Module значки, как и в setName

  4. 30 минут назад, Forger сказал:

    нужно использовать, это вполне рабочее решение.

    ну если только для такой вкусовщины, типа такой

    Communication() { setName("Communication"); }

    если по нормальному так, как обычно делают как я предложил, то протектед методы не нужны и не оправданы. 

  5. 3 часа назад, Forger сказал:
    Communication() { name = const_cast<char*>("Communication"); }

    а какого рожна class Communication изменяет члены класса Module без гетера на прямую? не вы ли тут с пеной у рта про доступ до членов только через гетеры?

    Скажете: name - это protected. Меня учили писать без protected. Вернее, как я только его ставил - били по рукам. В контексте наследников от Module, protected - этот тоже самое что public. Т.е. вся родня может менять name. Ну у меня 160 родственников(наследников) и 2 чужака в деревне. 160 жителей могут залезть мне в кошелёк, а 2 нет. Это тоже самое, что все могут.

    поэтому вместо protected меня приучили определиться, где должен быть name и закрыть его гетерами. Или же, если разрешил соседям жэну кому-то менять снаружи name ... то переноси его паблик.

    34 минуты назад, Arlleex сказал:

    Где и кто такой name, например?

    убрать его в конструктор. Но Module.h всё равно - выньдапаложь со всем потрахами ))   

    class Communication : public Module 
    { 
    public: 
    	Communication() : Module(const_cast<char*>("Communication")) {};
          // код
    };
          
  6. 12 минут назад, Forger сказал:

    эклипс это просто оболочка, впрочем как и кейл

    Это ваш кеил - просто оболочка ))

    16 минут назад, Forger сказал:

    и код будет компилироваться аналогично

    я не про это. в Eclipse, в визарде создания класса есть эти фичи. От компилятора визрад эклипса не зависит. Можно гуями все эти delete, приваты и final-ы настроить, В визарде QtCreator этого нет. в VSCode я тоже не замечал. в Кейле не знаю. 

  7. 3 минуты назад, Forger сказал:

    Кстати, а для чего такое вообще нужно? в смысле создавать такой наглухо забитый класс, который нельзя ни наследовать ни создавать ))

    присоединяюсь к вопросу. сущность класса - наследование, полиморфизм. Если его зафиналить и закупорить, все методы в статик - то можно всё сделать без класса. данные, функции... для нэймспейсинга использовать namespace. 

    7 минут назад, Forger сказал:

    можно вообще убрать слово private

    не очень хорошая идея. это "неявное". Когда ЯВНО указан private - это явно указан private . а когда его нет - он явно не указан или его забыли?

  8. 1 минуту назад, juvf сказал:

    но и не существует ни каких методов в этом классе, чтобы создать объект этого класса, т.е. нет ни каких статический функций (как в синглтоне), аля MyClass *MyClass::create(){return new MyClass); нет

    если среди горсть визуального мусора нету какого нибудь др. конструтора, например MyClass(int index);

  9. 9 минут назад, jcxz сказал:

    Если это не применяете лично вы, то из этого не нужно делать выводы, что не применяет никто.

    Не надо мне приписывать того, чего я не говорил. Я ни где не сказал, что "не применяет никто".

  10. 12 часов назад, Arlleex сказал:

    Неа) Указатели на мемберы - т.е. указатели на члены данных/функции, это не обычные классические указатели.

    я понял о чем вы говорите. теоретически понятно, предоставляют дополнительную гибкость, мощь, и можно бороздить космические просторы. Но практически, что-бы кто-то это применял!? Тем более в контексте МК. Тут с++ и std некоторые считают излишеством. Только пуреСИ. ))

  11. 20 минут назад, jcxz сказал:

    например можно скрыть или запретить часть виджетов, в зависимсти от значения какого-то члена.

    да конечно... вся графика через такой механизм. а можно передать событие, например кликнули мышкой. А там перекрывается несколько виджетов др. над другом.  

  12. 4 минуты назад, Arlleex сказал:

    А Вы точно имеете в виду указатели на мемберы, а не обычные указатели на объекты классов?

    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();
    
    	}
    }

    не очень понял что занчит "мемберы" и "обычные указатели". Но мой пример - это не то?

  13. 30 минут назад, juvf сказал:

    Можно убрать шаблон для uint и сделать отдельную функци, тогда вы измените API

    понятно

    21 минуту назад, Arlleex сказал:

    Вроде мой пример вполне показывает минималистичный кейс, в котором +/- понятна идея этих указателей.

    21 минуту назад, Forger сказал:

    можете привести КОНКРЕТНЫЙ пример, где указатель прям вот очень нужен и без него ничего путного не получается?

    А разве всякие 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). Так же можно открепить чаилда (созданого динамически в какойнить фабрике) и передать другому родителю.... это с указателями это делается. 

    • Upvote 1
  14. 3 часа назад, juvf сказал:

    Файл myTemplate.cpp

    #include "myTemplate.h"
    
    template <typename T> void f(T value)
    {
    // Общая реализация для всех типов
    }
    
    // Реализация явной специализации для типа `unsigned int`
    template <>
    void f<unsigned int>(unsigned int value) 
    {
        printf("Hello unsigned int = %u");
    }

     

    А зачем тут нужна явной специализация? почему не сделать вместо явной специализации просто функцию не заморачиваясь шаблонами?

    // Реализация явной специализации для типа `unsigned int`
    void fUInt(unsigned int value) 
    {
        printf("Hello unsigned int = %u");
    }

     

  15. 3 минуты назад, EdgeAligned сказал:

    говорили, что ++ это супер-круть типа и ваще.

    так и есть круть. 

    2 часа назад, Arlleex сказал:

    Я ее пока что довольно выборочно читаю,

    если что не понятно, спрашивайте. Столько интересного.... 😉 

  16. 33 минуты назад, tonyk_av сказал:

    Откуда в сети Modbus/RTU, в которой все устройства работают строго по стандарту, возьмутся два слипшихся пакета?

    не в вашей сети, а вообще - в сети Modbus - от куда угодно. ошибкаСлейва/внешняя помеха/слейвДолгоОтвечает/(другой вариант ______) (нужное подчеркнуть)

    36 минут назад, tonyk_av сказал:

    По этой причине под стул с тремя ножками подложили стопку книг. С инженерной точки зрения реализовано нормальное решение, с точки зрения АСУ- это костыль.

    я про тоже самое. "Хьстон, у нас проблемы!...... Как круглый фильтр засунуть в квадратный корпус?.... Скотчем примотать". Гениальное решение, в сложившейся ситуации, спасшее астронавтов. Но это не значит, что надо скотчем всё делать из картониума. Вы под 3-хногую табуретку подложили книги -костыль, возможно ОТЛИЧНОЕ и единственно правильное решение. Но, вы это решение теперь выдаете за "так надо делать. любой модбас в любой системе стерпит, т.к. это соответствует спецификации". Я просто возразил, что это не соответствует спецификации и если в вашем случае это помогло, то в другом может не помочь и даже усугубить. Если делать с чистого листа - то делать нужно по спецификации, а не "книжки подкладывать".  

     

    25 минут назад, tonyk_av сказал:

    делалась попытка из обрывков собрать целое. Если получалось собрать воедино то, что полностью соответствовало Модбас-фрейму, то он шёл дальше.

    вот тут мне не понятно. вернее понятно, но почему то вы тут не оговариваете, что "забили на спецификацию и сделали, как смогли". Т.е. допустим слейв отправил пакет в 10 байт. 4байта + 2тишины + 6байт. Этот пакет изначально битый, т.к. в нём есть пауза >1.5. Теперь через какие-то там ваши терни в ПК получили два куска обрывка. 4 и 6 байт. как из этих обрывков на ПК вы понимаете сколько времени было между 4 и 5-ым байтом при выходе пакета из слейва? Как вы его этот пакет сможете забраковать по тайменгам на ПК?

  17. 3 минуты назад, tonyk_av сказал:

    Теперь осталось придумать, кто пошлёт два слипшихся пакета при условии

    придумывать ни чего не нужно. я писал 

    1 час назад, razrab83 сказал:

    в отдельно взятом случае

    в вашем отдельно взятом случае вместо ножки стула стопка книг, прослужит 100 лет. Но это не значит, что ваша стопка книг соответствует мебельному стандарту будет работать вместо ножки при любом использовании стула по назначению. И на протяжении всего диалога вы слово "костыль" заменяете на "нестандартное решение". Появился на электрониксе новояз. Ну хорошо, видите в постах  jcxz слово "кривой костыль"? Читайте - "нестандартное решение". Сути не меняет.

     

    12 минут назад, tonyk_av сказал:

    Кстати, для ОРС-серверов протокола Modbus/TCP встречал настройку допустимости обработки нескольких Модбас-фреймов, отправляемых и,или пришедших в одном TCP-фрейме.

    В TCP, в отличии от UDP, нет фреймов. В TCP есть сегменты, но в API, как правило, они скрыты за сокетом TCP. Сокет TCP выдаст доступное кол-во байтов, в котором может быть 1 пакет Modbus, может быть 2 пакета, может быть 7.3 пакета или полпакета.

    Отправляя по Modbus/TCP длинной в 200 байт, этот TCP пакет перемещаясь в инете, может быть фрагментирован и ваш ОРС может получить этот  Modbus/TCP-пакет тремя сегментами TCP: сначала 100 байт, потом 18 байт и потом оставшиеся 82 байта. 

  18. В 09.06.2024 в 22:08, tonyk_av сказал:

    Соответствие спецификации означает, в первую очередь

    соответствие спецификации, в первую очередь, означает соответствие спецификации, а не то, что в отдельно взятом случае, вам, за невозможностью переделать, приходится подставить костыль, что бы "Все стандартные запросы обрабатывались аналогично любому другому девайсу в сети" (С). Можно вместо ножки стула поставить стопку книг и будет работать 15 лет и ни кто из пользователей костыль не заметит. 

    В соответствии со спецификацией, если в пакете  между символами пауза  >1,5, то этот пакет считается битый и не обрабатывается. Вы своим "утром пол пакета, к обеду остальное" этому не сможете соответствовать.  

    В 09.06.2024 в 22:08, tonyk_av сказал:

    То есть будучи включенным в сеть, где девайсы работают в полном соответствии с требованиями стандарта, он будет вести себя как остальные.

    если в сети послать 2 пакета, без интервала между пакетами, то все девайсы в сети примут эти пакеты как 1 пакет и забракуют по CRC, а ваш девайс на ПК примет их оба и оба обработает. 

    • Upvote 1
  19. 29 минут назад, Arlleex сказал:

    Без понимания основ тыкать чат-GPT и пытаться учиться у него довольно тупиковая стратегия) Он дергает всякого рода портянки как со стековерфлоу.

    это гугл/яндекс дергает портянки из стекоферфлоу. а гпт генерирует ответ на "знаниях", полученных из стекоферфлоу (причем со всех языков), вики, справочников, стандартов, в том числе и с книжек, подобно вашей про шаблоны. Чтоб вам получить эти знания (хотябы 1 раз прочитать, не то что получить и применить) - вам жизни не хватит. Конечно gpt3.5 "знает" всё только до 2022 и у него нет выхода в инет, gpt4o уже знает посвежее, а также может поискать за тебя в инете, если что сам не знает. Скормите в gpt4o весь свой вопрос в полный рост

    Цитата

     

    Хочу заиметь 2 функции: sendCommand() и sendData(). Они на 99.99% идентичны друг другу, и хотелось бы, чтобы в их телах производился вызов другой "общей" функции с правильно подсунутыми параметрами (возможно, не шаблонными).

    template<args> void send(int dataCommand, args) { // тут уже надо распарсить, сколько аргументов реально, какие их типы и т.д. } template<...> void sendCommand(...) { send(0, ...); } template<...> void sendData(...) { send(1, ...); }


    В конечном итоге хочу получить возможность вот такой записи

    // аргументы - простые целые числа sendCommand(0x12); // должно вызваться send(0, 0x12) sendCommand(0x12, 0x34); // должно вызваться send(0, 0x12, 0x34) sendCommand(0x12, 0x34, 0x56); // должно вызваться send(0, 0x12, 0x34, 0x56) sendData(0x12, 0x34); // должно вызваться send(1, 0x12, 0x34) // аргументы - массив или строка sendCommand("hello"); // должно вызваться send(0, const char (&)[6]) u8 buf[3]; sendData(buf); // должно вызваться send(1, u8 (&)[3])


    Т.е. могу вызывать перегрузку с целыми аргументами в количестве от 1 до 3, а могу запихивать прямо массив или строку - для этого передача идет по "ссылке на массив", чтобы в send() можно было взять N или sizeof(buf).

    На вариативных шаблонах витиевато, не знаю - вообще возможно ли это.

     

    вы будете удивлены ответу. и если он выдаст вам std::forward<Args>, скажите ему

    Цитата

    а std::forward() здесь обязателен? Т.е. можно ли обойтись без обращения к std вовсе?

    И вы опять будете удивлены. 

  20. Спойлер: ненавижу яндекс. 

    Не ради рекламы Я, хочу поделится интересной фишкой, которая поможет обучаться (не только в области электроники/программирования). И думаю мало кто об этом знает, т.к. уважающие себя программисты не используют яндекс.браузер (ЯБ).

    ЯД запилили автоматический онлайн голосовой перевод видосов с помощью YandexGPT. Нашли интересный материал в ютубе, а он на английском. Непонятно. Жмёшь кнопку в ЯБ "перевести" и слушаешь ролик с синхронным переводом.

    Выучил английский - смотришь в оригинале и понимаешь. Но попался ролик на немецком - вот не задача! Ни чего страшного. Кликнул кнопку - слушай в переводе. Итальянский/китайский/французский/японский.... почти с любого языка переводит. 

    Перевод достаточно годный, и даже лучше, чем сделал бы переводчик-человек. Так же до просмотра ролика, можно кликнуть по кнопке и посмотреть краткий пересказ ролика (выгляит как Оглавления даташита), очень удобно. 

    Из бесплатных и онлайн/синхронных я пока встретил только у ЯБ (т.е. нужно зайти на ютуб из яндекс.браузера).  Вот как это выглядит у ЯБ.  Остальные платные и их нужно видео предварительно скормить и получишь перевод.

     

    image.thumb.png.9e47f60dabdfb00e3fdb3745224b56b5.png

  21. 14 часов назад, Arlleex сказал:

    А теперь да, скажите, что в это дерьмо не нужно погрузиться

    написать дерьмо можно и на си, на %ПОДСТАВЬ_ИМЯ_ЯЗЫКА%. Этот код борланд-стаил. Борланд славится тем, что не придерживается строгому стандарту, а пытается стандарт под себя прогнуть. Даже в народе ходит выражение "Есть язык С++, а есть язык 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 в паблике и  приучаются к этому и потом пишут свой код на с++, без сетеров/гетеров, всё в паблике и не парятся. 

    • Upvote 2
  22. ps вообще не понятно, почему в разделе программирование предлагают решить вопрос заменой железа? Это же ПРОГРАМИРОВАНИЕ, а не проектирование. Кто-то разработал железку, кто-то закупил РЭК, кто-то собрал - Прошли годы.... попало это всё на стол программисту. За частую, железо разработано и собрано ещё до того, как программиста приняли на работу. Начал прогер ваять - столкнулся с проблемой по ПРОГРАММИРОВАНИЮ, не по ТЗ, не по выбору элементной базы, а по программированию. "Как создать тип данных для структуры с переменным размером?", приходит "советчик" и советует учит по мощнее процессор поставить или внешнее ОЗУ на SPI. 🥱

    • Upvote 1
×
×
  • Создать...