Операции с элементами массива

brunh
Offline
Зарегистрирован: 05.10.2018

Помогите пожалуйста, в tr1 не записывается новое значение.
В мониторе:  

 Rtr1:0 Rdat7:0
  tr1:1  dat7:1
 Rtr1:1 Rdat7:0
  tr1:2  dat7:2
 Rtr1:2 Rdat7:0
 Rtr1:3 Rdat7:0 здесь ожидал tr1=0
 Rtr1:4 Rdat7:0
 Rtr1:5 Rdat7:0

 

  static int tr1= dat[n][7];
        Serial.print (" Rtr1:") ;
        Serial.print (tr1);
        Serial.print (" Rdat7:") ;
        Serial.println (dat[n][7]); 
  if (dat[n][5] == 0 && tr1 < dat[n][2])  //период вкл
       { digitalWrite(portW[dy], HIGH);
         tr1++;
         dat[n][7]=tr1;
        Serial.print ("  tr1:") ;
        Serial.print (tr1);
        Serial.print ("  dat7:") ;
        Serial.println (dat[n][7]);        
         }
  else { digitalWrite(portW[dy], LOW);     
         dat[n][7] = 0;
         dat[n][5] = 1; }

  if (dat[n][5] == 1 && tr1 <dat[n][3]) tr1++;//период выкл
  else { dat[n][7] = 0;
         dat[n][5] = 0;  }
 

 

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

нумерация элементов в массиве ИДЕТ С НУЛЯ!!!

sadman41
Offline
Зарегистрирован: 19.10.2016

int dat[..][8];

brunh
Offline
Зарегистрирован: 05.10.2018

так и написано:  int dat[7][9]
или прямо в loop прописать?
 

brunh
Offline
Зарегистрирован: 05.10.2018

--нумерация элементов в массиве ИДЕТ С НУЛЯ!!!
ок, а как это знание влияет на запись в переменную?

 

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

brunh пишет:

Помогите пожалуйста, в tr1 не записывается новое значение.
В мониторе:  

 Rtr1:0 Rdat7:0
  tr1:1  dat7:1
 Rtr1:1 Rdat7:0
  tr1:2  dat7:2
 Rtr1:2 Rdat7:0
 Rtr1:3 Rdat7:0 здесь ожидал tr1=0

 

а с чего вы это ожидали? - покажите мне строку кода где вы приравниваете tr1 нулю?
brunh
Offline
Зарегистрирован: 05.10.2018

Т.е. пытаюсь сообразить триггер счетчик  с переменными периодами включения -выключения, только значения подставлять из массива.
 

  if (dat[n][5] == 0 && dat[n][7];< dat[n][2])  //период вкл
       { digitalWrite(portW[dy], HIGH);
         dat[n][7]++; }
  else { digitalWrite(portW[dy], LOW);     
         dat[n][7] = 0;
         dat[n][5] = 1; }

  if (dat[n][5] == 1 && dat[n][7]; <dat[n][3]) dat[n][7];++;//период выкл
  else { dat[n][7] = 0;
         dat[n][5] = 0; }

 

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

brunh пишет:

--нумерация элементов в массиве ИДЕТ С НУЛЯ!!!
ок, а как это знание влияет на запись в переменную?

 

вставьте код полностью, а не обрывками. Если весь код слишком велик - удалите все лишнее, но код должен компилироваться, то есть содержать все необходимые функции и описания всех переменных

brunh
Offline
Зарегистрирован: 05.10.2018

b707 пишет:
А с чего вы это ожидали? - покажите мне строку кода где вы приравниваете tr1 нулю?

static int tr1= dat[n][7];  здесь передаю параметр ячейки.

сокращаю скрипт для публикации.

 

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

brunh пишет:

сокращаю скрипт для публикации.

Вам же сказали

b707 пишет:

вставьте код полностью, а не обрывками. Если весь код слишком велик - удалите все лишнее, но код должен компилироваться, то есть содержать все необходимые функции и описания всех переменных

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

