Jump to content

    

ViKo

Модераторы
  • Content Count

    9681
  • Joined

  • Last visited

Community Reputation

0 Обычный

1 Follower

About ViKo

  • Rank
    Универсальный солдатик
  • Birthday 08/20/1963

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    : Минск

Recent Profile Visitors

20185 profile views
  1. Нашёл ошибку. Слово "class" в определении функции было лишним. Сколько, однако, мелочей нужно контролировать. Продолжу дальше в Кейле для класса порта.
  2. Вот показываю работающий вариант. #include <iostream> #include <cstdlib> #include <cstdint> #include <cstddef> struct Test_st { char Let; int Num; }; /*_____________________________________________________________________________*/ constexpr Test_st St1 = { 'A', 10 }; constexpr Test_st St2 = { 'B', 11 }; volatile int Temp1 {1}; template <const Test_st &S00, const Test_st &S01> class Test_cl { public: Test_cl() { Temp1 = S00.Let << 8 | S01.Let; } }; /*_____________________________________________________________________________*/ int32_t main(void) { std::cout << Temp1 << '\n'; Test_cl <St1, St2> Ti; std::cout << Temp1 << '\n'; }
  3. Не могу скомпилировать первый набросок. Где-то ошибся, но не пойму, где. Правильно ли я пытаюсь передать в шаблон ссылки на структуры constexpr? Обновил вопрос. Тестовый пример проверяю здесь: https://www.onlinegdb.com/fork/BJA5GHO3N Как передать в конструктор шаблона нетиповой параметр - ссылку? Если конструктор внутри определения класса, тогда компилируется нормально. Как только снаружи - затык. #include <iostream> #include <cstdlib> #include <cstdint> #include <cstddef> struct Test_st { char Let; int Num; }; /*_____________________________________________________________________________*/ constexpr Test_st St1 = { 'A', 10 }; constexpr Test_st St2 = { 'B', 11 }; volatile int Temp1 {1}; template <const Test_st &S00, const Test_st &S01> class Test_cl { public: Test_cl(); }; template <const Test_st &S00, const Test_st &S01> class Test_cl<S00, S01>::Test_cl() { { Temp1 = S00.Let << 8 | S01.Let; } } /*_____________________________________________________________________________*/ int32_t main(void) { std::cout << Temp1 << '\n'; Test_cl <St1, St2> Ti; std::cout << Temp1 << '\n'; }
  4. В этом случае - да. И то, не на 100% обязательно. Можно перекодировать команды и данные под имеющуюся шину. constexpr функцией, например, если не вручную. А если нужно управлять четырьмя выборами устройств, то и совсем не надо. Подать 0x0003 или 0x1080 - одинаково.
  5. Чтение-модификация-запись. Я не планирую переупаковывать биты порта GPIO под ширину "виртуальной шины". Главное - чтобы было можно управлять выбранным набором битов. И, да, я предпочитаю BSRR регистры. Записываю и стираю все биты порта одной командой.
  6. Маску для битов порта. Данные - это аргументы функций порта. Маска битов порта - по их номерам в структуре, описывающей пины порта.
  7. Если работа по маске не выполняется на этапе компиляции, тогда я вручную её создам.
  8. Так вы через bitband биты устанавливаете, по одному. Я, повторюсь, ради удобства использования не желаю терять оптимальность реализации.
  9. Ок, понял (пытаюсь). Читаю это: https://m.habr.com/ru/company/otus/blog/444524/ Тогда это нужно было назвать "лямбда-функтором".
  10. Это именно то, что я спрашивал. Будем смотреть, во что компилируется, а не сколько в нём этажей. Есть мысли сделать класс полного порта и наследственный класс на произвольное количество выводов. В результате должно компилироваться в команды, обращающиеся непосредственно к регистрам GPIO.
  11. Спасибо, Антон! Запись одной ножки пропустили. Вернее, запись есть, а в комментарии написано "чтение", а чтения нет. И я не вижу, как getMask для одного параметра работает. А, это в конце, нашёл. Ага, sizeof... использовали. Вот оно, решение вопроса по теме.
  12. И я укажу. Я свои типы знаю. Не могу передать эти параметры в шаблонные функции. Об этом и спрашивал в стартовом сообщении.
  13. Не-ти-по-вой параметр! http://ci-plus-plus-snachala.ru/?p=3989
  14. Так, да не так, DASM. Я хочу в шаблон класса передать не типы, а значения. Типы я и так знаю. Они не меняются. И вот прибыл в лингвистический тупик.
  15. Соглашусь, что разные. Функтор - это класс с перегруженным operator(), предназначенный для манипулирования объектами контейнера. Не соглашусь, что лямбда-функция - это функтор. Лямбда-выражения в C++ используются именно в виде анонимных функций, без имени, адреса, используемых в месте определения. Насчет порядка функций - это, видимо, из питона и т.п. термин. В учебниках по C/C++/C# не встречал. Да и какой может быть порядок, если вложенные функции невозможны. Кроме этих лямбд. Нисколько не сомневаюсь, что вы продвинутый программист и в теории и на практике. Однако, лямбда-функция означает лямбда в форме функции. Или наоборот. И уж точно не было корректным ваше безоговорочное "не функции вообще".