Работа с массивами

Megawollt
Offline
Зарегистрирован: 06.12.2015

Нужна помощь опытных. Читал материал по массивам и все равно ничего не понял. Задача такая:

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

Всего адресов 512, значение от 0 до 255.

Функция выглядит так: 

DMXSerial.write(adress, value);

Никак не могу понять как правильно организовать массив с возможностью изменения и адреса и значения по текущему адресу. Прошу помощи

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Повнятнее можете задачу объяснить? Без протокола DMX но с пояснениями что Вы хотите сделать с числами и адресами?

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

И в чем проблема?

Одномерный массив из 512 элементов.

В функцию передается номер элемента массива и значение по этому номеру:

DMXSerial.write(k, Massiv(k));

Megawollt
Offline
Зарегистрирован: 06.12.2015

Alex_Sk пишет:

И в чем проблема?

Одномерный массив из 512 элементов.

В функцию передается номер элемента массива и значение по этому номеру:

DMXSerial.write(k, Massiv(k));

Извините, русский не мой родной язык. 

Не компилировалось. Написал как вы сказали и заработало :)

Megawollt
Offline
Зарегистрирован: 06.12.2015

А если нужно придать значение 0 всему массиву, то надо так?

if (BUTTON_01.retention && BUTTON_03.retention) {
for (adress = 1; adress <= 512; adress++) {
value[adress] = 0;
}

Или есть вариант проще?

 

ptr
Offline
Зарегистрирован: 28.05.2016

Megawollt пишет:

А если нужно придать значение 0 всему массиву, то надо так?

if (BUTTON_01.retention && BUTTON_03.retention) {
for (adress = 1; adress <= 512; adress++) {
value[adress] = 0;
}

Или есть вариант проще?

Да. Но в своем примере, вы инициализируете не весь массив. Нулевой элемент не инициализируется. Инициализируются с 1 по 512-й. Если рамерность массива меньше 513, то портите память.

Для массива размерностью 512 байт можно так:

memset(value,0,512);

 

ptr
Offline
Зарегистрирован: 28.05.2016

Обратите внимание, функция memset() ничего не знает о типе массива. Ей указывается именно количество байт!

Megawollt
Offline
Зарегистрирован: 06.12.2015

Ситуация такая. Два таких цикла забивают динамическую память на 40%. Почему?

В протоколе DMX нулевой адрес отсутствует

memset это типа constrain для массива?

ptr
Offline
Зарегистрирован: 28.05.2016

Megawollt пишет:

memset это типа constrain для массива?

Нет, это функция работы с памятью. Ей вообще по фигу, чего адрес ей подсунули: массива, переменной, структуры или еще чего.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо. Почитаю.
Так почему может возникнуть такой расход памяти?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если у Вас Arduino UNO, у нее всего 2К памяти. Один массив занимает 0.5К или 25% от всей памяти. Вероятно, еще 15% памяти занимают какие-то другие переменные, вероятно, а подключаемых Вами библиотеках.

Если же у Вас что-то вроде Leonardo, то у него 2.5К памяти и тогда 40% от нее - это 1К. В этом случае, вероятнее всего у Вас либо два байтовых массива, либо Вы по ошибке указали массив целых (int). ВУ последнем случае один такой массив займеи как раз 40% доступной памяти.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Да,но когда я убираю эти два цикла, проблемы с заполнением памяти исчезают, а массив остается

Megawollt
Offline
Зарегистрирован: 06.12.2015

-

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Megawollt пишет:

Да,но когда я убираю эти два цикла, проблемы с заполнением памяти исчезают, а массив остается

Когда Вы убираете циклы, массивы тоже не остаются - оптимизатор их удаляет.

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

Megawollt
Offline
Зарегистрирован: 06.12.2015

А если написать progmem в объявлении массива, будет лучше? Закончилась память в контроллере, так как текст очень длинный :(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это не "лучше", это - "по-другому".

Оперативную память Вы, конечно, разгрузите, но зато потеряете возможность изменять содержимое массивов. Судя по первому посту, это не то, что Вам нужно.