Если Вы этого не сделаете, могу Вам точно предсказать что будет дальше. Народ будет тыкать пальцем в небо, Вы будете говорить, что "все не так", народ будет злиться. Вас обзовут дебилом, Вы обзовёте всех мудаками и на этом всё закончится.

Если Вам лень нормально подготовить код для вопроса на форуме, то разбирайтесь со своими проблемами самостоятельно.

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

brunh пишет:

static int tr1= dat[n][7];  здесь передаю параметр ячейки.

попробую угадать - вы думаете. что если один раз написать

static int tr1= dat[n][7]; 

то дальше при любых изменениях dat[n][7]; переменная tr1 будет копировать их значения? - это заблуждение

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

brunh пишет:

Т.е. пытаюсь сообразить триггер счетчик  с переменными периодами включения -выключения, только значения подставлять из массива.
 

  if (dat[n][5] == 0 && dat[n][7];< dat[n][2])  //период вкл
       { digitalWrite(portW[dy], HIGH);
         dat[n][7]++; }
  else { digitalWrite(portW[dy], LOW);     
         dat[n][7] = 0;
         dat[n][5] = 1; }

  if (dat[n][5] == 1 && dat[n][7]; <dat[n][3]) dat[n][7];++;//период выкл
  else { dat[n][7] = 0;
         dat[n][5] = 0; }

 

В строках 1 и 8 - чушь. Думаю, стоит чуть-чуть почитать основы языка С++. Что в этих строках делает оператор ; - как вы думаете?

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

в конце восьмой строчки еще интереснее -

dat[n][7];++;

ТС, вы это  пробовали компилировать перед выкладыванием в форум?

brunh
Offline
Зарегистрирован: 05.10.2018

DIYMan пишет:
В строках 1 и 8 - чушь. Думаю, стоит чуть-чуть почитать основы языка С++. Что в этих строках делает оператор ; - как вы думаете?

редактировал при вставке - извиняюсь, не углядел.
в принципе массив так использовать можно?
 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

brunh пишет:

DIYMan пишет:
В строках 1 и 8 - чушь. Думаю, стоит чуть-чуть почитать основы языка С++. Что в этих строках делает оператор ; - как вы думаете?

редактировал при вставке - извиняюсь, не углядел.
в принципе массив так использовать можно?
 

Давайте вы не будете заниматься редактированием, а выложите код, который, как минимум, компилируется, ок? Только тогда имеет смысл продолжать разговор.

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

brunh пишет:

редактировал при вставке - извиняюсь, не углядел.

НИКОГДА ничего не редактируйте при вставке. Здесь должен быть ТОЧНО (от слова "точно-точно-копипастом") тот код, который исполняется!

Человек, потративший своё время на разбор Вашего кода, а потом узнавший, что это был "другой, отредактированный" код, просто пошлёт Вас найух! До Вас это доходит?

brunh пишет:

в принципе массив так использовать можно?

Если Вам действительно нужна помощь, перечитайте мой пост №9 и сделайте то, что Вам здесь уже трое говорили!

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

b707 пишет:

в конце восьмой строчки еще интереснее -

dat[n][7];++;

