Поддерживает ли Arduino C++ динамические массивы объектов ?

programming array object-oriented vector

Мой C++ серьезно устарел, и я работаю над проектом, который будет одновременно манипулировать несколькими синхронизированными действиями, с системой меню для управления интерфейсом и контроля этих синхронизированных действий (мульти- контроллер розетки канала.)

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

Я знаю, что некоторые функции стандартной библиотеки C++ не поддерживаются в Arduino. Я думаю, что C++ называет векторы интеллектуальных массивов и считаю, что векторы являются частью стандартной библиотеки, которая не поддерживается/полностью не поддерживается в Arduino. Есть ли какой-нибудь класс динамического массива?

, 👍2

Обсуждение

https://github.com/maniacbug/StandardCplusplus, @jose can u c

что за динамический массив? возьмите в качестве статического массива максимум, который вам может/нужно. нет другого процесса, который мог бы использовать память. на простом AVR MCU без параллелизма вы можете точно планировать память, @Juraj


1 ответ


Лучший ответ:

4

Даже если бы можно было использовать динамические массивы, я бы не рекомендовал это делать, особенно на Arduino Uno/Mega с памятью всего 2 или 8 КБ.

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

Чтобы управлять несколькими элементами в этом элементе данных, вы можете:

  • Использование кольцевого буфера — это обычный способ хранения элементов на одной стороне и обработки их на другой (так называемый FIFO, «первым пришел — первым обслужен»).
  • Использование стека (для метода LIFO: последний пришел последним).
  • Для массивов оставьте одну переменную, содержащую количество заполненных в данный момент элементов.
,

Программирование на C старой школы. Конечно, я знаком с этими методами. Я слишком долго работал над устройствами с огромным объемом памяти и большой вычислительной мощностью. Прошло много времени с тех пор, когда мне приходилось писать приложения на 8-битном ассемблере. Сейчас я стал полагаться на конструкции более высокого уровня, встроенные в язык/ОС. Конечно, это корректировка, и странно иметь такой язык, как C++, на микроконтроллере. Вызывает некоторый когнитивный диссонанс., @Duncan C

Простой односвязный список тоже подойдет., @Duncan C

@DuncanC У меня та же проблема ... будучи инженером-программистом, я думаю о списках, (динамических) массивах, стеках, очередях и т. д. Одиночный связанный список также является динамическим. Ситуация усложняется, когда вам нужно вставить элементы в существующий список (а в некоторых случаях удалить)., @Michel Keijzers

«Все усложняется, когда вам нужно вставить элементы в существующий список»? Как же так? Вставлять и удалять элементы со списком кажется проще, а не сложнее. В некотором смысле проще, чем фиксированный массив с пустыми флагами для каждой записи., @Duncan C

@DuncanC В списке это проще, но это динамично, я имею в виду, что внутри массивов легче удалять элементы (используя логический массив, чтобы показать, какие элементы пусты), но добавление новых элементов можно выполнять только в пустых местах ( ранее удаленные элементы массива) или в конце. Список всегда проще, но для каждого элемента нужно выделять место отдельно, поэтому это динамический тип данных., @Michel Keijzers

Собственно, зачем беспокоиться о логическом массиве? Просто используйте NULL для пустых слотов и проверьте NULL, прежде чем действовать над записью в массиве. Затем я могу добавить управление памятью, которое уничтожает объекты по мере их удаления., @Duncan C

@DuncanC Вы правы, я удалю это из ответа., @Michel Keijzers