РЕДАКТИРОВАТЬ: я ошибочно предположил, что я должен задать это как общий вопрос C ++, и позже понял, что эта проблема возникла из-за моего использования C ++ в среде Arduino. В моем примере я не включил использование модификатора Arduino PROGMEM
в массиве, который переместил свое хранилище из ОЗУ в FLA SH, и это, в конечном счете, стало причиной проблемы вычисления. Для доступа к массиву PROGMEM мне потребовалось использовать метод доступа pgm_read_byte
вместо индекса.
У меня есть массив:
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
У меня есть функционально вычисленный uint8 из библиотеки времени:
uint8_t month = tm.month();
У меня есть size_t:
size_t monthIndex = (size_t)month;
Я пытался использовать month
или monthIndex
для доступа к значению из этого массива, однако тот же результат происходит:
# For size_t monthIndex = 1 or uint8 month = 1; ...
uint8_t currentDaysInMonth = daysInMonth[monthIndex];
# >> Expected = 28;
# >> What I actually get = 61;
Как получить ожидаемое значение массива?
Откуда поступает 61?
РЕДАКТИРОВАТЬ
Это соответствующая часть класса DateTime для tm
class DateTime {
public:
DateTime (uint16_t year, uint8_t month, uint8_t day,
uint8_t hour = 0, uint8_t min = 0, uint8_t sec = 0);
uint8_t month() const { return m; }
}
Конструктор даты и времени
DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
if (year >= 2000)
year -= 2000;
yOff = year;
m = month;
d = day;
hh = hour;
mm = min;
ss = sec;
}
Минимальный пример:
DateTime tm = DateTime(2020, 2, 1, 0, 0, 0);
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
uint8_t month = tm.month();
uint8_t currentDaysInMonth = daysInMonth[month];
>> currentDaysInMonth Returns 61
>> expect 31 from this example, though would offset index - 1 once I figure out what the issue is.
Печать журналов:
std::cout << month << std::endl;
std::cout << tm.month() << std::endl;
std::cout << currentDaysInMonth << std::endl;
# >> 2
# >> 2
# >> 219 -- sometimes its 61, 45, 219, not sure the rhyme or reason to this value