Ошибка ovf в простом скетче

Theodor
Offline
Зарегистрирован: 30.03.2020

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

Написал скетч, в котором данные каждого из трёх термодатчиков усредняются. Алгоритм простейший, но при работе только первый датчик выдаёт ошибку OVF, а остальные показывают нормально, хотя "показания" у всех одинаковые. Вот код, который я очень упростил для понимания, но какая-то системная ошибка в нём присутствует, и которую я никак не могу отловить. Помогите пожалуйста.

void setup(){                                      
    Serial.begin(9600);                            
    Serial.println("Test MAX6675 and Analog NTC"); 
    delay(500);                                    
}                                                  
                                                     
void loop(){                                         
    int i;
    int n = 5;
    float arr_probe_1[] = {1,2,3,4,5};  //пять показаний датчика #1
    float arr_probe_2[] = {1,2,3,4,5};  //пять показаний датчика #2
    float arr_probe_3[] = {1,2,3,4,5};  //пять показаний датчика #3
    float probe_1;
    float probe_2;
    float probe_3;

    for(i = 0; i < n; i++){
      probe_1 += arr_probe_1[i];  //сумма пяти показаний датчика #1
      probe_2 += arr_probe_2[i];  //сумма пяти показаний датчика #2
      probe_3 += arr_probe_3[i];  //сумма пяти показаний датчика #3
      delay(333);                                  
    }

    probe_1 /= n;  //среднее арифметическое датчика #1
    probe_2 /= n;  //среднее арифметическое датчика #2
    probe_3 /= n;  //среднее арифметическое датчика #3

    Serial.print    ("C1 = "  );
    Serial.print    (probe_1  );    // Выводим температуру в °C
    Serial.print    ("  C2 = ");
    Serial.print    (probe_2  );    // Выводим температуру в °C
    Serial.print    ("  C3 = ");
    Serial.println  (probe_3  );    // Выводим температуру в °C

}                                                    

 

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

Почему probe_N не инициализирована?

-NMi-
Offline
Зарегистрирован: 20.08.2018
    float probe_1=0;

    float probe_2=0;
    float probe_3=0;

	

 

Theodor
Offline
Зарегистрирован: 30.03.2020

sadman41 пишет:
Почему probe_N не инициализирована?

а разве в строках 14-16 не происходит инициализация всех трёх переменных?

Theodor
Offline
Зарегистрирован: 30.03.2020

-NMi- пишет:

    float probe_1=0;

    float probe_2=0;
    float probe_3=0;

	

 

Спасибо, заработало!

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

Объявление происходит, инициализация - нет.

Theodor
Offline
Зарегистрирован: 30.03.2020

sadman41 пишет:
Объявление происходит, инициализация - нет.

Странно, тогда почему другие датчики отрабатывались нормально? Удалял строку с первым - ovf показывал второй...

-NMi-
Offline
Зарегистрирован: 20.08.2018

Это как срать в 4 горшка по очереди. Вот первый и переполнился. А если срать во второй - второй переполнится быстрее всех! Ну неужели непонятно.

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

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

Theodor
Offline
Зарегистрирован: 30.03.2020

sadman41 пишет:
Проделки компилятора и оптимизатора. А вообще - предупреждения коричневым цветом читать надо, тогда и башку ломать не придется.

А ведь никаких предупреждений не было. Всё чисто и красиво...

Theodor
Offline
Зарегистрирован: 30.03.2020

-NMi- пишет:

Это как срать в 4 горшка по очереди. Вот первый и переполнился. А если срать во второй - второй переполнится быстрее всех! Ну неужели непонятно.

Честно признаться, совсем не понятно. Любой цикл - раскладывание чего-то по местам... Я проверял в исходной программе содержимое ВСЕХ промежуточных переменных и там было всё в порядке. И только на последнем этапе деления суммы , т.е. получения среднего, получалась эта ошибка. В некоторых С-образных языках объявление переменной подразумевает её первоначальное обнуление, если не указано иное. Я с этим раньше встречался.

В любом случае, спасибо за подсказку. Думаю, можно закрывать тему.

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

Theodor пишет:

sadman41 пишет:
Проделки компилятора и оптимизатора. А вообще - предупреждения коричневым цветом читать надо, тогда и башку ломать не придется.

А ведь никаких предупреждений не было. Всё чисто и красиво...

Потому что они "заботливо" отключены авторами Arduino IDE в настройках. Зайдите в настройки, и выставьте там "Сообщения компилятора -> все", тогда предупреждения будут тёмно-красным цветом выводиться.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Theodor пишет:

-NMi- пишет:

Это как срать в 4 горшка по очереди. Вот первый и переполнился. А если срать во второй - второй переполнится быстрее всех! Ну неужели непонятно.

Честно признаться, совсем не понятно. Любой цикл - раскладывание чего-то по местам... Я проверял в исходной программе содержимое ВСЕХ промежуточных переменных и там было всё в порядке. И только на последнем этапе деления суммы , т.е. получения среднего, получалась эта ошибка. В некоторых С-образных языках объявление переменной подразумевает её первоначальное обнуление, если не указано иное. Я с этим раньше встречался.

В любом случае, спасибо за подсказку. Думаю, можно закрывать тему.

Базаришь! Но, всё-таки, признайся - перед тем как сесть на горшок ты же смотришь на его состояние (true/false)  правильно???  Вот и здесь нужно смотреть в ОБА за переменными, шоП патом небыло таких вопросов.

Theodor
Offline
Зарегистрирован: 30.03.2020

DIYMan пишет:

Theodor пишет:

sadman41 пишет:
Проделки компилятора и оптимизатора. А вообще - предупреждения коричневым цветом читать надо, тогда и башку ломать не придется.

А ведь никаких предупреждений не было. Всё чисто и красиво...

Потому что они "заботливо" отключены авторами Arduino IDE в настройках. Зайдите в настройки, и выставьте там "Сообщения компилятора -> все", тогда предупреждения будут тёмно-красным цветом выводиться.

Ха!.. А ведь действительно всё отключено! Действительно выскочили абсолютно понятные предупреждения!!!

Опять же, большое спасибо за ценное замечание!