Почему я не могу получить доступ к значению из этого массива, используя функционально вычисленный int как индекс? - PullRequest
0 голосов
/ 09 января 2020

РЕДАКТИРОВАТЬ: я ошибочно предположил, что я должен задать это как общий вопрос 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

1 Ответ

0 голосов
/ 10 января 2020

Я ошибочно предположил, что должен задать этот вопрос как общий вопрос C ++, и позже понял, что эта проблема возникла из-за моего использования C ++ в среде Arduino. В моем примере я не включил использование модификатора Arduino PROGMEM в массиве, который переместил свое хранилище из ОЗУ в FLA SH, и это, в конечном счете, стало причиной проблемы вычисления. Для доступа к массиву PROGMEM мне потребовалось использовать метод доступа pgm_read_byte вместо индекса.

Решение:

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();

# use the pgm_read_byte accessor
uint8_t currentDaysInMonth = pgm_read_byte(&daysInMonth[month - 1]); 

Спасибо всем за помощь! Извините за первоначальный недостаток информации.

Некоторые ресурсы:

https://www.arduino.cc/reference/tr/language/variables/utilities/progmem/

https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html

...