Найти в Дзене
За_тех_кто_в_коде();

Групповое создание объектов в С++. Задача **

Не часто приходится использовать указатель на массив указателей. В данной же задаче, это ключевой «персонаж». В разного рода обучающей литературе как-то не доходят до того, когда объекты уже не имеют имени, а обращаться к ним можно лишь по ссылке в массиве. Для области простых программ, которыми являются скетчи для микроконтроллеров, данная задача довольно редкая, поэтому я и решил накидать небольшую памятку, чтобы в последствии не напутать с синтаксисом. А напутать тут есть где, при всем при этом, это будут рабочие, компилируемые программы, причем даже с рабочим результатом, но лишь на некоторое время. Когда же всё это вообще может пригодиться в Ардуино проектах? Когда уже написан какой-то класс, например это графический счетчик, которые принимает в своем методе некоторое число и выводит его на экран, обращаясь в свою очередь к функциям или методам написания текста. Но что если нужно создать часы? То есть создать объект на базе уже существующего объекта. На основе наследования? В

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

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

Когда же всё это вообще может пригодиться в Ардуино проектах? Когда уже написан какой-то класс, например это графический счетчик, которые принимает в своем методе некоторое число и выводит его на экран, обращаясь в свою очередь к функциям или методам написания текста. Но что если нужно создать часы? То есть создать объект на базе уже существующего объекта. На основе наследования? В данном случае не лучший вариант. Наследование хорошо использовать когда нужно расширить поля и/или методы базового класса. А здесь нужно создать два или три счетчика, читай объекта класса, для часов, минут и секунд, сдвинув их по оси Х. Объект класса часов в своем методе будет принимать текущее время, например в формате TIME STAMP и раскидывать по объектам счетчика.

Но в данном случае нам заведомо известно, какое количество объектов будет создано. Поэтому в конструкторе можно создать именованные объекты класса.    И конкретно их же удалить в деструкторе. Тут все просто и понятно.

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

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

Но допустим имеется класс Image для отрисовки изображения, по переданному массиву с изображением. И на основе этих изображений хотелось бы создать анимацию, по типу GIF. Здесь класс Animation_Image будет по таймеру управлять появлением той или иной картинки. Передаваться картинки будут уже через массив указателей, так как заранее не известно, на основании скольких изображений будет строиться анимация. Очевидно, что их будет больше 2х, и это же можно проверять при входе.

Тут и потребуется **массив указателей, который будет в поле класса.

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

В создании объектов ничего особого нет, стандартная схема использования new. А вот с удалением нужно быть внимательным.    Корректно я удалил их далеко не с первого раза. В помощь мне потребовалась даже статья. https://pro-prof.com/forums/topic/arrays_in_cplusplus Правда там в примере действия с массивами, а не объектами класса, но и код и суть абсолютно одинаковая.

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

 Ошибочные способы удаления.
Ошибочные способы удаления.

Тут как раз положительно проявило себя именно относительно небольшое количество ОЗУ в микроконтроллере. Если что-то сделано не правильно или не так, типа выход за пределы массива или как тут, не-до-удаление объектов, то проблема проявится очень скоро. Начнет гадость сыпаться, вперемешку с корректными данными в серийный порт, будут артефакты появляться на экране. Например, удален массив объектов, но не удален массив указателей. Да он небольшой, с десяток байт, но в случае с МК особенно долго ждать не приходится, когда они перекроют рабочие данные.

Для окончательного теста, я решил запустить скетч с относительно небольшим выхлопом в Serial, чтобы проконтролировать что всё в норме. И где-то через час или чуть более Ардуино IDE благополучно падало, тестил 2 раза. Разумеется не из-за прошивки, с кодом все нормально, анимация продолжает работать. Что-то видимо в IDEешке отваливается… Либо в китайских дровах на CH340, которые создают виртуальный COM-порт, через который работает Serial.print, либо уже что-то в самой винде… Поди тут уже разбери.

Видимо что-то, где-то, не-до-удаляется :)