Массивы

vsp
Offline
Зарегистрирован: 21.04.2021

Здравствуйте.

Помогите пожалуйста с массивами.

Есть такая задача, DMX устройство которое управляет группой светильников.

У каждого светильника есть по несколько адресов, что уже создает разные по длине массивы. И существуют «сцены» тоже разной длинны.

В результате должно быть так: Собирается посылка DMX512 из разных устройств, с разной длинной адреса, это не проблема, так как они фиксированы, а вот «сцены» они с разным количеством шагов. В результате должно в порт выдаваться  N сцен по 512 посылок.

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

Здесь в процедуре, я указываю название массива и длину сцен 3180 и длину адресов.

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

 

void runfon1() {

  for (int scene = 0; scene <= 3180 - 1; scene++) {

    for (int ch = 0; ch <= 32 - 1; ch++) {

      byte level = SceneDMXfon5[0][scene][ch][0];

      

      dmxbuffer[ch + 1] = level;

      

      //Serial.print(" "); Serial.print(level);

    }

    copyDMXToOutput();

    //Serial.println();

    delay(45);

    if (fone == 0) {

      DMXparking();

      break;

    }

  }

}

 

uint8_t SceneDMXfon5[1][3180][32][1] = {

  {

    { {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0} },

    { {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {3}, {3}, {21}, {3}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0} },

    { {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {24}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0} },

    { {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0} },

    { {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {25}, {25}, {1}, {1}, {0}, {0}, {25}, {0} },

    { {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {0}, {0}, {25}, {0}, {3}, {3}, {21}, {3}, {0}, {0}, {25}, {0} },

И так 3180 сцен

}

};

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Почитай чонить за "рваные (jagged) массивы", да и захерачь себе такие же. 

rkit
Offline
Зарегистрирован: 23.11.2016

Для каждого типа прибора свой класс со своей логикой.

vsp
Offline
Зарегистрирован: 21.04.2021

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

rkit
Offline
Зарегистрирован: 23.11.2016

Нужно или не нужно - это только тебе известно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Не понимаю, пошто не поставить спицальный DMX контроллер и не купить программу управления с ПК. 

rkit
Offline
Зарегистрирован: 23.11.2016

Готовые DMX контроллеры в своей массе убогие в плане программирования

vsp
Offline
Зарегистрирован: 21.04.2021

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

vsp
Offline
Зарегистрирован: 21.04.2021

rkit пишет:

Готовые DMX контроллеры в своей массе убогие в плане программирования

Точно!

b707
Offline
Зарегистрирован: 26.05.2017

не совсем по теме, просто интересно - на чем вы собрались реализовывать такие массивы:

uint8_t SceneDMXfon5[1][3180][32][1]

для информации - одна эта строчка занимает разом более 100Кбайт оперативки. Для сравнения - в Нано/Уно 2 кбайта. в Меге - 8К. в СТМ32 блюпилл - 20К и даже в ЕСП8266 - чуть более 80К

Куда вы собрались запихивать свои сцены по 100К?

b707
Offline
Зарегистрирован: 26.05.2017

и еще - повнимательнее с циклами. Когда перебираете массивы в Си - помните, что они индексируются с нуля. У вас в обоих циклах for выход за границу

Общее впечатление от темы - новичок, вчера начавший программировать - сразу хватается за профессиональный проект с огромными обьемами данных.

Просто совет - отработайте для начала небольшие наборы. Не 512 DMX устройств, а восемь... и не 3180 сцен, а 32... Ведь приемы работы с массивом arr[100500] ничем не отличаются от barr[16], а шансов накосячить в разы меньше

vsp
Offline
Зарегистрирован: 21.04.2021

b707 пишет:

и еще - повнимательнее с циклами. Когда перебираете массивы в Си - помните, что они индексируются с нуля. У вас в обоих циклах for выход за границу

Общее впечатление от темы - новичок, вчера начавший программировать - сразу хватается за профессиональный проект с огромными обьемами данных.

Просто совет - отработайте для начала небольшие наборы. Не 512 DMX устройств, а восемь... и не 3180 сцен, а 32... Ведь приемы работы с массивом arr[100500] ничем не отличаются от barr[16], а шансов накосячить в разы меньше

Делаю все на esp32, во всех циклах у меня стоят -1, для того, чтобы не выйти за пределы массива.

По поводу того, что большие массивы, да, знаю, но хотел читать их с SD. Сейчас все работает, но для каждой сцены своя подпрограмма.

b707
Offline
Зарегистрирован: 26.05.2017

vsp пишет:

во всех циклах у меня стоят -1, для того, чтобы не выйти за пределы массива.

уверены?

вот ваш код

for (int scene = 0; scene <= 3180 - 1; scene++) {
  for (int ch = 0; ch <= 32 - 1; ch++) {
    byte level = SceneDMXfon5[0][scene][ch][0];
    dmxbuffer[ch + 1] = level;

какой размер у dmxbuffer? случайно не 32?

зачем так? - это ж очень корявый код. Уберите из условия "<=", сделайте просто "<" - и никакие единицы прибавлять и убавлять не надо будет

for (int scene = 0; scene < 3180 ; scene++) {

 

vsp
Offline
Зарегистрирован: 21.04.2021

b707 пишет:

vsp пишет:

во всех циклах у меня стоят -1, для того, чтобы не выйти за пределы массива.

уверены?

вот ваш код

for (int scene = 0; scene <= 3180 - 1; scene++) {
  for (int ch = 0; ch <= 32 - 1; ch++) {
    byte level = SceneDMXfon5[0][scene][ch][0];
    dmxbuffer[ch + 1] = level;

какой размер у dmxbuffer? случайно не 32?

зачем так? - это ж очень корявый код. Уберите из условия "<=", сделайте просто "<" - и никакие единицы прибавлять и убавлять не надо будет

for (int scene = 0; scene < 3180 ; scene++) {

 

Согласен. Спасибо, очень ценное замечание. И теперь моя проблема решена?

b707
Offline
Зарегистрирован: 26.05.2017

vsp пишет:

теперь моя проблема решена?

это уж вам решать.

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

В первом сообщении я такой формулировки не вижу.

vsp
Offline
Зарегистрирован: 21.04.2021

b707 пишет:

vsp пишет:

теперь моя проблема решена?

это уж вам решать.

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

В первом сообщении я такой формулировки не вижу.

Спасибо, большое. Все понял.