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

Arlleex

Свой
  • Постов

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

  • Посещение

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

    16

Arlleex стал победителем дня 17 июня

Arlleex имел наиболее популярный контент!

Репутация

154 Очень хороший

3 Подписчика

Информация о Arlleex

  • Звание
    Гуру
    Гуру

Контакты

  • ICQ
    Array

Посетители профиля

18 327 просмотров профиля
  1. Как бы разрешить такой ambigous #include <stm32f4xx.h> namespace Hardware { enum Pin { RESET, ENABLE }; } int main() { using namespace Hardware; ... = RESET; // ambigous: RESET из enum в <stm32f4xx.h> или из Hardware::Pin? } Ну, я понимаю, что ADL работает так, что using namespace Hardware вкидывает имена из этого неймспейса в ближайшее объемлющее пространство имен. Выглядит, конечно, костыльно. Типа, "визуально" смотрится как директива "смотри в первую очередь в Hardware", а на самом деле все имена из Hardware неявно оказываются в глобальном пространстве, где "случайно" уже имеется такое имя у энумератора в заголовочном файле stm32f4xx.h. Ну да ладно - пусть оно так. Но можно ли именно задекларировать использование Hardware? Постоянно писать Pin::RESET как-то не очень. Декларировать все элементы перечисления - using Pin::RESET и т.д. - тоже не очень. Потому что как минимум это не надежно, если вдруг в Pin окажется не 2 константы, а три-пять десятков, и можно будет прозевать случайно затесавшийся уже определенный где-то в глобальном пространстве символ (то, что он уже есть, и программа скомпилится). Есть ли что-то похожее на using namespace Hardware, такое же в одну строчку, чтобы имена брались только из этого нэймспейса? using Pin как-то не работает.
  2. Я потому и написал про простейшую связь в виде точка-точка, а-ля комп-железка.
  3. Ну коли автору такой мазохизм подходит - то почему нет.
  4. И как вы себе этот ужас представляете? Перешивать железку всякий раз, когда ее надо подключить к другому компу?
  5. MAC назначения знать нужно, поэтому ARP как минимум обязателен. Если хочется схалтурить и слать не юникастом, то можно слать бродкастом, тогда ARP тоже можно выкинуть.
  6. https://ru.wikipedia.org/wiki/ARP https://ru.wikipedia.org/wiki/UDP ICMP не обязательно.
  7. Да хоть МГТФ-ом сверху - работать будет. Не заморачивайтесь.
  8. А разве реализовывать стек протоколов на FPGA - это норма? Максимум что я бы оставил за FPGA-частью, это то, чего не доделал GOWIN в MAC (если такое есть, а оно обязательно найдется). А помимо UDP для сети надо поднимать еще несколько промежуточных протоколов. Изучать можно где угодно - хоть по википедии.
  9. Да, так и будет)) Я просто хотел отразить саму неизбежность в обрастании классов всякими плюсовыми прибамбасами даже в низкоуровневом коде. Потому что, ИМХО, терять все те прелести C++ - равносильно покупке нового авто, а продолжать кататься на старом ведре. Я за подход в стиле "нужно чутка подумать над низкоуровневыми классами, чтобы их поведение было максимально предсказуемым при реализации в разных компиляторах и по занимаемым ресурсам".
  10. Учёба, ребёнок, небоскрёб, ослаблять, да куча их... В русском языке слова можно склеивать, проговаривать без гласных, с разным ударением, с разным положением в предложении, они формировались в разное время и есть множество завимствований из других языков. Так если слова старше нас всех, стоит ли их особым образом фильтровать и запрещать? Мат признается лингвистами как часть языка, он не живет изолированно. ИМХО, на форуме стоило бы только ограничивать его для случаев перехода на личности. В остальном - в умеренном объеме и в подходящем контексте. Как и в жизни.
  11. Свой вопрос решил следующим образом: описал явный конструктор по-умолчанию в классе-наследнике Descriptor() = default. При этом теперь определение любых пользовательских конструкторов другого вида (с параметрами) не отбрасывает POD-овость класса. И самая хорошая новость, это то, что в <type_traits> есть замечательный шаблонный класс std::is_standard_layout и более подходящий мне std::is_pod<>, который я могу использовать в static_assert()! Сейчас все мои наследуемые типы, как и базовый класс - POD. Ура!
  12. Как-то не вяжется) С одной стороны надо упрощать (я читаю как "реализовывать без всяких классов, в Си-стиле"), с другой стороны - прятать в классы и использовать ООП-модель построения программы. Я поясню на примере. Постараюсь совсем простой. Есть плата с микроконтроллером, есть компьютер. Я пишу код для МК, попутно разрабатывая протокол. Чел, который пишет приложение на ПК говорит - "ну ты это, протокол состряпай, а я его поддержу у себя". Окей. Допустим, все мои параметры, которые я отправляю на комп, умещаются в одно u32 слово. Ну не все сразу, а раздельно - как будто union-ом закодированы. Это слово поделено на битовые поля. Одно из полей - обязательное, и находится в одном месте для разных по смыслу объектов u32. Я сразу заготовлю шаблоны всех видов этого самого u32 (что в нем и где хранится). Разумеется, это будут классы. Я прячу u32 внутрь базового класса и конечно же определяю метод извлечения (чтения) типа сообщения MessageID, чтобы как и мне, так и программисту ПК-шной части не делать одинаковую работу по написанию портянки извлечения битовых полей из rawDataFrame enum MessageID { TEMPERATURE, VOLTAGE, CURRENT }; class MessageRaw { public: MessageRaw(MessageID id) : rawDataFrame(/* тут выражение упаковки id в нужное поле по маске ID_MASK*/) {} MessageID getMessageID() { return ... ; // тут каким-то образом извлекаю битовое поле, где хранится MessageID в rawDataFrame } protected: u32 rawDataFrame; enum { ID_MASK = 0xFu }; }; Как видно, базовый класс уже "оброс" вспомогательным методом. Вот "конкретные" классы (на примере одного, который заполняет температуру) template<MessageID> class Message; // фрейм, который кодирует данные о температуре template<> class Message<TEMPERATURE> : public MessageRaw { public: Message(u32 temp) : MessageRaw(TEMPERATURE) { // тут заполняем соответствующее битовое поле TEMPERATURE_MASK значением temp } u32 getTemperature() { return ...; // извлекаем из rawData базового класса битовое поле TEMPERATURE_MASK } private: enum { TEMPERATURE_MASK = 0x00FFFFF0u // младшие 4 бита всегда отведены под MessageID }; }; У классов с MessageID == VOLTAGE или CURRENT битовые поля могут находиться в других местах и, разумеется, пересекаться. Этакий union. Видно, что конкретный Message<TEMPERATURE> уже оброс, как минимум, методом извлечения кодированной температуры (скорее, полезно для программиста ПК-шной части, кому я это хозяйство отправлять буду). Для своей же части (микроконтроллерной) для удобства я еще определяю конструктор, чтобы можно было написать u32 temp = getTemperature(); Message<TEMPERATURE> msg(temp); // прикинь удобно как, в msg уже автоматически (ОДНОЙ СТРОЧКОЙ) записалась температура куда надо Ага. Круто. Еще круто, что при создании msg сначала вызовется конструктор базового класса, который сразу заполнит MessageID! И теперь этим готовым классом могу пользоваться и я, и другой разраб. Но есть одно западло. Как только я во всю эту красосту привнес конструкторы, я потерял POD-овость объектов. А значит реализовать функции приема/передачи в программные очереди (и оттуда в интерфейс) надежно я не могу. Потому что слетает гарантия одинакового представления layout-ов классов у меня и у другого разраба (у меня микроконтроллер и компилятор Clang, у разраба - хрен пойми что, мне возможно даже не очень известное). Вот и приехали.
  13. Я английскую 'e' написал)) Эх, далеко еще ИИ до захвата человечества)
  14. Нет, не сферическая. Задача банальная: я даже никуда не передаю ничего (пока что). Я хочу создать массив из u32 (считай, очередь), которые будут по-разному интерпретироваться в зависимости от битового поля в этом самом u32. В этот u32 я упаковываю различные форматки и снабжаю полем-ключом. Тред-разгрeбатор в рантайме читает очередной u32, читает в нем поле-ключ и определяет как ему интерпретировать остальные биты в этом слове. Я хотел облагородить все это классами, чтобы можно было на уровне API визуально удобно и лаконично работать с объектами. Например, определить конструкторы, чтобы при создании объекта во внутренний этот самый u32 сразу "ложилось" нужное значение без всяких промежуточных вызовов сеттеров. И все - с этого начинаются проблемы: конструктор определил - потерял POD-овость. Ну и опять же. А почему бы не передавать по каналу связи объекты классов? Это ведь очень удобно. Ты написал библиотеку - дал ее человеку и сказал - у себя на компе вставляешь мои исходники и дергаешь у предоставленных классов такие-то такие-то методы. И ему писать ничего не надо - и тебе больший контроль над вашим сопрягаемым кодом.
  15. Может, некий ИИ видит подслово "е*атор" и считает его матерным? Тогда и слово употреблять не должно пропускаться. P.S. Жесть, конечно))
×
×
  • Создать...