Да, действительно, плюсов чё-то маловато - китайцы сэкономили, когда плату клонировали :-(

brunh
Offline
Зарегистрирован: 05.10.2018

const byte portW[6]={8,7,6,5,4,13};       // порты Вода 
const byte portL[6]={14,15,16,17,3,2}; // порты Свет  0.1 -временно последние
 int dat[7][9] = {{0,0,0,0,0,0,0,0,0},  {0,0,4,60,0,0,0,0,0}, 
 {0,0,4,90,0,0,0,0,2},  {14,10,4,240,0,0,0,0,4},  {14,10,4,240,0,0,0,0,6}, 
 {14,10,4,360,0,0,0,0,8}, {14,10,4,360,0,0,0,0,10}}; 
 byte n=0;
unsigned long timer_1;

void setup() { 
  for (byte k = 0; k < 6; k++) {//назначил порты выходами
  pinMode(portW[k], OUTPUT); 
  pinMode(portL[k], OUTPUT);   
  digitalWrite(portL[k], 1);
  digitalWrite(portW[k], 1); } 
   }
void loop() {
  if (millis() - timer_1 >=300) {   
  timer_1 = millis();     
     n++; 
    if (n > 6) n=0; 
    if (n==0)  {// если день 0, то порты на 1
    digitalWrite(portW[n],1);
    digitalWrite(portL[n],1); }
  if (dat[n][5] == 0 && dat[n][7] < dat[n][2])  //период вкл
       { digitalWrite(portW[n], LOW);
         dat[n][7]++;  }
  else { digitalWrite(portW[n], HIGH);     
         dat[n][7] = 0;
         dat[n][5] = 1; }
  if (dat[n][5] == 1 && dat[n][7] <dat[n][3])  dat[n][7]++;//период выкл
  else { dat[n][7] = 0;
         dat[n][5] = 0;  }
} } 

по задумке это 6 независимых триггера с периодами из массива 

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

и в чем теперь вопрос? прошлый был про tr1, а тут, смотрю, все упоминания tr1 пропали

brunh
Offline
Зарегистрирован: 05.10.2018

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

вопрос - можно ли так обрабатывать элементы массива

--то дальше при любых изменениях dat[n][7]; переменная tr1 будет копировать их значения? - это заблуждение

как написать правильно?

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

brunh пишет:

вопрос - можно ли так обрабатывать элементы массива

можно, синтаксических ошибок вроде нет.

А какова логика кода - что-то не очень улавливаю. Что-то не работает? - опишите подробно, как оно работает. как должно работать и чем первое отличается от второго

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

В строчке номер 20 - ошибка, потому что n может стать равной 6, и тогда будет выход за границы массивов в строках 25, 27.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

b707 пишет:

и в чем теперь вопрос? 

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

Так что теперь вопрос остался один: "добавьте сюда мою хотелку". Это, правда, не вопрос, но это неважно.

brunh
Offline
Зарегистрирован: 05.10.2018

код обрезал для читабельности, там еще кнопки, дисплей, еепром, отсчет суток... отсюда логика хромает)) 
на выходе имею реле, нужно чтобы они работали согласно цикла из массива: каждое реле n включится на период dat[n][2] и отключится на период dat[n][3]

 

brunh
Offline
Зарегистрирован: 05.10.2018

DIYMan пишет:

В строчке номер 20 - ошибка, потому что n может стать равной 6, и тогда будет выход за границы массивов в строках 25, 27.

спасибо. 

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

brunh пишет:

на выходе имею реле, нужно чтобы они работали согласно цикла из массива: каждое реле n включится на период dat[n][2] и отключится на период dat[n][3]

вы в логике операторов if запутались

Участок кода между строками 24 и 33 вот так исправьте, должно работать:

if (dat[n][5] == 0 ) {
    if (dat[n][7] < dat[n][2])  //период вкл
       { digitalWrite(portW[n], LOW);
         dat[n][7]++;  }
   else { digitalWrite(portW[n], HIGH);     
         dat[n][7] = 0;
         dat[n][5] = 1; }
}
  if (dat[n][5] == 1 ) {
   if ( dat[n][7] <dat[n][3])  dat[n][7]++;//период выкл
   else { dat[n][7] = 0;
            dat[n][5] = 0;  }
}

 

brunh
Offline
Зарегистрирован: 05.10.2018

b707 -  спасибо!) оно это, оно!  

 

 

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

brunh пишет:

b707 -  спасибо!) оно это, оно!  

оюязательно разберитесь, в чем разница двух кодов

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

brunh пишет:

b707 -  спасибо!) оно это, оно!  

оюязательно разберитесь, в чем разница двух кодов

"Леночка, яйца подействовали..." )))

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

brunh пишет:

как написать правильно?

Для этого сначала нужно по-русски сформулировать, что именно Вы считаете "правильно".