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

Forger

Свой
  • Постов

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

  • Посещение

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

    3

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


  1. 19 minutes ago, tonyk_av said:

    Конечно, можно с самого начала убиваться за каждый бит-байт.

    ну вот и тут коснулись традиционной темы "религии", местные служители "Культа Экономии Драгоценного Бита" скоро прибудут )))

  2. 10 minutes ago, razrab83 said:

    о каком протоколе говорим?

    ни а каком, речь про то, что было изначально в посте - указана только структура кадра, но нет ни слова как определяется его конец в потоке данных

    2 minutes ago, juvf said:

    А вы о каких протоколах говорите?

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

    вопрос был лишь к crc, выше расписал, что к чему повторяться не хочу

  3. 22 minutes ago, razrab83 said:

    Пришел пакет - вот длинна, получи и распишись.

    Во первых - длиНа, во-вторых, как понять что пакет пришел? байт стаффинг с уникальных завершающим символом или межкадровый таймаут?

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

    24 minutes ago, razrab83 said:

    В бинарных протоколах всегда обычно известен размер пакета.

    в изначальном посте не было ни слова про некие "бинарные" протоколы

  4. 7 minutes ago, razrab83 said:

    CRC удобней размещать в конце пакета, даже если пакеты разной длинны.

    известный факт, но это если длина пакета заранее известна, тогда конечно кс можно размещать где угодно

    весь нюанс в том, чтобы понять где именно в пакете эта КС после данных, если заранее не известна длина этого поля данных до того, как они все пришли

     

    11 minutes ago, razrab83 said:

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

    т.е. использовать кучу,

    если это не пугает, то тогда уж проще сразу уходить на std::vector, коли сели на плюсы

  5. 2 hours ago, Arlleex said:

    ИМХО, ужасное решение🙂 Потому что у меня десятки разных управляющих структур бегают, с разным содержимым и длиной. Контрольную сумму логично располагать где-то в одном конкретном месте для всех структур

    так я ж о чем и пишу - ДО начала данных, а не как у вас - в конце

    у меня было всегда примерно в таком порядке: заголовок, код команды, длина поля данных, КС (всего кадра или только данных), сами данные и финальный заголовок (если нужен), как например это сделано в CAN

    можно КС размещать и после данных, но для этого ОБЯЗАТЕЛЬНО нужно в кадре указывать сколько их (поле длины), иначе как понять где искать эту самую КС?

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

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

     

    в особо тяжелых случаях можно использовать составной кадр - управляющая часть со своей КС, это кадр строго фиксированного размера и кадр с данными, там своя КС

    в этом случае в кадре данных действительно достаточно разместить в их начале заголовок, потом данные и потом КС, но даже в таком случае в управляющем кадре все равно есть поле длины кадра с данными

    был у меня такой проект и в нем были команды с кадрами данных и без

     

     

     

     

     

  6. 15 minutes ago, Arlleex said:

    Можно ли в C++ как-то красиво описать структуру с гибким положением последнсего элемента?

    с "гибким"? чтобы менялось в рантайме? так конечно нет, это ж структура ))

    но можно хранить в структуре указатель на массив с данными

    Или остается использовать кучу, а это известно что за собой несет. Если идти с кучей дальше, то есть в конце концов std::vector

     

    можно немного изменить протокол введя ограничение по длине поля данных и добавить поле длины данных (один или два байта)

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

    еще придется переместить поле контрольной суммы ДО начала данных, никто не заставляет хранить ее в самом конце

    так делал, работало прекрасно, да и щас работает )

     

  7. 6 minutes ago, Arlleex said:

    И в чем тогда смысл писать классы/пространства имен/типы с большой буквы?

    Чтобы отделить тип от объекта. Это принципиально разные вещи, т.к. одно никогда не сможет стать другим.

    Например, если тип называется с большой буквы, то точно также может называться его объект:

    TimeMs timeMs = 0;

    Если смешивать, то такие записи будут невозможны.

  8. 6 minutes ago, Arlleex said:

    За это цепляется внимание.

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

    насколько помню, я пошел именно таким путем, и в последствии такие классы стали синглтонами, а как известно синглтон - это известный костыль, который своим существованием говорит, что он временный и не стоит на него сильно опираться ))

  9. 4 minutes ago, Arlleex said:

    Выработался некий приобретенный рефлекс

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

  10. Just now, Arlleex said:

    Например, для того, чтобы ясно представлять, что перед нами глобальная переменная, которая (возможно) вовсе extern из другого модуля. Кидается в глаза, сразу видна в строках, где применяется.

    так зачем это нужно - выделять их из общей массы?

    просто давно не пользовался глобальными обеъектами и как-то подзабыл )

  11. 10 hours ago, Arlleex said:

    Хмм... А как же визуально в коде отличить локальную переменную от глобальной, например?

    А зачем это нужно?

    К слову, у меня вообще нет глобальных объектов, кроме локальных с припиской static. Но и когда были, тоже не делал разницы.

  12. 36 minutes ago, Arlleex said:

    Если нет - как контекстно понимаете, что за идентификатор перед вами - класс/структура/энум/еще что-то?

    А в этом нет нужды - помнить, ибо любая простая переменная когда-то может стать тяжелым классом и впрочем наоборот )

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

     

    • Upvote 1
  13. 31 minutes ago, Arlleex said:

    использовать префиксы:

    а для меня это оказалось весьма пагубной практикой, и в основном от этого как раза довольно жирного (для меня) минуса: 

     

    31 minutes ago, Arlleex said:

    Буковка изменяется и ее приходится менять во всем проекте.

     

    Для себя понял одном самое важное в куче правил - чем их меньше и чем они проще, тем легче потом работать со своим же кодом через какое-то время.

    У меня есть самое главное и простое правило: все типы строго с Большой буквы, а их объекты - с маленькой. Без исключений. Никаких префиксов в типах и именах. Т.е. все как в жизни )

    Впрочем, опять уходим во вкусовщину ))

     

     

     

  14. Если уж наделять структуры такими заумными возможностями, то, что мешает их надели уже неким "функционалом", некими действиями? 😉

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

    Для этого им нужно дать методы передачи своих команд. Например, "дать" во владение некий порт обмена или передать ей метод для работы с тем или иным портом или даже списком портов

    Таким образом рождается некая иерархия команд: есть базовые, а есть те, которые построены на их основе и дают больше возможностей.

    Такие команды должны уметь работать с итераторами (списками), чтобы не "перебирать" их вручную.

    Другой вопрос - насколько это нужно в том или ином проекте. Чем плоха самая обычная структура с безымянным union и т.п? Зачем так усложнять? Ведь должна быть цель, оправдывающая такие усложнения )

     

  15. 43 minutes ago, Arlleex said:

    Это не кодировки такие, это стандарт языка вполне однозначно определяет, что символьные литералы (вот этот самый 'A') имеет тип int, а не char, как в C++.

    вот тебе и обратная совместимость 🤦‍♂️

  16. 1 hour ago, tonyk_av said:

    В С++ стало возможно инициализировать структуры как в С, например?

    ага, типа раньше было нельзя

    давайте уже в конце концов ближе к делу - конкретный пример на С, который в плюсах у вас не компилируется, будем вместе разбираться что к чему, а то ходите все вокруг да около )

     

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