#1 2018-07-24 00:16:16

Vitalik_sce
Учасник
Зареєстрований: 2018-07-24
Повідомлень: 1

проверка if переписывает переменную

Здравствуйте
Когда выполняется функция save_set();  значение переменной alarm встает в 255
Если убрать проверку if  ((alarm != 0) && (set[8] == 1))  тогда работает верно
если ее переделать на if  ((set[8] == 1) && (alarm != 0)) тогда тоже этого глюка нет
В чем проблема?

volatile int set[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
volatile int alarm = 0;
/*
....
*/

void setup() 
{
/*
....
*/
save_set(); 
}//setup

void turnbip_call(int turnbip_num, int turnbip_long, int turnp_cou)
{
  if (!turnb_s)
  {
  turnb_n = turnbip_num;
  turnb_l = turnbip_long;
  turnb_c = ((turnb_l * 2) * turnb_n);
  turnp_c = turnp_cou;
  digitalWrite(turns_pin, LOW);
  
  if  ((alarm != 0) && (set[8] == 1))  {digitalWrite(sirena_pin, LOW); } 
  
  }
}

void save_set()
{
  for (int i = 0; i < 10; i++)
  {set[i] = EEPROM.read(31+i);}
}

void loop () 
{
/*
....
*/
}

Неактивний

#2 2018-07-24 06:56:08

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: проверка if переписывает переменную

Проверь строку 127 .

Остання редакція renoshnik (2018-07-24 09:02:09)

Неактивний

#3 2018-07-24 08:26:40

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: проверка if переписывает переменную

Из еепром считывается больше размера массива.
Руки бы поотрывать за такую писанину.

Неактивний

#4 2018-07-25 09:35:13

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: проверка if переписывает переменную

Если уж у тебя set[9], так и пиши в цикле <9, чего ты <10 вляпал?

Остання редакція Kaka (2018-07-25 09:35:28)

Неактивний

#5 2018-07-25 10:18:22

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: проверка if переписывает переменную

Там не 9 надо, а sizeof(set). Только это офигенно сложно. И не только для чайников.)))

Неактивний

#6 2018-07-25 10:56:04

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: проверка if переписывает переменную

Понятно, что чтение из памяти кривокосячное. Но как оно влияет на переменную alarm о которой спрашивает ТС.

Неактивний

#7 2018-07-25 11:36:32

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: проверка if переписывает переменную

Vitalik_sce пише:

... В чем проблема?

В С нет проверки границ массивов. У вас массив размерности 9 а пишите вы 10 значений. 10-е значение массива попадает на область памяти переменной alarm.

Неактивний

#8 2018-07-25 11:52:51

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: проверка if переписывает переменную

Вячеслав Азаров пише:
Vitalik_sce пише:

... В чем проблема?

В С нет проверки границ массивов. У вас массив размерности 9 а пишите вы 10 значений. 10-е значение массива попадает на область памяти переменной alarm.

" если ее переделать на if  ((set[8] == 1) && (alarm != 0)) тогда тоже этого глюка нет  "  как это объяснить ?

Неактивний

#9 2018-07-25 12:00:23

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: проверка if переписывает переменную

renoshnik пише:
Вячеслав Азаров пише:
Vitalik_sce пише:

... В чем проблема?

В С нет проверки границ массивов. У вас массив размерности 9 а пишите вы 10 значений. 10-е значение массива попадает на область памяти переменной alarm.

" если ее переделать на if  ((set[8] == 1) && (alarm != 0)) тогда тоже этого глюка нет  "  как это объяснить ?

Это так кажется. Он проявится, потом, на другом состоянии данных.

Неактивний

#10 2018-07-25 14:04:12

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: проверка if переписывает переменную

Green пише:

Там не 9 надо, а sizeof(set).

Ну, уж если по гамбургскому, то там надо sizeof(set)/sizeof(set[0])

Неактивний

#11 2018-07-25 14:07:46

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: проверка if переписывает переменную

renoshnik пише:

" если ее переделать на if  ((set[8] == 1) && (alarm != 0)) тогда тоже этого глюка нет  "  как это объяснить ?

Элементарно, Ватсон. ТС не уточнил, но очевидно что глюка нет не всегда, а тогда, когда set[8] == 1 истинно (видимо, при его тесте так и было). Тогда вторая часть условия (после &&) вообще не проверяется. Это т.н. "ленивая логика"

Неактивний

#12 2018-07-25 14:21:51

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: проверка if переписывает переменную

Kaka пише:
Green пише:

Там не 9 надо, а sizeof(set).

Ну, уж если по гамбургскому, то там надо sizeof(set)/sizeof(set[0])

Там вообще каличная EEPROM, которая читает байтами!

Неактивний

#13 2018-07-25 14:40:25

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: проверка if переписывает переменную

Kaka пише:
renoshnik пише:

" если ее переделать на if  ((set[8] == 1) && (alarm != 0)) тогда тоже этого глюка нет  "  как это объяснить ?

Элементарно, Ватсон. ТС не уточнил, но очевидно что глюка нет не всегда, а тогда, когда set[8] == 1 истинно (видимо, при его тесте так и было). Тогда вторая часть условия (после &&) вообще не проверяется. Это т.н. "ленивая логика"

... такую ленность я бы понял при условии ИЛИ но там условие И
Скорее условие set[8] == 1 должно быть ложным тогда лентяйство засчитывается...

Остання редакція renoshnik (2018-07-25 14:42:51)

Неактивний

#14 2018-07-25 19:13:12

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: проверка if переписывает переменную

renoshnik пише:

Скорее условие set[8] == 1 должно быть ложным тогда лентяйство засчитывается...

Да, конечно, больно быстро писал. Но идею-то ты понял - для того и писалось.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму