Работа с массивами
- Войдите на сайт для отправки комментариев
Чт, 08/09/2016 - 14:19
Нужна помощь опытных. Читал материал по массивам и все равно ничего не понял. Задача такая:
Необходимо передавать несколько значений по протоколу DMX, каждое из которых нужно по очереди изменять.
Всего адресов 512, значение от 0 до 255.
Функция выглядит так:
DMXSerial.write(adress, value);
Никак не могу понять как правильно организовать массив с возможностью изменения и адреса и значения по текущему адресу. Прошу помощи
Повнятнее можете задачу объяснить? Без протокола DMX но с пояснениями что Вы хотите сделать с числами и адресами?
И в чем проблема?
Одномерный массив из 512 элементов.
В функцию передается номер элемента массива и значение по этому номеру:
DMXSerial.write(k, Massiv(k));
И в чем проблема?
Одномерный массив из 512 элементов.
В функцию передается номер элемента массива и значение по этому номеру:
DMXSerial.write(k, Massiv(k));
Извините, русский не мой родной язык.
Не компилировалось. Написал как вы сказали и заработало :)
А если нужно придать значение 0 всему массиву, то надо так?
Или есть вариант проще?
А если нужно придать значение 0 всему массиву, то надо так?
Или есть вариант проще?
Да. Но в своем примере, вы инициализируете не весь массив. Нулевой элемент не инициализируется. Инициализируются с 1 по 512-й. Если рамерность массива меньше 513, то портите память.
Для массива размерностью 512 байт можно так:
Обратите внимание, функция memset() ничего не знает о типе массива. Ей указывается именно количество байт!
Ситуация такая. Два таких цикла забивают динамическую память на 40%. Почему?
В протоколе DMX нулевой адрес отсутствует
memset это типа constrain для массива?
memset это типа constrain для массива?
Нет, это функция работы с памятью. Ей вообще по фигу, чего адрес ей подсунули: массива, переменной, структуры или еще чего.
Спасибо. Почитаю.
Так почему может возникнуть такой расход памяти?
Если у Вас Arduino UNO, у нее всего 2К памяти. Один массив занимает 0.5К или 25% от всей памяти. Вероятно, еще 15% памяти занимают какие-то другие переменные, вероятно, а подключаемых Вами библиотеках.
Если же у Вас что-то вроде Leonardo, то у него 2.5К памяти и тогда 40% от нее - это 1К. В этом случае, вероятнее всего у Вас либо два байтовых массива, либо Вы по ошибке указали массив целых (int). ВУ последнем случае один такой массив займеи как раз 40% доступной памяти.
Да,но когда я убираю эти два цикла, проблемы с заполнением памяти исчезают, а массив остается
-
Да,но когда я убираю эти два цикла, проблемы с заполнением памяти исчезают, а массив остается
Когда Вы убираете циклы, массивы тоже не остаются - оптимизатор их удаляет.
Так что место в памяти занимают именно массивы, а не циклы. (собственно, циклы при гарвардской архитектуре в принципе не способны занимать место в памяти.)
А если написать progmem в объявлении массива, будет лучше? Закончилась память в контроллере, так как текст очень длинный :(
Это не "лучше", это - "по-другому".
Оперативную память Вы, конечно, разгрузите, но зато потеряете возможность изменять содержимое массивов. Судя по первому посту, это не то, что Вам нужно.