Про прагму ванс слышал, но так как-то привычнее, ну старорежимный я, и спокойнее.
Я использовал
#ifndef A
#define A
//
#endif
ещё в 1985 году, когда только Цэ у нас появился.
Привычка.
А есть ли какая-то синтаксическая конструкция модная типа сишного
struct {
byte flag : 1,
byte pin : 4
}
Вот применительно к enum class бы? Туда же упаковать?
А то 11 байтов много.
— 4 время, никуда не деться, хотя да, можно в 13 бит запихать тк нас только хвост интересует от времени.
— 1 пин.
— 2 словарь.
— 2 статус.
Итого 9. Хмм… Где ещё два байта?
Переписал на enum class input: byte { };
получилось 9 байт.
Хмм… а должно быть 7.
Запушил новый вариант с enum class, мне понравилось.
Я думал про шаблон, да. Я пока не настолько владею плюсами. Я закончил кодить, когда они только появились и были странным глумлением над С.
Мне не нравится, например, что надо конструкторы у нового класса надо писать. Лучше б сгенерить.
CRTP не даст ли доступ к приватным переменным порождённому классу? Это было бы плохо и создаёт потенциальные проблемы.
Я лишь описал очевидный подход. Глубоко не копал. Надеюсь, компилятор меня понял и сунул всё по максимуму на флеш :)
Когда начинаешь считать байты, вся красота сходит и получается голый Си и портянка кода в 50 страниц одним куском.
Например, состояния кнопки, можно впихнуть по две кнопки в байт, а верхнего уровня класс по 8 кнопок на байт (по биту) может держать.
Вся эта объектность явно не экономит память, но позволяет быстро слепить и получить лаконичный понятный код.
В примере с кнопкой, я бы предположил, что компилятор сделает ранее связывание и не будет никаких лишних указателей. Можно проверить сделав sizeof у объекта.
Проверил — размер PressButton ровно на 1 байт больше (byte sw), чем у родительского SmartButton.
Беда начинается, если бы были указатели на объекты.
Как мне видится удобный обработчик клика в соответствии с концепцией Arduino.
В начале создаём объект типа smartbutton. Как-то типа «SmartButton mybutt».
А в loop мы получаем его состояние, и делаем нужные дела, типа «if (mybutt.pressed) {......}»
Это не лучший подход. Особенно для любителей delay(). Прикинь, ты уже три раза нажал на кнопку и отпустил, а выполнение только добралось до твоего if (key.pressed()) через задержки.
Я предлагаю асинхронное выполнение. То есть, клик обрабатывается в том месте, где случился. В МКА в статье, я указал место, где вставлять свой код. В SmartButton нет функции pressed, но есть метод onClick() пустой, виртуальный, и его надо определить унаследовав класс. Как вариант, можно сделать колбеки, функции, что будут вызываться по событиям, но они жрут память тоже тк событий много, на каждое надо указатель и не все нужны.
я посчитал в следующей статье.
такты не считал, конечно :)
Задумался.
class newclass: public baseclass {
using baseclass;
или
newclass() { using baseclass; }
Я использовал
#ifndef A
#define A
//
#endif
ещё в 1985 году, когда только Цэ у нас появился.
Привычка.
Утоптал в 6 байтов в итоге, уже лучше.
Здесь чем проще, тем лучше. Для начинающих.
Отступ, хмм… не так принципиально ведь?
причём 2 забирает слово virtual :( причём один раз и путь лучше в базовом классе.
Если можно обойтись ранним, лучше им.
Надо покурить это на досуге, спасибо.
Вот это:
Вот применительно к enum class бы? Туда же упаковать?
А то 11 байтов много.
— 4 время, никуда не деться, хотя да, можно в 13 бит запихать тк нас только хвост интересует от времени.
— 1 пин.
— 2 словарь.
— 2 статус.
Итого 9. Хмм… Где ещё два байта?
Переписал на enum class input: byte { };
получилось 9 байт.
Хмм… а должно быть 7.
Запушил новый вариант с enum class, мне понравилось.
Мне не нравится, например, что надо конструкторы у нового класса надо писать. Лучше б сгенерить.
CRTP не даст ли доступ к приватным переменным порождённому классу? Это было бы плохо и создаёт потенциальные проблемы.
Когда начинаешь считать байты, вся красота сходит и получается голый Си и портянка кода в 50 страниц одним куском.
Например, состояния кнопки, можно впихнуть по две кнопки в байт, а верхнего уровня класс по 8 кнопок на байт (по биту) может держать.
Вся эта объектность явно не экономит память, но позволяет быстро слепить и получить лаконичный понятный код.
В примере с кнопкой, я бы предположил, что компилятор сделает ранее связывание и не будет никаких лишних указателей. Можно проверить сделав sizeof у объекта.
Проверил — размер PressButton ровно на 1 байт больше (byte sw), чем у родительского SmartButton.
Беда начинается, если бы были указатели на объекты.
Это не лучший подход. Особенно для любителей delay(). Прикинь, ты уже три раза нажал на кнопку и отпустил, а выполнение только добралось до твоего if (key.pressed()) через задержки.
Я предлагаю асинхронное выполнение. То есть, клик обрабатывается в том месте, где случился. В МКА в статье, я указал место, где вставлять свой код. В SmartButton нет функции pressed, но есть метод onClick() пустой, виртуальный, и его надо определить унаследовав класс. Как вариант, можно сделать колбеки, функции, что будут вызываться по событиям, но они жрут память тоже тк событий много, на каждое надо указатель и не все нужны.