Это даже не вопрос. warning: division by zero [-Wdiv-by-zero]

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Приветствую всех.

Имею в коде такие строки:

const uint16_t  mass[] = {1000, 9000, 50000};
const uint8_t   mass_count = sizeof(mass)/mass[0];

mass_count используется несколько раз в коде (в циклах) и один раз в таком виде:

index = (index + 1) % mass_count;

Это нужно для перебора элементов массива от 0 до (mass_count - 1) и снова с 0 (mass[index]).

Код компилируется и работает. Но при компиляции выводится предупреждение (как в заголовке):

warning: division by zero [-Wdiv-by-zero]

Я понимаю, что это компилятор беспокоится, чтобы массив не был пустым иначе будет деление на ноль. Но он что - совсем не может увидеть, что массив изначально не пуст и как-минимум один элемент то в нем точно есть (и даже не один)?

Если изменить mass_count на конкретное значение (в данном случае - 3), то сообщение исчезает. Но я не хочу так делать, ведь может быть придется со временем изменять количество элементов массива и я могу просто забыть исправить это значение (mass_count). Да и пусть вообще "оно само считает" (микроконтроллер же!), тем более на этапе компиляции.

Как это можно решить? Или смириться?

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

sizeof(mass)/mass[0];

6 / 1000 это не 3, а 0.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Етить колотить, спасибо! Элементарно же, вот я тупень....

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit, еще раз спасибо!

const uint16_t  mass[] = {1000, 9000, 50000};
const uint8_t   mass_count = sizeof(mass)/sizeof(mass[0]);

Больше warning'а не видать, изгнали )))

rkit
Offline
Зарегистрирован: 23.11.2016
template<class T, size_t N> constexpr size_t count(const T(&)[N]) { return N; }
Serial.println(count(mass));

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А вот это не понял, не дорос ещё ))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit пишет:

template<class T, size_t N> constexpr size_t count(const T(&)[N]) { return N; }
Serial.println(count(mass));

Если не сложно объяснить где почитать (или так, на пальцах), буду благодарен. А сам я ещё не понимаю такое.

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

template - в гугле

constexpr - функция выполняется в момент компиляции

const T(&)[N] - безымянная ссылка на массив размера N