Поддерживает ли Arduino C++ динамические массивы объектов ?
Мой C++ серьезно устарел, и я работаю над проектом, который будет одновременно манипулировать несколькими синхронизированными действиями, с системой меню для управления интерфейсом и контроля этих синхронизированных действий (мульти- контроллер розетки канала.)
Для управления я планирую иметь массив объектов, которые обслуживаются каждый раз в цикле событий. В настоящее время я использую статический массив объектов C, но мне хотелось бы использовать динамический массив C++, в который я могу добавлять и удалять объекты по мере необходимости.
Я знаю, что некоторые функции стандартной библиотеки C++ не поддерживаются в Arduino. Я думаю, что C++ называет векторы интеллектуальных массивов и считаю, что векторы являются частью стандартной библиотеки, которая не поддерживается/полностью не поддерживается в Arduino. Есть ли какой-нибудь класс динамического массива?
@Duncan C, 👍2
Обсуждение1 ответ
Лучший ответ:
Даже если бы можно было использовать динамические массивы, я бы не рекомендовал это делать, особенно на 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
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Объявление и использование массива структур в Arduino
- Почему структура переменного размера не компилируется в Arduino IDE?
- Получена ошибка недопустимого преобразования из 'const char*' в 'const uint8_t*
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
- Удалить все элементы из массива
- Как я могу присвоить значение массива символов массиву uint8_t?
- Объединить два 8-битных массива в один 16-битный массив
https://github.com/maniacbug/StandardCplusplus, @jose can u c
что за динамический массив? возьмите в качестве статического массива максимум, который вам может/нужно. нет другого процесса, который мог бы использовать память. на простом AVR MCU без параллелизма вы можете точно планировать память, @Juraj